linux-2.6.32.2内核在mini2440上的移植,Linux2.6.32.2移植到Mini2440

1.移植内核的准备工作

(1)使用的环境

操作系统:Fedora 10

交叉编译工具使用:arm-linux-gcc-4.3.2

(2)获取内核

有很多方式可以获取 Linux 内核源代码,如果你的 Fedora10 平台可以上互联网,可以直

接在命令行输入以下命令获取到最原汁原味的 Linux-2.6.32.2:

#wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz

当然你也可以先在 Windows 系统下使用迅雷等工具下载完,再复制到 Fedora10 中。

(3)交叉编译工具

交叉编译工具使用友善之臂的arm-linux-gcc-4.3.2,他们提供的编译器是符合EABI标准的编译器。其中关于EABI的介绍可以参看下面:

1。什么是ABI

ABI,application binary interface (ABI),应用程序二进制接口。

既然是 接口,那就是某两种东西之间的沟通桥梁,此处有这些种情况:

A。应用程序 操作系统;

B。应用程序 (应用程序所用到的)库

C 。应用程序各个组件之间

类似于API的作用是使得程序的代码间的兼容,ABI目的是使得程序的二进制(级别)的兼容。

2。什么是OABI 和 EABI

OABI中的O,表示“Old”,“Lagacy”,旧的,过时的,OABI就是旧的/老的ABI。

EABI中的E,表示“Embedded”,是一种新的ABI。

EABI有时候也叫做GNU EABI。

OABI和EABI都是专门针对ARM的CPU来说的。

3。EABI的好处 / 为何要用EABI

A。支持软件浮点和硬件实现浮点功能混用

B。系统调用的效率更高

C。后今后的工具更兼容

D。软件浮点的情况下,EABI的软件浮点的效率要比OABI高很多。

4。OABI和EABI的区别

两种ABI在如下方面有区别:

A。调用规则(包括参数如何传递及如何获得返回值)

B。系统调用的数目以及应用程序应该如何去做系统调用

C。目标文件的二进制格式,程序库等

D。结构体中的 填充(padding/packing)和对齐。

E。

OABI:

* ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa

* gcc -dumpmachine: arm-unknown-linux

* objdump -x for compiled binary:private flags = 2: [APCS-32] [FPA float format] [has entry point]

* "file" on compiled Debian binary:

ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped

* "readelf -h | grep Flags""

Flags: 0x0

EABI:

* ABI flags passed by gcc to binutils: -mabi=aapcs-linux -mfloat-abi=soft -meabi=4

* gcc -dumpmachine: arm-unknown-linux-gnueabi

* objdump -x for compiled binary:

private flags = 4000002: [Version4 EABI] [has entry point]

* "file" on compiled binary (under Debian):

ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), for GNU/Linux 2.4.17, stripped

* "readelf -h | grep Flags""

Flags: 0x4000002, has entry point, Version4 EABI

(4)硬件平台

友善之臂的Mini2440,NandFlash64M,NorFlash2M的。NandFlash容量的不同,在后边制作根文件系统的时候会有所不同。

2.修改内核以适应本开发板

(1)假设我们把内核文件下载到了opt/mini2440/目录下,进行解压操作。

#cd opt/mini2440

#tar -zxvf linux-2.6.32.2.tar.gz

得到Linux-2.6.33.3文件夹

(2)修改Makefile文件

首先,我们要使Linux的默认的平台是arm平台,进入Linux-2.6.32.2文件夹中,修改此目录下的Makefile文件。修改成下面的代码,使其平台是ARM平台,交叉编译是arm-linux-

export KBUILD_BUILDHOST := $(SUBARCH)

ARCH ?= arm //使用的目标平台

CROSS_COMPILE ?= arm-linux- //使用的交叉编译器,这里使用的系统默认的

接下来,测试一下Linux内核是否可以顺利的编译通过。

#make s3c2410_defconfig //使用缺省的配置文件,也就是SMDK2440的缺省配置文件

# make //编译时间大约在20分钟左右

(3)关于机器码

很关键的一点是,在启动内核时,是根据bootloader传入的机器码(MACH_TYPE),来决定应启动哪种目标平台,在这一版本中,友善之臂申请了字节的机器码1999,在文件opt/mini2440/linux-2.6.32.2/arch/arm/tools/mach-types中。

exeda MACH_EXEDA EXEDA 1994

mx31sf005 MACH_MX31SF005 MX31SF005 1995

f5d8231_4_v2 MACH_F5D8231_4_V2 F5D8231_4_V2 1996

q2440 MACH_Q2440 Q2440 1997

qq2440 MACH_QQ2440 QQ2440 1998

mini2440 MACH_MINI2440 MINI2440 1999//机器码

colibri300 MACH_COLIBRI300 COLIBRI300 2000

jades MACH_JADES JADES 2001

