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 目录)下到板子中,可以看

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

因此还无法登陆。

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

  1. linux在开发板LCD上显,W35型LCD驱动移植 - linux-2.6.32在mini2440开发板上移植_Linux编程_Linux公社-Linux系统门户网站...

    编者注:本移植主要步骤还是按照手册来,里面讲解了一些有用的基础知识.但书册上提供了集中屏幕的方案,我们这里主要就用一种,也就是开发板自带的W35型号.液晶驱动的源程序在src/drivers/vide ...

  2. mini2440 linux移植开发实战指南,Linux-2.6.32.2内核在mini2440上的移植---移植SD卡驱动...

    移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容) 1,主机环境:VMare下CentOS 5.5 ,1G内存. 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linu ...

  3. Linux-2.6.32.2内核在mini2440上的移植(四)---根文件系统制作(1)

    移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容) 1,主机环境:VMare下CentOS 5.5 ,1G内存. 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linu ...

  4. AIX 64位内核与32位内核区别

    Q:怎么确定机器会运行 64 位内核?  A:运行 64 位内核要求 64 位硬件.对于 AIX 5.2,所有 IBM eServer pSeries 64 位硬件都能运行 64 位或 32 位内核. ...

  5. linux内核添加usb键盘驱动,配置USB外设 - linux-2.6.32在mini2440开发板上移植_Linux编程_Linux公社-Linux系统门户网站...

    linux-2.6.32在mini2440开发板上移植 配置USB外设 [日期:2013-04-08] 来源:Linux社区 作者:ssdsafsdsd [字体:大 中 小] 编者:因为LINUX内核 ...

  6. linux 内核配置lcd,Linux-2.6.32.2内核在mini2440上的移植---添加LCD背光驱动

    移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容) 1,主机环境:VMare下CentOS 5.5 ,1G内存. 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linu ...

  7. linux内核(二)内核移植(DM365-DM368开发攻略——linux-2.6.32的移植)

    一.介绍linux-2.6.32: Linux-2.6.32的网上介绍:增添了虚拟化内存 de-duplicacion.重写了 writeback 代码.改进了 Btrfs 文件系统.添加了 ATI ...

  8. Linux的I2C 设备驱动 -- mini2440 上i2c接口触摸屏驱动

    本篇记录在友善之臂 mini2440 平台上挂载I2C接口触摸屏的驱动开发过程. 内核版本linux-2.6.32.2, 平台是ARM9 S3C2440+I2C接口的触摸屏 如上篇 Linux的I2C ...

  9. linux-2.6.32在mini2440开发板上移植(16)之LED 驱动程序移植

    LED 驱动程序移植 编者:对于led的驱动程序,很多文章都有详细的介绍,我的博客里面有一篇专门详解这个的.需要看的,可以找下.led灯的驱动其实就代表了I/O口的驱动.在linux系统下,操作一个I ...

最新文章

  1. python在windows和linux_python在windows和linux下获得本机本地ip地址方法小结
  2. 提高生产力:文件和IO操作(ApacheCommonsIO-汉化分享)
  3. OCP12C题库,62数据库备份与恢复(admin,install and upgrade accelerated, backup and recovery workshop -62)(新增)
  4. 使用NoSQL实现实体服务–第2部分:合同优先
  5. 前端学习(310):清除浮动的方法
  6. 【Android开发】NDK开发(1)-Hello World!
  7. 实现有意识自主学习的智能程序(1)
  8. unity 镜面反射_Unity | Diffuse Light漫反射光照
  9. 江苏技术师范学院大学机房管理系统[.NET项目]
  10. php+mysql+记账系统_做了个php+mysql简单记账系统
  11. R及RStudio下载安装教程(超详细)
  12. 花几千块钱,线上培训软件测试有用吗?
  13. ECCV 2022 | 悉尼大学提出:绝对尺度感知,鲁棒,以及可泛化的自监督单目深度估计网络DynaDepth
  14. 怎么避免论文查重率过高的情况?
  15. 重复博弈reapted games
  16. python最佳编程语言_前十大编程语言你会几种?
  17. iTOP-4412开发板-串口转接小板的使用文档
  18. 一篇入门物联网大数据:TDengine时序数据库
  19. linux修改网卡配置pppoe,CentOS7配置PPPOE拨号详解
  20. 中国移动IMS手机客户端初体验

热门文章

  1. php中二进制函数,PHP-----函数和二进制
  2. cmd oracle 连接实例_C#连接Oracle数据库的实例方法
  3. sqlserver note
  4. 【Mail】telnet收发邮件过程
  5. 移植uboot之修改代码支持NorFlash记录续集二
  6. Java Servlet 过滤器与 springmvc 拦截器的区别?
  7. 支付宝app支付java后台流程、原理分析(含nei wang chuan tou)
  8. BZOJ 1878 HH的项链 | 主席树
  9. 获取当前日期时间并格式化 - 常见格式
  10. WebStorm 预览时把浏览器地址localhost 改成IP