Boot-Image-Header

Android 9 hat ein Versionsfeld im Boot-Image-Header eingeführt, das Updates des Headers ermöglicht und gleichzeitig die Abwärtskompatibilität aufrechterhält. Der Bootloader muss das Header-Versionsfeld überprüfen und den Header entsprechend parsen. Geräte starten mit:

  • Android 12 Boot - Header Version 3 oder 4. Bei Geräten , die den Einsatz kann Generisches Kernel - Image (GKI) Architektur, Version 4 ist das primäre Boot - Image.
  • Android 11 Boot - Header Version 3. Für Geräte unterstützen können generische Kernel - Image (GKI) Architektur, ist diese Version muss für die primäre Boot - Image verwendet werden.
  • Android 10 muss Bootheader-Version 2 verwenden.
  • Android 9 muss Bootheader-Version 1 verwenden.
  • Bei Android 8 und niedriger wird davon ausgegangen, dass ein Boot-Image-Header der Version 0 verwendet wird.

Für alle Geräte mit Android 9 oder höher ausgeführt wird , die Vendor Test Suite (VTS) prüft das Format des boot/recovery - Bildes , um sicherzustellen , dass die Boot - Image - Header , um die richtige Version verwendet. AOSP Details zu allen derzeit unterstützten Boot und Anbieter Boot - Image - Header zu sehen, beziehen sich auf system/tools/mkbootimg/include/bootimg/bootimg.h .

Versionierung des Boot-Image-Headers implementieren

Das mkbootimg Werkzeug akzeptiert die folgenden Argumente.

Streit Beschreibung
header_version Legt die Boot-Image-Header-Version fest. Ein Boot-Image mit einer Header-Version:
  • 1 oder 2 unterstützt ein Recovery-DTBO-Image oder ein Recovery-ACPIO-Image.
  • 3 unterstützt keine Wiederherstellungs-Images.
recovery_dtbo Wird für Architekturen verwendet, die DTB verwenden. Gibt den Pfad zum Wiederherstellungs-DTBO-Image an. Optional für A/B-Geräte, die kein Wiederherstellungs-Image benötigen. Non-A / B - Geräte unter Verwendung von header_version :
  • 1 oder 2 kann diesen Pfad angeben oder die Verwendung recovery_acpio Abschnitts einen Pfad zu einem Wiederherstellungs ACPIO Bild zu spezifizieren.
  • 3 kann kein Wiederherstellungs-DTBO-Image angeben.
recovery_acpio Wird für Architekturen verwendet, die ACPI anstelle von DTB verwenden. Gibt den Pfad zum Wiederherstellungs-ACPIO-Image an. Optional für A/B-Geräte, die kein Wiederherstellungs-Image benötigen. Non-A / B - Geräte unter Verwendung von header_version :
  • 1 oder 2 kann diesen Pfad angeben oder die Verwendung recovery_dtbo Abschnitts einen Pfad zu einem Wiederherstellungs DTBO Bild zu spezifizieren.
  • 3 kann kein Wiederherstellungs-ACPIO-Image angeben.
dtb Pfad zum DTB-Image, das in den Start-/Wiederherstellungs-Images enthalten ist.
dtb_offset Wenn der hinzugefügten base Argument stellt die physikalische Adresse für die Last Endvorrichtung Baum. Zum Beispiel, wenn die base Argument ist 0x10000000 und das dtb_offset Argument ist 0x01000000 , die dtb_addr_field in den Boot - Image - Header als bevölkerten 0x11000000 .

Das Gerät BoardConfig.mk verwendet die Konfigurations BOARD_MKBOOTIMG_ARGS hinzufügen header version - mkbootimg header version zu den anderen Board-spezifischen Argumenten von mkbootimg . Zum 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 das Argument zu setzen recovery_dtbo des mkbootimg Werkzeug bei der Erstellung des Wiederherstellungsabbilds. Ausführliche Informationen über die Android Open Source Project (AOSP) Änderungen, überprüfen Sie die zugehörigen Änderungslisten für Boot - Image - Header Versionierung .

Boot-Image-Header, Version 4

12 Android bietet eine boot_signature im Boot - Image - Header Version 4, die verwendet werden können , um die Integrität des Kernels und der RAM - Disk zu überprüfen. Die Prüfung wird in getan VtsSecurityAvbTest und ist für Geräte mit der GKI Architektur erforderlich. Allerdings ist der boot_signature nicht im gerätespezifischen verifizierter Boot - Prozess beteiligt und wird nur in VTS verwendet.

