最近做项目的时候遇到一个问题,有一个基于飞思卡尔(Free Scale)PoperPC E500_MC(multi-core)的介质板需要做Ramdisk启动。因为之前做过E500_V2架构的RamDisk,所以觉得这个应该不算很难。
下面是开发的一些环境:
1. 架构: PowerPC e500-mc. 我们使用的是八核的处理器。
2. Bootloader: U-boot.
3. Flash: 8M, 这个是一个很大的限制因素,因为如果使用initramfs启动的话,文件系统得不到充分的压缩。如果在编译内核的时候选择CONFIG_optimizing for size的话,编译器将使用-Os(文件大小优化)代替-O2(性能优化),这是项目不允许的。但是如果不选择的话,对于可用的flash只有大概6M多的话,initramfs就不够用了。所以这里必须用Ramdisk.分开编译内核和文件系统。
4.文件系统(file system): 这里主要是要弄个busy box进去执行一些简单的指令。
于是我生成了uImage, dtb 和 uRamdisk三个镜像文件,烧写到NOR FLASH里面以后使用脚本启动,每次初始化的时候都会有一个错误(exception).信息是这样的:
Kernel panic-- not syncing! Attempt to kill init. 然后因为我在bootargs里面设置了panic=1, U-boot会自动reset. 也就是说,这三个镜像文件不能使这块板子以RamDisk的方式启动。
这时候就必须查找是哪个文件的问题。鉴于DTB(device tree blob)的文件只是描述设备的文件,不管怎么编译内核这个都是不变的,所以这个可以先被排除掉。现在只剩下内核和文件系统了。于是我只把新的内核和DTB烧到flash里面,然后使用原有的NFS(network file system)去启动,成功了。当然,这个新的内核和老的内核是不一样的,现在成功启动不代表兼容Ramdisk. 所以还需要简单测试一下。
因为我做的Ramdisk是ext2格式的,所以我这样试一下。
//首先看看/dev里面有没有ram设备
# ls /dev/ram*
//格式化任何一个ram为ext2系统
#mke2fs /dev/ram0
//创建一个文件夹
# mkdir /tmp/ramdisk
//挂载这个文件夹到ram0
# mount /tmp/ramdisk /dev/ram0
这些指令都成功了,所以说明这个内核是基本支持Ramdisk的。 现在要检查的是uRamdisk这个文件了。
开始的时候我确实不太清楚应该怎么检查,后来同事说要用chroot这个命令更换根文件系统(root file system). 我觉得很有道理,于是接下来我是这么做的:
1. 使用原有内核和原有NFS启动。
2. 得到uRamdisk(注意这里是没有压缩过的)的存放路径后,进入该路径。
3. 使用chroot . /bin/ash.(如果有/bin/bash的话,可以直接使用chroot . 后面缺省。因为我用的是busy box,所以没有/bin/bash。注意这里必须有root权限)。
结果是系统返回illegal instructions. 说明内核和这个文件系统不兼容。这样的话就基本确定了是文件系统的问题。下一步将具体检查文件系统。
P.S:因为现在用的文件系统是之前给PowerPC e500_v2使用的,可能是因为架构有变化,文件系统不支持了。