1.前言
Android在编译过程中会调用mkbootimg命令,mkbootimg是生成boo.img的命令,boot.img中包含了kernel, dtb, ramdisk等。
2. mkbootimg工具原理
我们通过查看安卓在编译过程中的输出信息可以看到如下:
/bin/bash -c "(out/host/linux-x86/bin/mkbootimg --kernel out/target/product/G0335D/kernel --ramdisk out/target/product/G0335D/ramdisk.img --base 0x80000000 --pagesize 4096 --cmdline \"console=ttyHSL0,115200,n8 androidboot.console=ttyHSL0 androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x237 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 cma=32M@0-0xffffffff initcall_debug log_buf_len=2M printk.time=1 buildvariant=userdebug\" --os_version 7.1.2 --os_patch_level xxxx-xx-xx --output out/target/product/G0335D/boot.img
也就是说mkbootimg会传递很多的参数,其中包含了–cmdline,对于XXX版型,其实它来源于:
device/xxx/XXXX/BoardConfig.mk文件的BOARD_KERNEL_CMDLINE变量
同时mkbootimg源码中也会读取kernel和ramdisk文件的大小,用来初始化hdr->kernel_size, hdr->ramdisk_size
那么mkbootimg该如何使用这些参数呢?实际它会把这些参数的信息填充到bootimg头部信息,下面我们一起来了解bootimg的头部信息包含哪些内容?假设以MSM8996平台使用的版本0(通过mkbootimg解包工具可以看到)为例:
所以–cmdline中的信息是保存到bootimg的header头部了,当通过mkbootimg工具解析boot.img时会解析boot.img的头部,从头部的cmdline部分取出保存的cmdline的信息