spark MACH_SPARK SPARK 2002

如果传入的机器码和目标板的机器码不同时,经常出现下面的错误:

Uncompressing Linux.................................................................................................................................. done, booting

the kernel.

运行到这就停止了。

在U-Boot2010.03版本中也加入了mini2440机器码,在下面的文件中u-boot-2010.03/include/asm-arm/mach-typs.h,大约在1985行。

#define MACH_TYPE_ARMATA 1993

#define MACH_TYPE_EXEDA 1994

#define MACH_TYPE_MX31SF005 1995

#define MACH_TYPE_F5D8231_4_V2 1996

#define MACH_TYPE_Q2440 1997

#define MACH_TYPE_QQ2440 1998

#define MACH_TYPE_MINI2440 1999

#define MACH_TYPE_COLIBRI300 2000

#define MACH_TYPE_JADES 2001

#define MACH_TYPE_SPARK 2002

在/opt/mini2440/linux-2.6.32.2/arch/arm/mach-s3c2440目录下有一个mach-mini2440.c这个就是该版本自带的一个mini2440的文件。不过我们不使用它,直接将其删除。

将/opt/mini2440/linux-2.6.32.2/arch/arm/mach-s3c2440目录下的mach-smdk2440.c复制一份,命名为mach-mini2440.c文件,因为,Mini2440和smdk2440的结构最为相似,上面的外围的电路也很相似,所以在其基础上进行修改移植。打开刚刚改名的mach-mini2440.c,找到MACHINE_START(S3C2440, "SMDK2440")

修改为下面的内容

MACHINE_START(MINI2440, "FriendlyARM MINI2440 development board")

(4)修改时钟源

在mach-mini2440.c的第160行static void __init smdk2440_map_io(void)函数中,把其中的16934400(代表原SMDK2440目标板上的晶振是 16.9344MHz)改为mini2440开发板上实际使用的12000000(代表 mini2440 开发板上的晶振12MHz,元器件标号为X2)

static void __init mini2440_map_io(void)

{

s3c24xx_init_io(mini2440_iodesc, ARRAY_SIZE(mini2440_iodesc));

s3c24xx_init_clocks(12000000); //修改为 12000000

s3c24xx_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs));

}

用gedit打开刚才复制得到的mach-mini2440.c文件,原来是smdk2440,所以将该文件中的所有的smdk2440替换成mini2440。

除此之外,还要在mini2440_machine_init(void)函数中,把smdk_machine_init()函数调用注释掉,因为我们后面会编写自己的初始化函数,不需要调用smdk2440原来的。

static void __init mini2440_machine_init(void)

{

s3c24xx_fb_set_platdata(&mini2440_fb_info);

s3c_i2c0_set_platdata(NULL);

s3c_device_nand.dev.platform_data = &mini2440_nand_info; //添加没在官网提供的linux移植手册上看到有加这一句,刚开始没加编译正确,但是最后无法读出内核分区。

platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));

//smdk_machine_init();

}

编译测试,

#make mini2440_defconfig //使用mini2440官方自带的配置文件

#make zImage //编译内核,时间较长,最后会生成 zImage

重新编译并把生成的内核文件 zImage(位于 arch/arm/boot 目录)下到板子中,可以看

到内核已经可以正常启动了,如下图,但此时大部分硬件驱动还没加,并且也没有文件系统,

因此还无法登陆。0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SliceProceduralMesh的使用

1. 构建一个actor,里面添加一个被切割的static mesh,比如一个立方体,再添加一个proceduralmesh。 然后在构造函数里面添加下面代码,将static mesh拷贝到proceduralmesh里。 另外将static mesh的hidden in game属性加上&#xff0c…

asp.net读取xml方法

这个适合刚学asp.net的同学,大神直接略过好了,asp.net经常会有很多用到XML的地方,比如全国省市的联动,以及一些菜单读取等等都有xml的影子,直接贴代码,以便我以后用到的时候忘了,注释我写得很清…

linux parallel 命令,Linux 并行处理神器 GNU Parallel 简明教程

