splitimg脚本解析bootimg及打包bootimg

简介:

recovery.img的构成(与bootimg原理一致),它是由boot_img_hdr + zImage + recovery-ramdisk构成。boot_img_hd是个结构体它描述了很多重要的信息。

复制代码
 1 struct boot_img_hdr
 2 {
 3     unsigned char magic[BOOT_MAGIC_SIZE];
4  unsigned kernel_size;  /*  size in bytes  */4字节小端 (顺位,高字节高地址)
5  unsigned kernel_addr;  /*  physical load addr  */ 4字节小端   6  unsigned ramdisk_size;  /* size in bytes  */ 4字节   7  unsigned ramdisk_addr;  /*  physical load addr  */ 4字节   8  unsigned second_size;  /*  size in bytes  */4字节   9  unsigned second_addr;  /*  physical load addr  */4字节   10  unsigned tags_addr;  /*  physical addr for kernel tags  */   11  unsigned page_size;  /* flash page size we assume  */   12  unsigned unused[ 2 ];  /*  future expansion: should be 0  */ 13  unsigned  char  name[BOOT_NAME_SIZE];  /*  asciiz product name  */   14  unsigned  char cmdline[BOOT_ARGS_SIZE];  15  unsigned id[ 8 ];  /*  timestamp / checksum / sha1 / etc  */   16 };
复制代码

其中kernel_size表示zImage的实际大小;kernel_addr表示zImage载入内存的物理地址,这个地址也是bootloader跳转到内核的地址;ramdisk_size表示ramdisk(此处就是指recovery-ramdisk)的实际大小;ramdisk_addr是ramdisk加载到内存的物理地址,之后kernel会解压并把它挂在成根文件系统,我们的中枢神经-init.rc就隐藏于内;second_size,second_addr做扩展用一般都不会使用(在我的一个项目中把它扩展成另外一种功能有机会介绍给大家);tags_addr是传参数用的物理内存地址,它作用是把bootloader中的参数传递给kernel;page_size是flash(eg. nandflash)的一个页大小,一般为2K,这通常情况取决于你使用Flash芯片的页大小;cmdline就是command line它可以由bootloader传递也可以在.config(kernel)中配置。

zImage是我们熟悉的内核镜像,由kernel编译生成。recovery-ramdisk是由mkbootfs、gzip打包生成的命令如下:

mkbootfs ramdiskdir | gzip > recovery-ramdisk.gz

 我们可以通过解压recovery.img来获取真正的recovery可执行文件,操作如下:

1 ./split_bootimg.pl recovery.img
2 mkdir out
3 cd out
4 gunzip -c ../recovery.img-ramdisk.gz | cpio -i

/sbin目录下的recovery就是可执行文件了,还原可参照如下操作:

1 find . | cpio -o -H newc | gzip > ../recovery.img-ramdisk.gz
2 mkbootimg --kernel recovery.img-kernel --ramdisk recovery.img-ramdisk.gz -o new-recovery.img

注: 上述使用到的工具下载(http://pan.baidu.com/s/1kT5hIXD),split_bootimg.pl 、mkbootimg、mkbootfs

        recovery.img与boot.img在结构上是一样的。

        现在很多平台的打包方式是不一样的,它们的做法是编译时把kernel镜像和根文件系统打包在一起合称为zImage。


关于split_bootimg解包问题:

xxjhy@localhost:~/disk4/imgtest$ ./split_bootimg.pl boot.img
Page size: 2048 (0x00000800)
Kernel size: 9928180 (0x00977df4)
Ramdisk size: 2340490 (0x0023b68a)
Second size: 0 (0x00000000)
Board name:
Command line:
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.


关于mkbootimg打包问题:

./bin/mkbootimg --cmdline 'no_console_suspend=1 console=null--kernel boot.img-kernel --ramdisk boot.img-ramdisk.gz -o new-boot2.img --base 0x40000000

不同的芯片在cmdline 以及base的基地址上有差别,可以尝试对比一下原来的bootimg或者recoveryimg 以及头文件定义,来看看 这2个参数自己有没有写对。


cat boot.img出来的问题:

shell@android:/mnt/oem # cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00400000 00004000 "misc"
mtd1: 00800000 00004000 "kernel"
mtd2: 01000000 00004000 "boot"
mtd3: 02000000 00004000 "recovery"
mtd4: 04000000 00004000 "backup"
mtd5: 08000000 00004000 "cache"
mtd6: 40000000 00004000 "userdata"
mtd7: 00400000 00004000 "kpanic"
mtd8: 20000000 00004000 "system"
mtd9: 00800000 00004000 "oem"
mtd10: 7d200000 00004000 "user"
shell@android:/mnt/oem # cat /proc/mtd/mtd2 > /mnt/sdcard/boot.img
sh: cat: /proc/mtd/mtd2: Not a directory
1|shell@android:/mnt/oem # cat /dev/mtd/mtd2 > /mnt/sdcard/boot.img            
shell@android:/mnt/oem # ls /mnt/sdcard/boot.img


关于 烧录进去的 boot.img以及cat 出来的boot.img比较可以参考:

http://pan.baidu.com/s/1o6NY7Jc


实战进行ramdisk打包及bootimg制作:

cat 分区出来 比如,cat /dev/mtd/mtd2 > /mnt/sdcard/boot.img

1、解压缩split boot.img,然后解压缩ramdisk;

2、default.prop中再增加ro.jhy 1测试选项;

3、使用rk3066的打包工具(out/product/linux-86/bin),各别芯片的mkbootimg有基地址的烧录不同,这个文件应该做不了通用!


3066_bin/mkbootfs out | 3066_bin/minigzip > ramdisk_jhy_222.img

3066_bin/mkbootimg --kernel boot_bycat.img-kernel --ramdisk ramdisk_jhy_222.img -o newboot_jhy.img

编译成功后,单独烧录该boot.img 发现环境变量OK。


shell@android:/ $ getprop |grep jhy
[ro.build.description]: [rk30sdk-eng 4.2.2 JDQ39 eng.jhy.20141118.114507 test-keys]
[ro.build.display.id]: [rk30sdk-eng 4.2.2 JDQ39 eng.jhy.20141118.114507 test-keys]
[ro.build.fingerprint]: [rk30sdk/rk30sdk/rk30sdk:4.2.2/JDQ39/eng.jhy.20141118.114507:eng/test-keys]
[ro.build.user]: [jhy]
[ro.build.version.incremental]: [eng.jhy.20141118.114507]
[ro.jhy]: [1]



实战进行制作完毕的bootimg dd回原来的区域

busybox dd if=/mnt/sdcard/boot.img of=/dev/mtd/mtd2 bs=4096



参考:

http://www.cnblogs.com/becklc/archive/2012/09/24/2676600.html

(转载)boot.img covery.img 对比 && 如何解包/编辑/打包boot.img文件



声明:觉得比较实用,就分享,在此致敬原创作者! 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值