简介:
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];
其中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文件