Bash命令通常单线程运行,这意味着所有的处理工作只在单个 CPU 上执行。随着 CPU 规模的扩大以及核心数目的增加,这意味着只有一小部分的 CPU 资源用于处理任务,这样就造成了很大的资源浪费。 这种情况在进行多媒体转换(比如:图片和…

Sublime Text 2 VS Vim

说说我的开发工具Sublime Text 2和对Vim的研究 设置Sublime为VIM模式 Sublime Text 2 入门及技巧 sublime text2 使用技巧心得总结转载于:https://www.cnblogs.com/pengyou8696/p/3937089.html

Air Data System

总压 静压 动压 静压 飞机静止不动的气压 动压 飞机运动时气流对飞机产生的压力 空速管测量出来的速度并非是飞机真正相对于地面的速度,而只是相对于大气的速度,所以称为空速。如果有风,飞机相对地面的速度(称地速)还应加上风速(顺风飞…

linux 脚本 试题,10个Linux脚本面试题,看看你能答出几个?

1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现;declare -a shelldeclare sum_login0declare sum_nologin0shell($(cat /etc/passwd…

鼠标

1. 在UE4窗口中显示或隐藏鼠标2. 默认状态下,鼠标移动会转动摄像机,调用下面这个函数后,只有鼠标左键按下并移动才可以移动摄像机, 这样就可以对UMG这样的菜单进行控制

Linux伪终端怎么退出,什么是linux里的终端和伪终端

1)、首先明确:控制终端(/dev/tty) 这是个在应用程序中的一个概念,前台进程有个控制终端,就对应这个。不过它并不指任何物理意义上的终端,其实/dev/tty会映射到当前的设备(通过tty命令可以看到),比如你如果在控制台界面…

UMG

1. 2D UMG2. 3D UMG 新建一个Actor,添加一个widget组件进去,设置其widget class即可3. pawn和3D UMG的交互 在pawn里面加一个widgetinteraction组件,设置交互距离和形态,然后使用press pointer key就可以给3DUMG设置鼠标 点击事件…

免费开通二级域名的论坛

支持绑定域名 支持挂广告 后台管理 官网:http://www.howbbs.com/转载于:https://www.cnblogs.com/lieyan/p/3940463.html

linux 内核 企鹅,Linux 内核 Makefile 体系简单分析

众所周知,Linux内核是使用make命令来配置并编译的,那必然少不了Makefile。在内核目录树中我们可以看到内核编译系统的顶层Makefile文件。但是如此复杂、庞大的内核源码绝不可能使用一个或几个Makefile文件来完成配置编译,而是需要一套同样复杂…

UWidgetBlueprintLibrary

使用UWidgetBlueprintLibrary类的绘制函数,可以在UMG里绘制二维图像。 做成静态函数后就可以在蓝图中直接调用 void AAGraphics::DrawLine(FPaintContext Context, FVector2D PositionA, FVector2D PositionB, FLinearColor Tint, bool bAntiAlias) {UWidgetBluepri…

UDP模式与TCP模式的区别

1、TCP有连接状态,而UDP没有。 2、TCP应用层使用无需考虑包的大小及发送情况,而UDP需要。 3、TCP中IP包大小的决定者是Socket,而UDP为应用层。转载于:https://www.cnblogs.com/xinxinboke/p/3944619.html

UProceduralMeshComponent

使用UProceduralMeshComponent可以自由的用三角星来绘制三维图形 1. 在actor的构造函数中添加UProceduralMeshComponent组件 mesh CreateDefaultSubobject<UProceduralMeshComponent>(TEXT("mesh")); Material LoadObject<UMaterial>(NULL, TEXT("…

[LeetCode] Search for a Range [34]

题目 Given a sorted array of integers, find the starting and ending position of a given target value. Your algorithms runtime complexity must be in the order of O(log n). If the target is not found in the array, return [-1, -1]. For example, Given [5, 7, 7…

linux ssh注册码,linux ssh -l 命令运用

ssh是远程登录命令&#xff0c;-l选项是最常用的选项&#xff0c;下面是我的一些总结远程登录&#xff1a;ssh -l userName ip# 远程登录到 10.175.23.9ssh -l root2 10.175.23.9执行远程命令(不登录)&#xff1a;ssh -l userName ip command# 不远程登录到 10.175.23.9…

【OpenGL】向Shader中传递数据

传递顶点属性信息之前讲过&#xff0c;vertex shader会被每个顶点调用&#xff0c;通常一个顶点会包含很多信息&#xff0c;例如顶点坐标、顶点法向量、纹理坐标等等&#xff0c;我们称这些信息为顶点的属性。在之前的OpenGL版本里&#xff0c;每个属性都对应了一个特定的通道&…

常用正则表达式大全

匹配中文字符的正则表达式&#xff1a; [u4e00-u9fa5]   评注&#xff1a;匹配中文还真是个头疼的事&#xff0c;有了这个表达式就好办了   匹配双字节字符(包括汉字在内)&#xff1a;[^x00-xff]   评注&#xff1a;可以用来计算字符串的长度&#xff08;一个双字节字符…

linux+qt+定时精度,Qt QTimer测试定时精度

调试信息输出窗口可以查看超时误差dialog.h文件#ifndef DIALOG_H#define DIALOG_H#include #include namespace Ui {class Dialog;}class QTimer;class Dialog : public QDialog{Q_OBJECTpublic:explicit Dialog(QWidget *parent 0);~Dialog();public slots:void slotOneSec()…

初始JavaScript详解【精选】

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍初始JavaScript以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可以在评论区留言 目录 ⭐…