Vendor - Boot - Image - Header Version 4 unterstützt mehrere Anbieter Ramdisk Fragmente.

Version 4 der Boot-Image-Header-Version 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, wodurch die folgenden Daten entfernt werden:

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

  • Wiederherstellungs-Image. Die Voraussetzung für ein Wiederherstellungs - Image spezifiziert ist veraltet, und die recovery_dtbo_size , recovery_dtbo_offset , recovery_acpio_size und recovery_acpio_offset Felder erscheinen nicht mehr im Boot - Image - Header.

    • A/B-Geräte verwenden ein Aktualisierungs- und Wiederherstellungsschema, das es unnötig macht, ein DTBO- oder ACPIO-Image für die Wiederherstellung anzugeben.

    • Nicht-A/B-Geräte, die ein Wiederherstellungs-Image (entweder DTBO oder ACPIO) angeben möchten, sollten die Boot-Image-Header-Version 1 oder 2 verwenden.

  • Gerätebaumblob (DTB). Der DTB wird in der gespeicherten Anbieter Boot - dtb_size dtb_addr Partition , so dass die dtb_size und dtb_addr Felder nicht mehr im Boot - Image - Header erscheinen (aber im Kreditoren Boot - Image - Header vorhanden sind).

Die Geräte können verwenden Boot - Image - Header Version 3 zu erfüllen Allgemein Kernel - vendor_boot Image (GKI) für das Boot an die erforderlich ist Architektur, die die Kern - Kernel und bewegt Lieferantenmodule vereint , die vendor_boot Partition (dh das Boot - Image enthält nur GKI Komponenten). Geräte, die:

  • Verwenden Sie GKI (erfordert den Android-4.19- oder Android-5.4-Kernel), aber verwenden Sie keine A/B-Updates.

  • Verwenden Sie keine GKI und verwenden Sie keine A/B-Updates können Sie ein Wiederherstellungs-Image angeben, indem Sie Boot-Image-Version 1 oder 2 sowohl für Boot- als auch für Wiederherstellungs-Images verwenden.

Version 3 der Boot-Image-Header-Version 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

10 Android - Updates der Boot - Image - Header auf Version 2, die für die Wiederherstellung einen Abschnitt fügt DTB Bildinformation (Bildgröße und physische Last - Adresse).

Version 2 der Boot-Image-Header-Version 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 wandelt der unused Bereich des Boot - Image - Header zu einem Header Versionsfeld. Geräte, die mit Android 9 gestartet werden, müssen den Boot-Image-Header verwenden, wobei die Header-Version auf 1 oder höher gesetzt ist (dies wird von VTS überprüft).

Version 1 der Boot-Image-Header-Version 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 */
};

Non-A / B - Geräte können ein angeben für die Wiederherstellung DTB / ACPI Overlay - Bild zu Hilfe mitigate over-the-air (OTA) Update Ausfälle. (A/B-Geräte haben dieses Problem nicht und müssen kein Overlay-Image angeben.) Sie können entweder ein DTBO-Image oder ein ACPIO-Image angeben, aber nicht beides (da sie von unterschiedlichen Architekturen verwendet werden). So konfigurieren Sie den Boot-Image-Header richtig, wenn Sie Folgendes verwenden:

  • Ein DTBO Bild für die Verwertung, umfasst die recovery_dtbo_size und recovery_dtbo_offset Felder (und beinhaltet nicht die recovery_acpio_size und recovery_acpio_offset Felder).

  • Ein ACPIO Bild für die Verwertung, umfasst die recovery_acpio_size und recovery_acpio_offset Felder (und beinhaltet nicht die recovery_dtbo_size und recovery_dtbo_offset Felder).

Das header_size Feld enthält die Größe der Boot - Image - Header. Wenn die Boot - Image - Header - Version auf 1 gesetzt ist, wird die id enthält Feld der SHA-1 verdauen für die recovery_[dtbo|acpio] Abschnitt des Boot - Image zusätzlich zu dem kernel , ramdisk - second sections ramdisk und die second sections . Einzelheiten zur recovery_[dtbo|acpio]_size und recovery_[dtbo|acpio]_offset Feldern finden Sie Erholung Bilder .

Legacy-Boot-Image-Header, Version 0

Geräte, die vor Android 9 mit dem Legacy-Boot-Image-Header gestartet wurden, werden als Boot-Image-Header der Version 0 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];
};