Boot-Image-Header

Mit Android 9 wurde im Boot-Image-Header ein Versionsfeld eingeführt, das Updates des Headers ermöglicht und gleichzeitig die Abwärtskompatibilität aufrechterhalten kann. Der Bootloader muss das Feld für die Header-Version prüfen und den Header entsprechend parsen. Geräte, die eingeführt werden mit:

  • Unter Android 13 kann die Bootheader-Version 3 oder 4 verwendet werden. Bei Geräten, die die Architektur des Generic Kernel Image (GKI) unterstützen, ist Version 4 das primäre Boot-Image und das Feld os_version im Boot-Header muss null sein. Stattdessen muss der Geräte-Bootloader die Versionsinformationen aus den AVB-Eigenschaften (Android Verified Boot) abrufen.
  • Unter Android 12 kann die Bootheader-Version 3 oder 4 verwendet werden. Bei Geräten, die die Architektur des Generic Kernel Image (GKI) unterstützen, ist Version 4 das primäre Boot-Image.
  • Unter Android 11 kann die Bootheader-Version 3 verwendet werden. Bei Geräten, die die Architektur des Generic Kernel Image (GKI) unterstützen, muss diese Version für das primäre Boot-Image verwendet werden.
  • Android 10 muss die Boot-Header-Version 2 verwenden.
  • Android 9 muss die Boot-Header-Version 1 verwenden.
  • Unter Android 8 und niedriger wird davon ausgegangen, dass ein Boot-Image-Header der Version 0 verwendet wird.

Bei allen Geräten mit Android 9 oder höher prüft die Vendor Test Suite (VTS) das Format des boot/recovery-Images, um sicherzustellen, dass der Boot-Image-Header die richtige Version verwendet. Informationen zum Anzeigen der AOSP-Details zu allen unterstützten Boot-Image-Headern von Anbietern und Booten finden Sie unter system/tools/mkbootimg/include/bootimg/bootimg.h.

Versionsverwaltung für Boot-Image-Header implementieren

Das mkbootimg-Tool akzeptiert die folgenden Argumente.

Argumentation Beschreibung
header_version Legt die Boot-Image-Headerversion fest. Ein Boot-Image mit einer Headerversion:
  • 1 oder 2 unterstützt ein DTBO-Image für die Wiederherstellung oder ein ACPIO-Image für die Wiederherstellung.
  • 3 unterstützt keine Wiederherstellungsabbilder.
recovery_dtbo Wird für Architekturen verwendet, die DTB verwenden. Gibt den Pfad zum DTBO-Image für die Wiederherstellung an. Optional für A/B-Geräte, die kein Wiederherstellungsabbild benötigen. Nicht-A/B-Geräte mit header_version:
  • 1 oder 2 kann diesen Pfad angeben oder im Abschnitt recovery_acpio einen Pfad zu einem ACPIO-Wiederherstellungs-Image angeben.
  • 3 kann kein DTBO-Image für die Wiederherstellung angeben.
recovery_acpio Wird für Architekturen verwendet, die ACPI anstelle von DTB verwenden. Gibt den Pfad zum ACPIO-Image für die Wiederherstellung an. Optional für A/B-Geräte, die kein Wiederherstellungsimage benötigen. Nicht-A/B-Geräte mit header_version:
  • 1 oder 2 kann diesen Pfad angeben oder im Abschnitt recovery_dtbo einen Pfad zu einem DTBO-Image für die Wiederherstellung angeben.
  • 3 kann kein ACPIO-Image für die Wiederherstellung angeben.
dtb Pfad zum DTB-Image, das in den Boot-/Wiederherstellungs-Images enthalten ist.
dtb_offset Wenn es dem Argument base hinzugefügt wird, wird die physische Ladeadresse für die endgültige Gerätestruktur angegeben. Wenn das Argument base beispielsweise 0x10000000 und das Argument dtb_offset 0x01000000 ist, wird dtb_addr_field im Boot-Image-Header mit 0x11000000 ausgefüllt.

Das Gerät BoardConfig.mk verwendet die Konfiguration BOARD_MKBOOTIMG_ARGS, um header version den anderen boardspezifischen Argumenten von mkbootimg hinzuzufügen. Beispiel:

BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)

Das Android-Build-System verwendet die BoardConfig-Variable BOARD_PREBUILT_DTBOIMAGE, um beim Erstellen des Wiederherstellungs-Images das Argument recovery_dtbo des mkbootimg-Tools festzulegen. Weitere Informationen zu den Änderungen des Android Open Source Project (AOSP) findest du in den zugehörigen Änderungslisten für die Versionsverwaltung des Boot-Image-Headers.

Boot-Image-Header, Version 4

Android 12 stellt eine boot_signature im Boot-Image-Header Version 4 bereit, mit der die Integrität des Kernels und der Ramdisk geprüft werden kann. Die Prüfung wird in VtsSecurityAvbTest durchgeführt und ist für Geräte erforderlich, die die GKI-Architektur verwenden. boot_signature ist jedoch nicht am gerätespezifischen verifizierten Bootvorgang beteiligt und wird nur in VTS verwendet. Weitere Informationen finden Sie unter GKI boot.img Board Configuration und GKI Verified Boot Settings.

