近一周的时候都在玩linux 内核及文件系统移植,使用的版本如下:
Bootloader: u-boot-2010.06.tgz
Kernel: linux-3.0.y.tgz
BusyBox: busybox-1.16.1.tgz
搜集相应介绍文档后分别编译出U-boot.bin,uImage和rootfs.jffs2镜像文件(稍后抽空整理相应制作过程),当烧写进16M SPI Flash中,上电重启后却进不了系统。
串口输出以下信息:
困扰了近两天时间。。。。
期间作过很多尝试和测试,确定了我的u-boot可以成功引导别人的可用的内核及文件系统;而烧录我自己的u-boot及uImage之后,内核引导及初始化完毕,挂载文件系统后将要加载必要的内核模块的时候,出现Kernel panic,如下图:
发现问题出在我的根文件系统这里。开始以为是我在镜像烧录的时候没有规划好分区导致烧录的文件系统数据不完整,又对照着文档步骤重新制作了根文件系统,调整分区结构,再次仔仔细细地烧录进去,依旧出现以上错误。
后来在查看制作根文件系统的时候,看到mkfs.jffs2这个生成JFFS2格式文件系统的工具,搜索它的用法,发现它有一个“-e”参数(设定擦除块的大小为(默认: 64KiB)),突然想到上面串口输出的信息中有这么一句:
Further such events for this erase block will not be printed
Node at 0x0024ff48 with length 0x000001bc would run over the end ofthe erase block
Perhaps the file system was created with the wrong erase size?
然后在脚本中找到生成文件系统的命令:
mkfs.jffs2-l -e 0x20000 -d $rootfs_dir -o $target_fs
发现该命令在制作文件系统时块擦除大小设置为128K。于是,当我回过头检查串口输出的系统引导启动信息的时候,终于发现了问题所在:
此处显示该SPI Flash的Block大小为64K。原来是我在制作根文件系统时把块擦除大小设置成了128K,与芯片实际的参数不相符导致文件系统不能正常运行。
果断修改mkfs.jffs2后-e参数后面的值为64K:
mkfs.jffs2-l -e 0x10000 -d $rootfs_dir -o $target_fs
重新烧录了文件系统后,问题得到解决!!!
另外,在设置U-boot启动参数的时候,也要注意rootfs分区大小和后面烧录rootfs.jffs2映像的时候erase擦除的大小要对应,否则会出现:系统虽然可以启动,但同时会打印以下信息:
记录一下,聊以慰藉!