参考文档:
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了)。
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
** +-----------------+
** | 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: