剖析boot.img的制作流程

快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈

当用户敲击了make bootimage时,我看看是如何工作的
在build/core/main.mk中,我们发现bootimage依赖INSTALLED_BOOTIMAGE_TARGET

.PHONY: bootimage
bootimage: $(INSTALLED_BOOTIMAGE_TARGET)

随后转到build/core/Makefile中,我们可以看到INSTALLED_BOOTIMAGE_TARGET其实就是boot.img,其依赖关系如下

INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img

$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES)
	$(call pretty,"Target boot image: $@")
	$(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@
	$(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE))

看看简单吧,INSTALLED_BOOTIMAGE_TARGET依赖两个目标:MKBOOTIMG和INTERNAL_BOOTIMAGE_FILES。
INTERNAL_BOOTIMAGE_FILES是真正的linux kernel,对应的也就是zImage,MKBOOTIMG其实就是mkbootimg工具。
当着两个目标生成后(也就是工具已在out/host下生成了、linux kernel意见编译Ok了),随后会调用下面的命令,进行打包boot.img:

$(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@

(1)MKBOOTIMG=$(HOST_OUT_EXECUTABLES)/mkbootimg 是制作boot.img的工具
(2)INTERNAL_BOOTIMAGE_ARGS 是制作boot.img的参数,它是一堆参数的集合,这里我们只看我们经常使用的:

    ifneq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
    INTERNAL_BOOTIMAGE_ARGS += --ramdisk $(INSTALLED_RAMDISK_TARGET)
    endif
    
   INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)"

也就是说,如果系统不带system_as_root功能(android9.0以前的基本都不带,android9.0后的google要求必须带),则会将ramdisk也加入到 INTERNAL_BOOTIMAGE_ARGS. 另外一个INTERNAL_KERNEL_CMDLINE对应的则是cmdline
由此我们就明白了,ramdisk到底是在system.img中,还是在boot.img中?(答:以往ramdisk都是在boot.img中,在开启了system_as_root功能以后,就在system.img中了),所以当你修改了device下面的init.xxxx.rc后,是该编译bootimage还是编译systemimg,这里就可以理解了吧

(3)BOARD_MKBOOTIMG_ARGS //google预留接口
在android默认release的版本中,这个参数其实是为空的,是芯片上在适配android代码时,有时会改变或定制boot.img的需求,比如android9.0要求将boot.img的header_version改为1(不然vts不过), 查阅google文档,需要在制作boot.img的命令行中,追加一个参数header_version=1,这里芯片上就可以把这个参数填入到BOARD_MKBOOTIMG_ARGS变量中

Q & A:
boot.img是如何制作的?
答:boot.img是通过mkbootimg工具,将linux kernel的binary zImage、内核的cmdline、ramdisk、dtbo…等一些信息,打包在了一起,做为boot.img

如有不足,欢迎指教!


在这里插入图片描述
《ARMv8/ARMv9架构学习系列课程》全系列,共计52节课,超16h的视频课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arm精选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值