使用versatile_defconfig编译的内核不能满足要求,现在,添加SCSI磁盘,MTD以及NAND flash的支持。
交叉编译linux内核
下载codesourcery的交叉编译工具链 https://sourcery.mentor.com/sgpp/lite/arm/portal/subscription?@template=lite, 选择目标OS为GNU/Linux。下载后解压,将/path/to/arm-2011.03/bin 添加到PATH中。
编译完成后,会在arch/arm/boot/目录下生成zImage,可以使用qemu来测试编译的内核是否可以启动,如果没有安装qemu,则安装
可以看到,内核能启动,但是由于没有根文件系统而panic。
构建根文件系统
将codesourcery工具链中针对arm的lib库复制到根文件系统中,这一步是可选的,因为在下面将把busybox编译成静态链接的包。
将库文件strip,减小大小,可选的。
提示libgcc_s.so不能识别,没关系,它是一个ASCII ld脚本,忽略即可。
现在,编译busybox-1.18.5
如果不将busybox编译成静态链接程序,那么前面的复制lib工作就是必须的。
可以看到,内核还是发生了panic,报错没有根文件系统,这里已经不是由kernel直接报错,而是有rootfs.img报错,因为它试图挂载真正的根文件系统。可以做如下测试
现在,尽管最后还是panic,但是并不是没有合适的root=参数了,而是文件系统不能正确挂载。再进一步
可以发现,现在不再发生panic了,因为系统不再试图挂载真正的根文件系统。现在启动到了initramfs中,由于没有启动一个设备管理器,没有挂载proc, sysfs文件系统,busybox不能很好的工作,可以做如下测试
当busybox的/sbin/init启动后,会提示很多错误,包括没有设备文件等。现在来解决这个问题。
现在,系统可以工作正常了,出现了提示
编译mtd-utils
在Makefile中,将gcc, ar, ranlib命令加上前缀arm-none-linux-gnueabi-
现在,需要对mtd-utils打一个编译补丁,设置相应的头文件和库目录为刚才已经编译好的zlib, lzo。
注意:上面的PREFIX变量的值设置为zlib和lzo的安装目录!
然后,运行如下命令编译
由于ubifs有额外的依赖关系,所以这里暂不编译ubifs,补丁中有一行删除了对ubifs的编译。。
支持SCSI,MTD, NAND flash
现在重新编译
重新打包rootfs
用qemu模拟
启动过后,就可以使用block2mtd来模拟MTD设备,也可以使用nandsim模块来模拟NAND flash设备,由于添加了/sbin/mdev为uevent helper,所以会在/dev/目录下自动创建/删除相应的设备。