內核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的映射地址不相符合而引發的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章