所有版本的Linux源代码压缩包都可以在https://github.com/torvalds/linux/下载。本文档使用的Linux源码为linux-2.6.39(网盘:http://pan.baidu.com/s/1dDxjNl3)。
1. 解压源码
解压源码到工作目录,这里使用的是p7zip工具中的7za命令,使用unzip命令会提示“File name too long”错误。
# 进入工作目录
# 7za x /media/sf_ShareDIR/MICRO2440/source/linux-2.6.39.zip
# cd ./linux-2.6.39
2. Linux内核编译
在Linux 2.6.39中的内核树中,已经支持mini2440开发板,micro2440是mini2440的升级版本,所以很多配置都可以兼容,因此可选用mini2440开发板的配置。
a) 修改Makefile(红色字为修改或添加部分)
# vim Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
b) 生成mini2440开发板配置
# make mrproper
# make mini2440_defconfig
c) 编译内核
# make uImage
d) 通过U-BOOT(NOR)下载内核到RAM中运行
可通过在“移植U-BOOT-2.14.07至MICRO2440开发板.doc”一文中制作的NOR U-BOOT将内核下载到RAM中运行。
# tftp 0x30008000 /MICRO2440/uImage
# bootm
为了方便调试,可以设置U-BOOT的启动命令为通过TFTP下载内核引导。
# setenv bootcmd 'tftp 0x30008000 /MICRO2440/uImage;bootm'
如上图所示,内核可以正常启动,但卡在“Uncompressing Linux... done, booting the kernel.”,这通常是因为没有设置启动参数(没有设设置console=)或U-BOOT与内核的机器码不一致导致的。经测试在U-BOOT中设置了启动参数(bootargs)后,可正常启动。可能2.6.39有个BUG,这里我没有设置任何机器码,都是使用默认的,U-BOOT中使用的是193(arch/arm/include/asm/mach-types.h),LINUX中使用的是1999(arch/arm/tools/mach-types),机器码不一致,还能启动。经测试,其它版本的LINUX是不能启动的,必须机器码一致才可以启动。