Заголовок загрузочного образа

Android 9 представил поле версии в заголовке образа загрузки, что позволяет обновлять заголовок, сохраняя обратную совместимость. Загрузчик должен проверить поле версии заголовка и проанализировать заголовок соответствующим образом. Устройства, запускаемые с:

  • Android 13 может использовать версию заголовка загрузки 3 или 4. Для устройств, поддерживающих архитектуру Generic Kernel Image (GKI) , версия 4 является основным образом загрузки, а поле os_version в заголовке загрузки должно быть равно нулю. Ожидается, что загрузчик устройства получит информацию о версии из свойств Android Verified Boot (AVB) .
  • Android 12 может использовать загрузочный заголовок версии 3 или 4. Для устройств, поддерживающих архитектуру Generic Kernel Image (GKI) , версия 4 является основным загрузочным образом.
  • Android 11 может использовать заголовок загрузки версии 3. Для устройств, поддерживающих архитектуру Generic Kernel Image (GKI) , эта версия должна использоваться для основного загрузочного образа.
  • Android 10 должен использовать загрузочный заголовок версии 2.
  • Android 9 должен использовать загрузочный заголовок версии 1.
  • Android 8 и ниже считаются использующими заголовок загрузочного образа версии 0.

Для всех устройств, работающих под управлением Android 9 или выше, Vendor Test Suite (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 равен 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_dtbo инструмента mkbootimg во время создания образа восстановления. Для получения подробной информации об изменениях Android Open Source Project (AOSP) ознакомьтесь с соответствующими списками изменений для управления версиями заголовка загрузочного образа .

Заголовок загрузочного образа, версия 4

Android 12 предоставляет boot_signature в заголовке образа загрузки версии 4, который можно использовать для проверки целостности ядра и ramdisk. Проверка выполняется в VtsSecurityAvbTest и требуется для устройств, использующих архитектуру GKI. Однако boot_signature не участвует в процессе проверенной загрузки, специфичном для устройства, и используется только в VTS. Подробности см. в конфигурации платы GKI boot.img и настройках проверенной загрузки GKI .

Заголовок загрузочного образа поставщика версии 4 поддерживает несколько фрагментов RAM-диска поставщика.

Версия 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_dtbo_size , recovery_dtbo_offset , recovery_acpio_size и recovery_acpio_offset больше не отображаются в заголовке образа загрузки.

    • Устройства A/B используют схему обновления и восстановления, которая делает ненужным указание образа DTBO или ACPIO для восстановления.

    • Устройства, не относящиеся к A/B, на которых необходимо указать образ восстановления (DTBO или ACPIO), должны использовать заголовок загрузочного образа версии 1 или 2.

  • Дерево устройств (DTB). DTB хранится в загрузочном разделе поставщика , поэтому поля dtb_size и dtb_addr больше не отображаются в заголовке загрузочного образа (но присутствуют в заголовке загрузочного образа поставщика).

Устройства могут использовать заголовок загрузочного образа версии 3 для соответствия архитектуре Generic Kernel Image (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

Android 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

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, могут указать образ наложения DTB/ACPI для восстановления , чтобы помочь смягчить сбои обновления по воздуху (OTA). (У устройств A/B нет этой проблемы, и им не нужно указывать образ наложения.) Вы можете указать либо образ DTBO, либо образ ACPIO, но не оба (потому что они используются разными архитектурами). Чтобы правильно настроить заголовок загрузочного образа, при использовании:

  • Образ DTBO для восстановления, включите поля recovery_dtbo_size и recovery_dtbo_offset (и не включайте поля recovery_acpio_size и recovery_acpio_offset ).

  • Образ ACPIO для восстановления, включите поля recovery_acpio_size и recovery_acpio_offset (и не включайте поля recovery_dtbo_size и recovery_dtbo_offset ).

Поле header_size содержит размер заголовка загрузочного образа. Если версия заголовка загрузочного образа установлена ​​на 1, поле id содержит дайджест SHA-1 для раздела recovery_[dtbo|acpio] загрузочного образа в дополнение к second sections kernel , ramdisk и second . Подробную информацию о полях recovery_[dtbo|acpio]_size и recovery_[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];
};