mkbootimg


概述

Android 產品中,內核格式是Linux標准的zImage,根文件系統采用ramdisk格式。這兩者在Android下是直接合並在一起取名為boot.img,會放在一個獨立分區當中。這個分區格式是Android自行制定的格式。
Android開發時,最標准的做法是重新編譯於內核和根文件系統,然后調用Android給的命令行文件mkbootimg來打包。
常用的就是打包和解包工具:unpackbootimg 和 mkbootimg

bootimg格式

源碼包中的bootimg.h有很多的版本可參考,下面的是version 1

/* When a boot header is of version 1, the structure of boot image is as
 * follows:
 *
 * +---------------------+
 * | boot header         | 1 page
 * +---------------------+
 * | kernel              | n pages
 * +---------------------+
 * | ramdisk             | m pages
 * +---------------------+
 * | second stage        | o pages
 * +---------------------+
 * | recovery dtbo/acpio | p 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
 * p = (recovery_dtbo_size + page_size - 1) / page_size
 *
 * 0. all entities are page_size aligned in flash
 * 1. kernel and ramdisk are required (size != 0)
 * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B
 *    devices(recovery_dtbo_size != 0)
 * 3. second is optional (second_size == 0 -> no second)
 * 4. load each element (kernel, ramdisk, second) at
 *    the specified physical address (kernel_addr, etc)
 * 5. If booting to recovery mode in a non-A/B device, extract recovery
 *    dtbo/acpio and apply the correct set of overlays on the base device tree
 *    depending on the hardware/product revision.
 * 6. set up registers for kernel entry as required by your architecture
 * 7. if second_size != 0: jump to second_addr
 *    else: jump to kernel_addr
 */

來源:platform/system/tools/mkbootimg - Git at Google

打包工具

boot.img可以打包任何操作系統內核,包括但不限於Linux, 格式也可以根據需求進行修改。解/打包工具都可以自己實現,源碼中包含mkbootimg.py, repack_bootimg.pyunpack_bootimg.py等可供參考。

安卓mkbootimg源碼歸檔位置:git clone https://gitee.com/whilewell/mkbootimg

打包ramdisk

$ cd ramdisk
$ find . | cpio -o -H newc | gzip > ../newramdisk.img

打包bootimg

常用打包工具可以是安卓自帶的mkbootimg,也可以是abootimg
mkbootimg

./mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel zImage --ramdisk boot/boot.img-ramdisk.gz -o boot.img --base 02e00000

abootimg

abootimg --create boot.img -k zImage -r newramdisk.img -c "pagesize=2048" -c "kerneladdr=0x80208000" -c "ramdiskaddr=0x82200000" -c "tagsaddr=0x80200100" -c "cmdline=console=ttyHSL0,115200n8 ..."

解包工具

解壓bootimg

$ abootimg -x boot.img

$ ls
bootimg.cfg  # boot header
zImage       # kernel
initrd.img   # ramdisk

解壓 ramdisk

$ mkdir ramdisk
$ cd ramdisk
$ gunzip -c ../initrd.img | cpio -i

$ ls
data
dev
proc
...

參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM