在上篇中记录了一下u-boot的修改、移植。现在记录一下Linux内核移植和根文件系统的启动。
1、内核的修改
第一步,下载Linux内核(www.kernel.org)压缩包,我选择了linux-3.0。
1.1配置内核编译参数
修改Makefile文件,修改交叉编译器环境变量和选择开发平台类型:
[tangbin@localhost linux-3.0bk]$ vim Makefile
修改如下:
mkimage是在制作镜像文件时候, 在原来的image文件前增加一个0x40字节长度的头。
注:内核编译之后会生成两个文件。一个Image,一个Zimage。image为内核映像文件,而Zimage为内核映像压缩文件。Image大约为4M,而Zimage不到2M。
1.2修改晶振频率
Fl2440开发板的晶振频率为12M,接下来修改晶振频率:
[tangbin@localhost linux-3.0bk]$ vim arch/arm/mach-s3c2440/mach-smdk2440.c
修改如下:
1.3修改串口驱动
[tangbin@localhost linux-3.0bk]$ vim drivers/tty/serial/samsung.c
之后将mini2440的.config拷贝过来,作为默认的.config文件。
cp arch/arm/configs/mini2440_defconfig .config
接着执行make menuconfig选择编译选项。
注:make menuconfig时出来的文本窗口中的信息是通过读取在内核源代码目录下的Kconfig文件来配置的。根据Makefile文件来编译,而Makefile文件中的变量则通过.config来进行赋值操作。仅仅在Kconfig中添加选项。
选择System Type —>
选择如图:
1.4修改MACHINE ID设备编号
将mini2440和和s3c2440的machineID对调。
vim arch/arm/tools/mach-types
将mini2440原来的1999改成362,s3c2440的362改成1999。
之后就可以执行make编译。
此时已经会生成一个linux-s3c2440.bin的可执行二进制文件,这就是我们将要烧录到开发板的文件。
1.5nand flash分区
执行命令:
vim arch/arm/plat-s3c24xx/common-smdk.c
注:各个分区大小可以根据实际情况来分。
2、内核添加根文件系统支持
2.1根文件系统支持
以initramfs文件系统作为根文件系统,它能伴随内核编译时同时与内核生成一个镜像而能与之一起启动。
选择General setup
找到:
Initramfs source file(s)里选择你所制作的根文件树所在目录。
Save保存后,执行make编译内核,将产生的linuxrom-s3c2440.bin烧录到开发板即可。
2.2 添加uboot对initramfs支持
向u-boot添加环境变量:
set bootargs 'console=ttyS0,115200 mem=64M init=/linuxrc rw loglevel=7'
set bootcmd 'nand read 30008000 100000 800000;bootm 30008000'
set bkr 'tftp 30008000 linuxrom-s3c2440.bin;nand erase 100000 800000;nand write 30008000 100000 800000'
save保存,run bkr就可以完成下载,擦除和写的工作,另两条则是u-boot传递的参数,这是由Linux内核读取和处理的。(详细讲解:http://blog.chinaunix.net/uid-20672257-id-2395102.html)
最后,boot,启动。
2.3可能遇到的问题和注意事项
1.在进行nand write的时候,如果指定的区域有坏块,提示无法写入,可以将写的文件大小设置大一些。如上面的,可以将800000改为900000。
2.在进行擦除nand flash时,注意是擦除整个分区,内核分区大小是10M,则:nand erase 100000 a00000。 100000是分区起始位置,a00000就是分区的大小。