基于ZLG/BOOT 的linux2.6 内核移植(s3c2410) ZLG/BOOT 是广州致远arm 实验箱自带的bootloader. 我用的这款实验箱自带的linux 内核还是2.4 版本的, 有点儿老了, 所以想移植个2.6 上去.
由于bootloder 的移植烧写也是比较麻烦的事, 我决定暂时先用实验箱自带的ZLG/BOOT. 实际上使用ZLG/BOOT 对于linux 内核的移植是比较方便的, ZLG/BOOT 的运行机制是这样的: 启动或复位硬件后,ZLG/BOOT 会识别nandflsh 上创建的启动目录, 你只需通过ftp 将内核及根文件系统下载到nandflash 中指定目录(a:\boot\) 下. 当你选择启动linux 的选项,ZLG/BOOT 会自动将该目录下的linux 内核(zImag) 和根文件系(init.img) 以及linux 启动参数文件(param.bin) 拷贝到内存(ram) 中指定的地址, 并跳至linux 内核的首地址, 开始运行linux. 在nandfllash 的a:\boot\ 目录下还有两个重要文件zlg_boot.init 和param.bin, 其中前者是可编辑文件, 可以通过ftp 上传到主机(PC) 后进行编辑修改, 之后再下载下去, 但是后者是二进制文件, 只能通过实验箱带的专门修改此文件的软件来修改关键参数. 实际移植过程中也可以不对这两个文件进行修改,
但有几需要注意的地方:
1, 在zlg_boot.init 中有这样一段代码:
load 0x30008000 a:\boot\zImag
load 0x30000100 a:\boot\parm.bin
load 0x33C00000 a:\boot\init.img
其作用是分别将liunx 内核, 启动参数以及根文件系统等几个文件拷贝到ram 中相应的地址. 这里要注意的是这几个文件名要与你实际下载到a:\boot\ 目录下的文件名一致, 否则加载时找不到相应文件. 所以, 移植过程中如果不修改zlg_boot.init 文件, 那么你在制作内核和根文件系统是一定要把文件名定义为zImag( 一般没什么问题) 和init.img.
2, 在parm.bin 中可修改的参数如下:
root=/dev/ram rw ramdisk=4096 console=tty0 console=ttyS0,115200N8
以上是实验箱原来自带的参数, 实际这些都是linux 命令, 用于告诉linux 以下信息: 根文件系统的加载地址, 读写属性, 文件系统大小和控制台信息--tty0 表示控制台为液晶显示器,ttyS0 表示控制台为串口0. 这里要注意的是在2.6 内核中对串口0 的表示已改成ttySAC0 , 如果移植2.6 内核后继续使用ttyS0, 当linux 启动时就会在串口终端出现:
Uncompressing Linux.................................................................. done,
booting .
然后就卡住不动了.
其实上面param.bin 中这些命令和linux 内核配置时boot option 选项中第三行的内容是同一个东西, 在实际中是praram.bin 中的内容把boot option 中的内容覆盖了, 使得boot option 中的内容不起作用. 所以在移植过程中要么修改param.bin, 要么在内核中把param.bin 屏蔽掉, 使得boot option 内容生效, 并修改其内容.
网上大多数介绍inux2.6 到s3c2410 的移植过程对2.6 内核主要有两个方面的修改, 一是修改nandflash 分区以及nand 设备启动代码的添加, 用来引导内核以及根文件系统的启动; 二是添加支持devfs 的相关内容( 有关devfs 引用网友原话"linux-2.6.13 以前的内核都支持devfs ,而之后版本的内核就把devfs 这块去掉了,虽然还能在内核源码中找到对应的源码,你也可以把它加进内核"). 根据上面的介绍, 基于ZLG/BOOT 的内核移植可以简单到不用对2.6 内核源码做任何修改, 配置编译后用ZLG/BOOT 直接下载到指定目录替代原来的2.4 内核, 就可启动运行2.6 内核了. 不用对nanflsh 进行分区设置是因为, 内核及根文件系统的引导完全由ZLG/BOOT 完成. 当然为了能在串口终端正常显示linux 启动信息, 要对启动参数文件parm.bin 进行修改, 即把ttyS0 改为ttySAC0. 这样linux 内核虽然启动了, 但是还存在两个小小的问题:
1, 启动信息中会出现4000 多行的:Bad eraseblock at 0x*****,(2.6.22 和2.6.20 都有这现象), 这可能是由于ZLG/BOOT 已经对nandflsh 分区并写保护了, 当linux 按自己的分区方式再次对nandflash 进行擦除和分区时就出现了这种情况. 解决办法是, 在linux 内核源码中取消对nandflash 设备的启动. 网上说出现Bad eraseblock 是因为没去掉没去掉nand 的ECC 校验, 我试着修改过此处, 并没好使, 所以真正原因应该就是我上面说的那样.
2,linux 启动并输出大量输出信息后会卡在这条信息上;Warning: unable to open an initial console. 这是由于原来2.4 内核及其使用的文件系统都支持devfs, 而现在的2.6 内核不支持. 解决办法有两个, 一是换一个不支持devfs 的根文件系统( 具体制作方法下节会讲), 二是修改内核代码及配置使之支持devfs.