上文讲到内核运行到free init memory:8k这个地方就卡住,运行不下去了,在查阅了相关资料后,推测是缺少根文件系统所导致的,原来的内核源代码是搭配有根文件系统的bin文件,是romfs但没有源码,前面讲过我现在项目使用的是stm32f407,内部flash容量和外部SRAM都不足以拷入这个原配的romfs挂起为根文件系统来使用。
接下来就是寻找一种经济适用的文件系统来作为内核的根文件系统,从网上查阅相关资料可以知道,YAFFS2支持的是nandflash,jffs支持nor flash,这些看来对于我手上的stm32f407来说是不适用的,于是我仔细研究了stm32f103的源代码,发现它是有两种启动的方式,一种采用的是用iniramfs作为根文件系统,xip启动,在stm32f103内部flash只有512k的情况居然跑起了Uclinux,另一种是jfss2挂在外部nor flash上,显然我这种情况目前只有参考第一种方式来,采用initramfs作为根文件系统。于是开始构建initramfs相关文件。 仔细研究stm32f103 XIP启动方式的内核配置make menuconfig中, CONFIG_INITRAMFS_SOURCE=”initramfs-filelist” 而initramfs-filelist位于Uclinux/linux-2.6.x下,打开一看是这样的:
一开始我看不懂这里面的shell什么意思,好吧,不懂就继续找度娘,找到在一篇文章当中写得很清楚了,下面我把它copy过来,转载一下:
把initramfs编译到内核里面去
使用initramfs最简单的方式,莫过于用已经做好的cpio.gz把kernel里面那个空的给换掉。这是2.6 kernel天生支持的,所以,你不用做什么特殊的设置。
kernel的config option里面有一项CONFIG_INITRAMFS_SOURCE(I.E. General setup—>Initramfs source file(s) in menuconfig)。这个选项指向放着内核打包initramfs需要的所有文件。默认情况下,这个选项是留空的,所以内核编译出来之后initramfs也就是空的,也就是前面提到的rootfs什么都不做的情形。
C ONFIG_INITRAMFS_SOURCE 可以是一个绝对路径,也可以是一个从kernel’s top build dir(你敲入build或者是make的地方)开始的相对路径。而指向的目标可以有以下三种:一个已经做好的cpio.gz,或者一个已经为制作cpio.gz准备好所有内容的文件夹,或者是一个text的配置文件。第三种方式是最灵活的,我们先依次来介绍这三种方法。
1)使用一个已经做好的cpio.gz档案
If you already have your own initramfs_data.cpio.gz file (because you created it yourself, or sav