splitimg脚本解析bootimg及打包bootimg
2014-11-17 14:41
267 查看
简介:
recovery.img的构成(与bootimg原理一致),它是由boot_img_hdr + zImage + recovery-ramdisk构成。boot_img_hd是个结构体它描述了很多重要的信息。
![](http://common.cnblogs.com/images/copycode.gif)
![](http://common.cnblogs.com/images/copycode.gif)
其中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打包生成的命令如下:
我们可以通过解压recovery.img来获取真正的recovery可执行文件,操作如下:
/sbin目录下的recovery就是可执行文件了,还原可参照如下操作:
注: 上述使用到的工具下载(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有基地址的烧录不同,这个文件应该做不了通用!
![](http://img.blog.csdn.net/20141118160215316?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2h1enVpMTk4NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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
recovery.img的构成(与bootimg原理一致),它是由boot_img_hdr + zImage + recovery-ramdisk构成。boot_img_hd是个结构体它描述了很多重要的信息。
![](http://common.cnblogs.com/images/copycode.gif)
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 };
![](http://common.cnblogs.com/images/copycode.gif)
其中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文件
相关文章推荐
- splitimg脚本解析bootimg及打包bootimg
- android4.3 解压、打包boot.img新脚本
- android4.3 解压、打包boot.img新脚本
- mtk打包/解包 boot.img, system.img, userdata.img, or recovery.img
- 如何解包/编辑/打包boot.img文件
- 如何解包/编辑/打包boot.img文件
- 如何解包/编辑/打包android系统的boot.img文件
- 如何解包/编辑/打包boot.img文件
- mtk boot.img打包解包
- (转载)boot.img covery.img 对比 && 如何解包/编辑/打包boot.img文件
- [Android]构建boot.img(二):kernel的拷贝与打包
- android文件系统制作教程(4) —- makefile脚本,制作各种单独的分区文件ramdisk.img,system.img,boot.img
- 6410开发版烧录Android映像 && IMG说明 && MTK平台解包和打包 boot.img/system.img
- u-boot链接脚本解析
- MTK的android镜像 解包和打包( boot.img, system.img, userdata.img, or recovery.img)
- MTK平台脚本-boot.img, ramdisk
- 如何解包/编辑/打包boot.img文件
- android文件系统制作教程(4) —- makefile脚本,制作各种单独的分区文件ramdisk.img,system.img,boot.img
- 如何解包/编辑/打包boot.img文件
- 如何解包/编辑/打包boot.img文件,recovery.img 文件