ramdisk解析及打包

參考文檔:

http://blog.csdn.net/linuxdriverdeveloper/article/details/8124319

之前的相關文檔:

(轉載)boot.img covery.img 對比 && 如何解包/編輯/打包boot.img文件



一、解包Ramdisk.img
1 查看文件格式: file ramdisk.img
ramdisk.img: gzip compressed data, from Unix
可知ramdisk.img是一個壓縮包,當然ramdisk.img的壓縮不是必需的

2 解壓ramdisk.img壓縮包: gunzip -S .img ramdisk.img
由於文件名不是.gz,所以要加-S,解壓後生成了ramdisk這個文件

3 查看解壓後文件ramdisk: file ramdisk
ramdisk: ASCII cpio archive (SVR4 with no CRC)
可知是cpio打包的文件

4 unpack 打包文件ramdisk: mkdir rootfs; cd rootfs; cpio -i -F ../ramdisk; ls
data          dev   init.goldfish.rc  proc  sys     ueventd.goldfish.rc
default.prop  init  init.rc           sbin  system  ueventd.rc
這就是全部文件了

此後我們就可以修改rootfs下的文件,想使用修改後的rootfs,只要對rootfs重新打包爲ramdisk.img即可

二、 製作Ramdisk
1 生成cpio 包: cd rootfs; find . | cpio -o -H newc > ../ramdisk
2 壓縮cpio包: gzip -c ramdisk > ramdisk.img(newramdisk.cpio.gz

新生成的ramdisk.img包含所做的修改了


 boot.img 與ramdisk.img的關係:


boot和recovery映像的文件結構
boot 和recovery映像並不是一個完整的文件系統,它們是一種android自定義的文件格式,該格式包括了2K的文件頭,後面緊跟着是用gzip壓縮過 的內核,再後面是一個ramdisk內存盤,然後緊跟着第二階段的載入器程序(這個載入器程序是可選的,在某些映像中或許沒有這部分)。此類文件的定義可 以從源代碼android-src/system/core/mkbootimg找到一個叫做bootimg.h的文件。

(譯者的話,原文是一個叫做mkbootimg.h的文件,但從Android 2.1的代碼來看,該文件名應該是改爲bootimg.h了)。

/*
** +-----------------+ 
** | boot header     | 1 page
** +-----------------+
** | kernel          | n pages  
** +-----------------+
** | ramdisk         | m pages  
** +-----------------+
** | second stage    | o pages
** +-----------------+
**
** n = (kernel_size + page_size - 1) / page_size
** m = (ramdisk_size + page_size - 1) / page_size
** o = (second_size + page_size - 1) / page_size
**
** 0. all entities are page_size aligned in flash
** 1. kernel and ramdisk are required (size != 0)
** 2. second is optional (second_size == 0 -> no second)
** 3. load each element (kernel, ramdisk, second) at
**    the specified physical address (kernel_addr, etc)
** 4. prepare tags at tag_addr.  kernel_args[] is
**    appended to the kernel commandline in the tags.
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
** 6. if second_size != 0: jump to second_addr
**    else: jump to kernel_addr
*/

最後一步就是通過mkbootimg這個工具,把kernel和ramdisk打包在一起,生成一個boot.img:

mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel your-kernel-file --ramdisk newramdisk.cpio.gz -o mynewimage.img
 --base 0x20000000


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