В 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 или выше набор тестов поставщика (VTS) проверяет формат образа boot/recovery , чтобы убедиться, что заголовок образа загрузки использует правильную версию. Для просмотра подробной информации о всех поддерживаемых заголовках образов загрузки и образах загрузки поставщика в AOSP см. файл system/tools/mkbootimg/include/bootimg/bootimg.h .
Реализовать версионирование заголовков загрузочного образа.
Инструмент mkbootimg принимает следующие аргументы.
| Аргумент | Описание |
|---|---|
header_version | Задает версию заголовка образа загрузки. Образ загрузки с указанной версией заголовка:
|
recovery_dtbo | Используется для архитектур, использующих DTB. Указывает путь к образу восстановления DTBO. Необязательно для устройств A/B, которым не требуется образ восстановления. Для устройств, не относящихся к A/B, использующих header_version :
|
recovery_acpio | Используется для архитектур, использующих ACPI вместо DTB. Указывает путь к образу восстановления ACPIO. Необязательно для устройств A/B, которым не требуется образ восстановления. Для устройств, не относящихся к A/B, использующих header_version :
|
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 в заголовке образа загрузки версии 4 содержится параметр boot_signature , который можно использовать для проверки целостности ядра и оперативной памяти. Проверка выполняется в VtsSecurityAvbTest и необходима для устройств, использующих архитектуру GKI. Однако boot_signature не участвует в процессе проверки загрузки, специфичном для устройства, и используется только в VTS. Подробнее см. в разделе «Конфигурация платы GKI boot.img» и «Настройки проверки загрузки GKI» .
Заголовочный файл загрузочного образа производителя версии 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_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 как для загрузочного образа, так и для образа восстановления.
В третьей версии заголовка образа загрузки используется следующий формат.
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 для восстановления (размер образа и физический адрес загрузки).
Вторая версия заголовка образа загрузки использует следующий формат.
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).
В первой версии заголовка образа загрузки используется следующий формат.
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] загрузочного образа в дополнение к разделам 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];
};