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

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

  • Android - 12 можно использовать загрузочный заголовок версию 3 или 4. Для устройств , поддерживающих универсальным образ ядра (ГКО) архитектуры, версия 4 является основным загрузочным образом.
  • Android 11 может использовать заголовок загрузки версию 3. Для устройств , поддерживающих универсальным образом ядра (ГКО) архитектуру, эта версия должна быть использована для первичного загрузочного образа.
  • 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 (AOSP) изменения, рассмотреть связанные группы изменений для заголовка изображения загрузки версий .

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

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

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

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

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

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

Устройства могут использовать загрузочный образ заголовка версию 3 для выполнения Generic Kernel Image (ГКО) архитектурой, которая объединяет ядро ядра и двигается поставщиком модулей, которые необходимы для загрузки в vendor_boot раздела ( что означает загрузочный образ содержит только компоненты ГКИ). Устройства, которые:

  • Использовать 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 */
};

Non-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] раздела загрузочного образа в дополнении к kernel , ramdisk и second sections . Для получения дополнительной информации о 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];
};