启动映像标头版本编号

启动映像标头版本编号

从 Android 9 起,启动映像标头开始包含一个用于指示标头版本的字段。引导加载程序必须检查该标头版本字段,并相应地解析标头。通过对启动映像标头进行版本编号,可在将来对标头进行修改,同时保持向后兼容性。

所有搭载 Android 9 的设备都必须使用启动标头版本 1。

启动映像标头更改

对于搭载 Android 9 的设备,旧版启动映像标头(如下所示)中的 unused 字段将会转换为标头版本字段。

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];
};

如果设备搭载 Android 9 之前的版本且使用旧版启动映像标头,则会被视为使用启动映像标头版本 0。所有搭载 Android 9 的设备都必须使用以下启动映像标头结构,同时标头版本设为 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_size;   /* size of recovery dtbo image */
    uint64_t recovery_dtbo_offset; /* offset in boot image */
    uint32_t header_size;   /* size of boot image header in bytes */
};

header_size 字段包含启动映像标头大小。如果启动映像标头版本设为 1,则除了内核、ramdisk 和 second 部分之外,ID 字段还包含启动映像 recovery_dtbo 部分的 SHA1 摘要。要详细了解 recovery_dtbo_sizerecovery_dtbo_offset 字段,请参阅在非 A/B 设备的恢复映像中添加 DTBO

实现

用于创建启动映像的 mkbootimg 工具添加了以下参数,以支持新的启动映像标头:

参数 说明
header_version 设置启动映像标头版本。
recovery_dtbo 要添加到恢复映像的恢复 DTBO 映像的路径。

设备 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,以便在创建恢复映像期间设置 mkbootimg 工具的 recovery_dtbo 参数。

要详细了解 Android 开源项目 (AOSP) 的变化,请查看与启动映像标头版本编号相关的更改列表

验证

对于所有搭载 Android 9 的设备,供应商测试套件 (VTS) 都会检查启动/恢复映像的格式,以确保启动映像标头使用版本 1。