啟動映像標頭

Android 9 在啟動映像標頭中引入了一個版本字段,可在保持向後兼容性的同時更新標頭。引導加載程序必須檢查標頭版本字段並相應地解析標頭。設備啟動:

  • 機器人12可以使用引導頭版本3或4.對於支撐裝置的通用內核映像(GKI)架構,版本4是主要引導映像。
  • 機器人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設置啟動映像頭版本。帶有標頭版本的啟動映像:
  • 1 或 2 支持恢復 DTBO 映像或恢復 ACPIO 映像。
  • 3 不支持恢復映像。
recovery_dtbo用於使用 DTB 的架構。指定恢復 DTBO 映像的路徑。對於不需要恢復映像的 A/B 設備是可選的。非A / B使用設備header_version
  • 1或2可以指定此路徑,或使用recovery_acpio部分來指定到恢復ACPIO圖像的路徑。
  • 3 無法指定恢復 DTBO 映像。
recovery_acpio用於使用 ACPI 而不是 DTB 的體系結構。指定恢復 ACPIO 映像的路徑。對於不需要恢復映像的 A/B 設備是可選的。非A / B使用設備header_version
  • 1或2可以指定此路徑,或使用recovery_dtbo部分來指定到恢復DTBO圖像的路徑。
  • 3 無法指定恢復 ACPIO 映像。
dtb包含在引導/恢復映像中的 DTB 映像的路徑。
dtb_offset當添加到base參數,提供了一種用於最終器件樹中的物理加載地址。例如,如果該base參數是0x10000000dtb_offset參數是0x01000000dtb_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_dtbo中的mkbootimg創建恢復映像時的工具。有關Android開源項目的詳細信息(AOSP)的變化,審查的啟動映像頭版本相關的變更表

啟動映像標頭,版本 4

機器人12提供boot_signature在引導映像頭版本4,其可以被用來檢查內核和虛擬盤的完整性。支票已完成VtsSecurityAvbTest和所需的使用GKI 2.0體系結構設備。然而, boot_signature不參與特定的設備驗證啟動過程,並僅在VTS使用。見GKI 2.0 boot.img的集成的詳細信息。

賣方引導映像報頭版本4支持多個供應商虛擬盤片段。

啟動映像標頭版本的第 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_sizesecond_addr領域不再出現在引導映像頭。具有第二階段引導加載程序的設備必須將該引導加載程序存儲在其自己的分區中。

  • 恢復圖像。用於指定恢復圖像的要求已被棄用,而recovery_dtbo_sizerecovery_dtbo_offsetrecovery_acpio_sizerecovery_acpio_offset字段不再出現在引導映像頭。

    • A/B 設備使用更新和恢復方案,無需指定 DTBO 或 ACPIO 映像進行恢復。

    • 想要指定恢復映像(DTBO 或 ACPIO)的非 A/B 設備應使用啟動映像頭版本 1 或 2。

  • 設備樹 blob (DTB)。在DTB存儲在供應商引導分區,所以dtb_sizedtb_addr字段不再出現在引導映像標題(但存在於供應商的引導映像報頭)。

設備可以使用引導映像頭版本3遵從通用內核映像(GKI)結構,該結構結合的核心內核和移動供應商所需要的啟動到模塊vendor_boot分區(意味著啟動映像包含僅GKI組件)。設備:

  • 使用 GKI(需要 android-4.19 或 android-5.4 內核)但不使用 A/B 更新可以通過為啟動映像使用啟動映像版本 3 和為恢復映像使用啟動映像版本 2 來指定恢復映像。

  • 不使用 GKI 和不使用 A/B 更新可以通過對引導和恢復映像使用引導映像版本 1 或 2 來指定恢復映像。

啟動映像標頭版本的第 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

機器人10的更新啟動圖像頭到版本2,這增加了對回收部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

機器人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設備可以指定為恢復DTB / ACPI覆蓋圖像,以幫助減輕過空中(OTA)更新失敗。 (A/B 設備沒有這個問題,不需要指定覆蓋圖像。)您可以指定 DTBO 圖像或 ACPIO 圖像,但不能同時指定兩者(因為它們被不同的體系結構使用)。要正確配置啟動映像標頭,請在使用時:

  • 一個DTBO圖像進行恢復,包括recovery_dtbo_sizerecovery_dtbo_offset領域(以及不包括recovery_acpio_sizerecovery_acpio_offset領域)。

  • 一個ACPIO圖像進行恢復,包括recovery_acpio_sizerecovery_acpio_offset領域(以及不包括recovery_dtbo_sizerecovery_dtbo_offset領域)。

header_size字段包含引導映像頭的大小。如果引導映像頭版本被設置為1時, id字段包含SHA-1摘要用於recovery_[dtbo|acpio]除了引導映像的部分kernelramdisk ,並且second sections 。有關詳細信息, recovery_[dtbo|acpio]_sizerecovery_[dtbo|acpio]_offset場,看到恢復映像

舊版引導映像標頭,版本 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];
};