Android 9 在启动映像标头中引入了版本字段,以便在保持向后兼容性的同时更新标头。引导加载程序必须检查标头版本字段并相应地解析标头。使用以下版本启动的设备
- Android 13 可以使用启动标头版本 3 或 4。对于支持通用内核映像 (GKI) 架构的设备,版本 4 是主要启动映像,并且启动标头中的
os_version
字段必须为零。设备引导加载程序应改为从 Android 验证启动 (AVB) 属性获取版本信息。 - Android 12 可以使用启动标头版本 3 或 4。对于支持通用内核映像 (GKI) 架构的设备,版本 4 是主要启动映像。
- Android 11 可以使用启动头版本 3。对于支持 通用内核映像 (GKI) 架构的设备,主启动映像必须使用此版本。
- Android 10 必须使用启动头版本 2。
- Android 9 必须使用启动头版本 1。
- Android 8 及更低版本被视为使用启动映像头版本 0。
对于所有运行 Android 9 或更高版本的设备,供应商测试套件 (VTS) 会检查 boot/recovery
映像的格式,以确保启动映像头使用正确的版本。要查看关于所有受支持的启动和供应商启动映像头的 AOSP 详细信息,请参阅 system/tools/mkbootimg/include/bootimg/bootimg.h
。
实施启动映像头版本控制
mkbootimg
工具接受以下参数。
参数 | 说明 |
---|---|
header_version |
设置启动映像头版本。带有头版本的启动映像
|
recovery_dtbo |
用于使用 DTB 的架构。指定 recovery DTBO 映像的路径。对于不需要 recovery 映像的 A/B 设备是可选的。使用 header_version 的非 A/B 设备
|
recovery_acpio |
用于使用 ACPI 而不是 DTB 的架构。指定 recovery ACPIO 映像的路径。对于不需要 recovery 映像的 A/B 设备是可选的。使用 header_version 的非 A/B 设备
|
dtb |
DTB 映像的路径,该映像包含在 boot/recovery 映像中。 |
dtb_offset |
添加到 base 参数时,为最终设备树提供物理加载地址。例如,如果 base 参数为 0x10000000 ,dtb_offset 参数为 0x01000000 ,则启动映像头中的 dtb_addr_field 将填充为 0x11000000 。 |
设备 BoardConfig.mk
使用配置 BOARD_MKBOOTIMG_ARGS
将 header version
添加到 mkbootimg
的其他板级特定参数。例如
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Android 构建系统使用 BoardConfig
变量 BOARD_PREBUILT_DTBOIMAGE
在创建 recovery 映像期间设置 mkbootimg
工具的参数 recovery_dtbo
。有关 Android 开源项目 (AOSP) 更改的详细信息,请查看与 启动映像头版本控制相关的更改列表。
启动映像头,版本 4
Android 12 在启动映像头版本 4 中提供了 boot_signature
,可用于检查内核和 ramdisk 的完整性。此检查在 VtsSecurityAvbTest 中完成,并且是使用 GKI 架构的设备所必需的。但是,boot_signature
不参与设备特定的已验证启动过程,仅在 VTS 中使用。有关详细信息,请参阅 GKI boot.img 板级配置 和 GKI 已验证启动设置。
供应商启动映像头 版本 4 支持多个供应商 ramdisk 片段。
版本 4 的启动映像头版本使用以下格式。
struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t ramdisk_size; /* size in bytes */
uint32_t os_version;
uint32_t header_size; /* size of boot image header in bytes */
uint32_t reserved[4];
uint32_t header_version; /* offset remains constant for version check */
#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];
uint32_t signature_size; /* size in bytes */
};
启动映像头,版本 3
Android 11 将启动映像头更新到版本 3,该版本移除了以下数据
第二阶段启动加载程序。
second_size
和second_addr
字段不再出现在启动映像头中。带有第二阶段启动加载程序的设备必须将其启动加载程序存储在自己的分区中。Recovery 映像。指定 recovery 映像的要求已被弃用,并且
recovery_dtbo_size
、recovery_dtbo_offset
、recovery_acpio_size
和recovery_acpio_offset
字段不再出现在启动映像头中。A/B 设备使用更新和 recovery 方案,这使得无需为 recovery 指定 DTBO 或 ACPIO 映像。
想要指定 recovery 映像(DTBO 或 ACPIO)的非 A/B 设备应使用启动映像头版本 1 或 2。
设备树 Blob (DTB)。DTB 存储在 供应商启动分区 中,因此
dtb_size
和dtb_addr
字段不再出现在启动映像头中(但存在于供应商启动映像头中)。
设备可以使用启动映像头版本 3 来符合 通用内核映像 (GKI) 架构,该架构统一了核心内核并将启动所需的供应商模块移动到 vendor_boot
分区(这意味着启动映像仅包含 GKI 组件)。设备如果
使用 GKI(需要 android-4.19 或 android-5.4 内核)但不使用 A/B 更新,则可以使用启动映像版本 3 作为启动映像,并使用启动映像版本 2 作为 recovery 映像来指定 recovery 映像。
不使用 GKI 且不使用 A/B 更新,则可以对启动和 recovery 映像都使用启动映像版本 1 或 2 来指定 recovery 映像。
版本 3 的启动映像头版本使用以下格式。
struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t ramdisk_size; /* size in bytes */
uint32_t os_version;
uint32_t header_size; /* size of boot image header in bytes */
uint32_t reserved[4];
uint32_t header_version; /* offset remains constant for version check */
#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];
};
启动映像头,版本 2
Android 10 将启动映像头更新到版本 2,其中添加了一个部分用于 recovery DTB 映像 信息(映像大小和物理加载地址)。
版本 2 的启动映像头版本使用以下格式。
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t header_version;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
uint32_t recovery_[dtbo|acpio]_size; /* size of recovery image */
uint64_t recovery_[dtbo|acpio]_offset; /* offset in boot image */
uint32_t header_size; /* size of boot image header in bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
};
启动映像头,版本 1
Android 9 将启动映像头的 unused
字段转换为头版本字段。使用 Android 9 启动的设备必须使用头版本设置为 1 或更高的启动映像头(这由 VTS 验证)。
版本 1 的启动映像头版本使用以下格式。
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t header_version;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
uint32_t recovery_[dtbo|acpio]_size; /* size of recovery image */
uint64_t recovery_[dtbo|acpio]_offset; /* offset in boot image */
uint32_t header_size; /* size of boot image header in bytes */
};
非 A/B 设备可以为 recovery 指定 DTB/ACPI 叠加映像,以帮助缓解空中 (OTA) 更新失败。(A/B 设备没有此问题,不需要指定叠加映像。)您可以指定 DTBO 映像或 ACPIO 映像,但不能同时指定两者(因为它们用于不同的架构)。要正确配置启动映像头,当使用
DTBO 映像进行 recovery 时,请包含
recovery_dtbo_size
和recovery_dtbo_offset
字段(并且不要包含recovery_acpio_size
和recovery_acpio_offset
字段)。ACPIO 映像进行 recovery 时,请包含
recovery_acpio_size
和recovery_acpio_offset
字段(并且不要包含recovery_dtbo_size
和recovery_dtbo_offset
字段)。
header_size
字段包含启动映像头的大小。如果启动映像头版本设置为 1,则 id
字段包含启动映像的 recovery_[dtbo|acpio]
部分以及 kernel
、ramdisk
和 second sections
的 SHA-1 摘要。有关 recovery_[dtbo|acpio]_size
和 recovery_[dtbo|acpio]_offset
字段的详细信息,请参阅 Recovery 映像。
旧版启动映像头,版本 0
在 Android 9 之前发布的设备使用旧版启动映像头,被视为使用启动映像头版本 0。
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t unused;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
};