Version 4 des Boot-Image-Headers des Anbieters unterstützt Ramdisk-Fragmente von mehreren Anbietern.

Version 4 der Boot-Image-Headerversion verwendet das folgende Format.

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 */
};

Boot-Image-Header, Version 3

Android 11 aktualisiert den Boot-Image-Header auf Version 3. Dadurch werden die folgenden Daten entfernt:

  • Bootloader der zweiten Phase: Die Felder second_size und second_addr werden nicht mehr im Boot-Image-Header angezeigt. Geräte mit einem Bootloader in der zweiten Phase müssen diesen Bootloader in einer eigenen Partition speichern.

  • Wiederherstellungsabbild. Die Anforderung zum Angeben eines Wiederherstellungs-Images wurde verworfen und die Felder recovery_dtbo_size, recovery_dtbo_offset, recovery_acpio_size und recovery_acpio_offset werden nicht mehr im Boot-Image-Header angezeigt.

    • A/B-Geräte verwenden ein Aktualisierungs- und Wiederherstellungsschema, bei dem ein DTBO- oder ACPIO-Image für die Wiederherstellung nicht angegeben werden muss.

    • Nicht-A/B-Geräte, auf denen ein Wiederherstellungs-Image angegeben werden soll (entweder DTBO oder ACPIO), sollten Version 1 oder 2 des Boot-Image-Headers verwenden.

  • Device Tree Blob (DTB): Das DTB wird in der Boot-Partition des Anbieters gespeichert, sodass die Felder dtb_size und dtb_addr nicht mehr im Boot-Image-Header, sondern im Boot-Image-Header des Anbieters vorhanden sind.

Geräte können die Boot-Image-Header-Version 3 verwenden, um der Architektur Generic Kernel Image (GKI) zu entsprechen, die den Kern-Kernel vereinheitlicht und die für den Start erforderlichen Anbietermodule in die Partition vendor_boot verschiebt (d. h., das Boot-Image enthält nur GKI-Komponenten). Geräte, die:

  • Wenn Sie GKI verwenden (erfordert den Kernel Android 4.19 oder Android 5.4), aber keine A/B-Updates, können Sie ein Wiederherstellungsimage angeben, indem Sie das Start-Image der Version 3 für das Boot-Image und die Boot-Image-Version 2 für das Wiederherstellungsimage verwenden.

  • Wenn Sie weder GKI noch A/B-Updates verwenden, können Sie ein Wiederherstellungsimage angeben, indem Sie die Boot-Image-Version 1 oder 2 sowohl für das Boot- als auch für das Wiederherstellungs-Image verwenden.

Version 3 der Boot-Image-Headerversion verwendet das folgende Format.

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

Boot-Image-Header, Version 2

Android 10 aktualisiert den Boot-Image-Header auf Version 2. Dadurch wird ein Abschnitt für Informationen zum DTB-Image zur Wiederherstellung (Image-Größe und physische Ladeadresse) hinzugefügt.

Version 2 der Boot-Image-Headerversion verwendet das folgende Format.

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 */
};

Boot-Image-Header, Version 1

Android 9 konvertiert das Feld unused des Boot-Image-Headers in ein Header-Versionsfeld. Geräte, die mit Android 9 auf den Markt gebracht werden, müssen den Boot-Image-Header mit der Header-Version 1 oder höher verwenden (dies wird von VTS überprüft).

Version 1 der Boot-Image-Headerversion verwendet das folgende Format.

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 */
};

Nicht-A/B-Geräte können ein DTB/ACPI-Overlay-Image zur Wiederherstellung angeben, um Fehler bei OTA-Updates (Over The Air) zu minimieren. Bei A/B-Geräten tritt dieses Problem nicht auf und es muss kein Overlay-Bild angegeben werden. Sie können entweder ein DTBO-Image oder ein ACPIO-Image angeben, aber nicht beides (da sie von verschiedenen Architekturen verwendet werden). So konfigurieren Sie den Boot-Image-Header korrekt, wenn Sie Folgendes verwenden:

  • Ein DTBO-Image für die Wiederherstellung, das die Felder recovery_dtbo_size und recovery_dtbo_offset enthält und nicht die Felder recovery_acpio_size und recovery_acpio_offset.

  • Ein ACPIO-Image für die Wiederherstellung, das die Felder recovery_acpio_size und recovery_acpio_offset und nicht die Felder recovery_dtbo_size und recovery_dtbo_offset enthält.

Das Feld header_size enthält die Größe des Boot-Image-Headers. Wenn die Headerversion des Boot-Images auf 1 festgelegt ist, enthält das Feld id neben kernel, ramdisk und second sections den SHA-1-Digest für den Abschnitt recovery_[dtbo|acpio] des Boot-Images. Weitere Informationen zu den Feldern recovery_[dtbo|acpio]_size und recovery_[dtbo|acpio]_offset finden Sie unter Wiederherstellungs-Images.

Alter Boot-Image-Header, Version 0

Geräte, die vor Android 9 mit dem alten Boot-Image-Header auf den Markt gebracht wurden, werden so behandelt, als würden sie einen Boot-Image-Header der Version 0 verwenden.

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