您的位置:首页 > 其它

splitimg脚本解析bootimg及打包bootimg

2014-11-17 14:41 267 查看
简介:

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]

实战进行***完毕的[b]bootimg dd回原来的区域:[/b]

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文件

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: