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


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值