内核zImage的制作(initramfs)

1.通过busybox制作一个我们需要的文件系统,但是没有压缩,所有的文件在目录~/armsource/ramfs下面。
2.initramfs其实就是一个用gzip压缩的cpio文件。我们可以把initramfs直接集成到kernel里,也可以单独加载initramfs。在kernel源码的scripts目录下,有一个gen_initramfs_list.sh脚本,专门是用来生成initramfs镜像和initramfs list文件。你可以通过如下方式自动生成initramfs镜像:
  sh scripts/gen_initramfs_list.sh -o initramfs_data.cpio.gz   ~/armsource/ramfs
然后修改kernel的.config配置文件来包含这个文件:
   CONFIG_INITRAMFS_SOURCE="initramfs_data.cpio.gz"
重新编译后,kernel就自动集成了你制作的initramfs_data.cpio.gz,并会在初始化完成后,加载这个根文件系统,并产生一个shell。




制作内核:
$MAP_ROOT_DIR/tools/mkimage -A ppc -O linux -T multi -C gzip -a 0x0 -e 0x0 -n 'PPC Linux-2.6.21.7' -d piggy.gz:initramfs_data.cpio.gz:SCMF.dtb zImage


linux2.6 内核使用的 initrd 是 cpio 格式,其核心文件是 /init。下面介绍 linux2.6 内核对initrd 的处理流程:
boot loader 把内核以及 initrd 文件加载到内存的特定位置。
内核判断initrd的文件格式,如果是cpio格式。
将initrd的内容释放到rootfs中。
执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。


这里要清楚另一个概念:
initramfs:initramfs 是在 kernel 2.5中引入的技术,实际上它的含义就是:在内核镜像中附加一个cpio包,这个cpio包中包含了一个小型的文件系统,当内核启动时,内核将这个 cpio包解开,并且将其中包含的文件系统释放到rootfs中,内核中的一部分初始化代码会放到这个文件系统中,作为用户层进程来执行。这样带来的明显 的好处是精简了内核的初始化代码,而且使得内核的初始化过程更容易定制。


所以内核首先要生成一个cpio包,这个包中又包含了initramfs的文件系统,这个就是initfamfs.cpio.gz。生成这个包的文件是:usr/gen_init_cpio.c,编译时initramfs_data.cpio.gz被链接进内核中。这个包放在usr/下,我们的内核也已经生成了这个包。 而unpack_to_rootfs(__initramfs_start, __initramfs_end - __initramfs_start, 0)这句话的意思就是试图通过gunzip解压initfamfs.cpio.gz,在[__initramfs_start, __initramfs_end]之间找到initramfs。现在我们的gz包有了,还停在这里,所以我有理由怀疑是内核的下载地址和sdram的映射地址不相符合而引发的问题。



你可能感兴趣的:(嵌入式知识)