Kopfzeile des Boot-Images

Unter Android 9 wurde ein Versionsfeld in den Boot-Image-Header eingeführt, das Updates am Header ermöglicht und gleichzeitig die Abwärtskompatibilität beibehält. Der Bootloader muss das Feld „Header-Version“ prüfen und den Header entsprechend parsen. Geräte, die bei Markteinführung folgende Versionen nutzen:

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

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

Versionierung des Boot-Image-Headers implementieren

Das mkbootimg-Tool akzeptiert die folgenden Argumente.

Argument Beschreibung
header_version Legt die Version des Boot-Image-Headers fest. Ein Boot-Image mit einer Header-Version:
  • „1“ oder „2“ unterstützt ein DTBO- oder ACPIO-Wiederherstellungs-Image.
  • 3 unterstützt keine Wiederherstellungs-Images.
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, für die kein Wiederherstellungsimage erforderlich ist. Nicht A/B-Geräte, die header_version verwenden:
  • Unter „1“ oder „2“ können Sie diesen Pfad angeben oder im Abschnitt recovery_acpio einen Pfad zu einem ACPIO-Image für die Wiederherstellung 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, für die kein Wiederherstellungs-Image erforderlich ist. Nicht A/B-Geräte, die header_version verwenden:
  • Unter 1 oder 2 kann dieser Pfad angegeben werden. Alternativ können Sie im Abschnitt recovery_dtbo einen Pfad zu einem DTBO-Wiederherstellungs-Image 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 dem Argument base hinzugefügt, gibt die physische Ladeadresse für den endgültigen Gerätebaum an. Wenn das base-Argument beispielsweise 0x10000000 und das dtb_offset-Argument 0x01000000 ist, wird dtb_addr_field im Boot-Image-Header als 0x11000000 ausgefüllt.

Das Gerät BoardConfig.mk verwendet die Konfiguration BOARD_MKBOOTIMG_ARGS, um den anderen plattformspezifischen Argumenten von mkbootimg header version 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-Buildsystem verwendet die BoardConfig-Variable BOARD_PREBUILT_DTBOIMAGE, um das Argument recovery_dtbo des mkbootimg-Tools beim Erstellen des Wiederherstellungs-Images festzulegen. Weitere Informationen zu den Änderungen am Android Open Source Project (AOSP) finden Sie in den zugehörigen Änderungslisten für die Versionierung von Boot-Image-Headern.

Boot-Image-Header, Version 4

Android 12 bietet eine boot_signature im Boot-Image-Header der Version 4, mit der die Integrität des Kernels und des RAM-Disks geprüft werden kann. Die Prüfung erfolgt in VtsSecurityAvbTest und ist für Geräte mit GKI-Architektur erforderlich. Die boot_signature ist jedoch nicht am gerätespezifischen bestätigten Bootvorgang beteiligt und wird nur in VTS verwendet. Weitere Informationen finden Sie unter GKI-Boot.img-Boardkonfiguration und GKI-Einstellungen für den bestätigten Start.

Version 4 des Anbieter-Boot-Image-Headers unterstützt mehrere Anbieter-Ramdisk-Fragmente.

Version 4 des Boot-Image-Headers hat 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

In Android 11 wird der Boot-Image-Header auf Version 3 aktualisiert. Dabei werden die folgenden Daten entfernt:

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

  • Wiederherstellungsimage Die Anforderung zur Angabe eines Wiederherstellungs-Images wurde eingestellt und die Felder recovery_dtbo_size, recovery_dtbo_offset, recovery_acpio_size und recovery_acpio_offset sind nicht mehr im Boot-Image-Header enthalten.

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

    • Für Geräte, die keine A/B-Geräte sind und für die ein Wiederherstellungs-Image (entweder DTBO oder ACPIO) angegeben werden soll, sollte Version 1 oder 2 des Boot-Image-Headers verwendet werden.

  • Device Tree Blob (DTB) Das DTB wird in der Bootpartition des Anbieters gespeichert. Die Felder dtb_size und dtb_addr sind daher nicht mehr im Boot-Image-Header zu sehen, sondern im Header des Boot-Images des Anbieters.

Geräte können Version 3 des Boot-Image-Headers verwenden, um der GKI-Architektur (Generic Kernel Image) zu entsprechen. Dabei wird der Kernkernel vereinheitlicht und Anbietermodule, die zum Starten erforderlich sind, in die Partition vendor_boot verschoben. Das Boot-Image enthält also nur GKI-Komponenten. Geräte, auf die Folgendes zutrifft:

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

  • Wenn Sie GKI und A/B-Updates nicht verwenden, können Sie ein Wiederherstellungs-Image 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 des Boot-Image-Headers hat 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

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

Version 2 des Boot-Image-Headers hat 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

Unter Android 9 wird das Feld unused des Boot-Image-Headers in ein Feld für die Headerversion umgewandelt. Geräte, die mit Android 9 auf den Markt gebracht werden, müssen den Boot-Image-Header mit der Headerversion 1 oder höher verwenden. Dies wird von VTS überprüft.

Version 1 des Boot-Image-Headers hat 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 */
};

Für Geräte, die keine A/B-Geräte sind, kann ein DTB/ACPI-Overlay-Image für die Wiederherstellung angegeben werden, um Fehlschläge bei Over-the-Air-Updates (OTA) zu vermeiden. 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 richtig, wenn Sie Folgendes verwenden:

  • Ein DTBO-Image für die Wiederherstellung muss die Felder recovery_dtbo_size und recovery_dtbo_offset enthalten, aber nicht die Felder recovery_acpio_size und recovery_acpio_offset.

  • Ein ACPIO-Image für die Wiederherstellung muss die Felder recovery_acpio_size und recovery_acpio_offset enthalten, aber nicht die Felder recovery_dtbo_size und recovery_dtbo_offset.

Das Feld header_size enthält die Größe der Boot-Image-Kopfzeile. Wenn die Version des Boot-Image-Headers auf 1 festgelegt ist, enthält das Feld id zusätzlich zu 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.

Legacy-Boot-Image-Header, Version 0

Bei Geräten, die vor Android 9 auf den alten Boot-Image-Header zurückgreifen, wird Version 0 des Boot-Image-Headers verwendet.

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