Intestazione immagine di avvio

Android 9 ha introdotto un campo della versione nell'immagine di avvio dell'intestazione, consentendo di aggiornare l'intestazione mantenendo la compatibilità con le versioni precedenti. Il bootloader deve controllare il campo della versione dell'intestazione e analizzare l'intestazione di conseguenza. Dispositivi che vengono lanciati con:

  • Android 13 può utilizzare la versione 3 o 4 dell'intestazione di avvio. Per i dispositivi che supportano l'architettura Generic Kernel Image (GKI), la versione 4 è l'immagine di avvio principale e il campo os_version nell'intestazione di avvio deve essere pari a zero. Il bootloader del dispositivo dovrebbe invece recuperare le informazioni sulla versione dalle proprietà Android Verified Boot (AVB).
  • Android 12 può utilizzare la versione 3 o 4 dell'intestazione di avvio. Per dispositivi che supportano Generic Kernel Image (GKI) , la versione 4 è l'immagine di avvio principale.
  • Android 11 può utilizzare la versione 3 dell'intestazione di avvio. Per i dispositivi che supportano l'architettura Generic Kernel Image (GKI), questa versione deve essere utilizzata per l'immagine di avvio principale.
  • Android 10 deve utilizzare la versione 2 dell'intestazione di avvio.
  • Android 9 deve utilizzare l'intestazione di avvio versione 1.
  • Per Android 8 e versioni precedenti si intende l'utilizzo di un'intestazione dell'immagine di avvio versione 0.

Per tutti i dispositivi con Android 9 o versioni successive, La suite di test del fornitore (VTS) verifica il formato dei boot/recovery per garantire che l'intestazione dell'immagine di avvio utilizzi il file corretto completamente gestita. Per visualizzare i dettagli AOSP in tutti i file di avvio e di avvio del fornitore supportati le intestazioni delle immagini, fai riferimento system/tools/mkbootimg/include/bootimg/bootimg.h

Implementare il controllo delle versioni dell'intestazione dell'immagine di avvio

Lo strumento mkbootimg accetta i seguenti argomenti.

Argomento Descrizione
header_version Imposta la versione dell'intestazione dell'immagine di avvio. Un'immagine di avvio con una versione di intestazione:
  • 1 o 2 supporta un'immagine DTBO di ripristino o un'immagine ACPIO di ripristino.
  • 3 non supporta le immagini di recupero.
recovery_dtbo Utilizzato per le architetture che utilizzano DTB. Specifica il percorso dell'immagine DTBO di recupero. Facoltativo per i dispositivi A/B, che non richiedono un'immagine di ripristino. Dispositivi non A/B che utilizzano header_version:
  • 1 o 2 possono specificare questo percorso o utilizzare l'recovery_acpio per specificare un percorso di un'immagine ACPIO di ripristino.
  • 3 non può specificare un'immagine DTBO di ripristino.
recovery_acpio Utilizzato per le architetture che utilizzano ACPI anziché DTB. Specifica il percorso all'immagine ACPIO di ripristino. Facoltativo per i dispositivi A/B, che non richiedono un immagine di ripristino. Dispositivi non A/B che utilizzano header_version:
  • 1 o 2 possono specificare questo percorso o utilizzare l'recovery_dtbo per specificare un percorso a un'immagine DTBO di ripristino.
  • 3 non può specificare un'immagine ACPIO di ripristino.
dtb Percorso dell'immagine DTB inclusa nelle immagini di avvio/ripristino.
dtb_offset Se aggiunto all'argomento base, fornisce l'indirizzo di caricamento fisico per la struttura ad albero del dispositivo finale. Ad esempio, se base è 0x10000000 e l'argomento dtb_offset è 0x01000000, dtb_addr_field nell'immagine di avvio viene compilata come 0x11000000.

Il dispositivo BoardConfig.mk utilizza la configurazione BOARD_MKBOOTIMG_ARGS per aggiungere header version agli altri argomenti specifici della bacheca di mkbootimg. Per esempio:

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

Il sistema di compilazione Android utilizza la variabile BoardConfig BOARD_PREBUILT_DTBOIMAGE per impostare l'argomento recovery_dtbo del strumento mkbootimg durante la creazione dell'immagine di ripristino. Per maggiori dettagli sul Modifiche all'Android Open Source Project (AOSP), esamina gli elenchi delle modifiche associati per l'intestazione dell'immagine di avvio il controllo delle versioni.

Intestazione dell'immagine di avvio, versione 4

Android 12 fornisce un boot_signature nell'immagine di avvio l'intestazione versione 4, che può essere usata per verificare l'integrità del kernel ramdisk. Il controllo viene eseguito in TestAvbSicurezza ed è obbligatoria per i dispositivi che utilizzano l'architettura GKI. Tuttavia, boot_signature non è coinvolto nel processo di avvio verificato specifico del dispositivo e viene utilizzato solo in VTS. Vedi la bacheca boot.img GKI configurazione e Avvio verificato GKI impostazioni per maggiori dettagli.

Immagine di avvio del fornitore intestazione La versione 4 supporta frammenti ramdisk di più fornitori.

La versione 4 della versione dell'intestazione dell'immagine di avvio utilizza il seguente formato.

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

Intestazione immagine di avvio, versione 3

Android 11 aggiorna l'intestazione dell'immagine di avvio alla versione 3 che rimuove i seguenti dati:

  • Bootloader di secondo livello. I campi second_size e second_addr non più a lungo nell'intestazione dell'immagine di avvio. Dispositivi con bootloader di seconda fase deve archiviare quel bootloader in una propria partizione.

  • Immagine di ripristino. Il requisito di specificare un'immagine di recupero è stato ritirato e i campi recovery_dtbo_size, recovery_dtbo_offset, recovery_acpio_size e recovery_acpio_offset non vengono più visualizzati nell'intestazione dell'immagine di avvio.

    • I dispositivi A/B usano uno schema di aggiornamento e ripristino che rende inutile specifica un'immagine DTBO o ACPIO per il ripristino.

    • I dispositivi non A/B che vogliono specificare un'immagine di ripristino (DTBO o ACPIO) deve usare la versione 1 o 2 dell'intestazione dell'immagine di avvio.

  • Blob del grafico del dispositivo (DTB). Il DTB è archiviato nell'avvio del fornitore partizione di memoria, in modo che i campi dtb_size e dtb_addr non vengano più visualizzati nell'immagine di avvio (ma sono presenti nell'intestazione dell'immagine di avvio del fornitore).

I dispositivi possono utilizzare l'intestazione dell'immagine di avvio versione 3 per conformarsi a Generic Kernel Image (GKI), che unifica il kernel principale e sposta i moduli del fornitore necessari eseguire l'avvio nella partizione vendor_boot (ossia l'immagine di avvio contiene solo GKI) componenti). Dispositivi che:

  • Usa GKI (richiede il kernel android-4.19 o android-5.4), ma non Per gli aggiornamenti A/B è possibile specificare un'immagine di ripristino utilizzando la versione 3 dell'immagine di avvio per immagine di avvio e immagine di avvio versione 2 per l'immagine di ripristino.

  • Non utilizzare GKI e non utilizzare aggiornamenti A/B. Puoi specificare un'immagine di ripristino utilizzando immagine di avvio versione 1 o 2 per le immagini di avvio e di ripristino.

La versione 3 della versione dell'intestazione dell'immagine di avvio utilizza il formato seguente.

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

Intestazione dell'immagine di avvio, versione 2

Android 10 aggiorna l'intestazione dell'immagine di avvio alla versione 2, che aggiunge una sezione per le informazioni sull'immagine DTB di recupero (dimensioni dell'immagine e indirizzo di caricamento fisico).

La versione 2 della versione dell'intestazione dell'immagine di avvio utilizza il formato seguente.

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

Intestazione immagine di avvio, versione 1

Android 9 converte il campo unused dell'avvio intestazione immagine a un campo versione intestazione. I dispositivi vengono lanciati con Android 9 devono utilizzare l'intestazione dell'immagine di avvio insieme all'intestazione versione impostata su 1 o successiva (verificata da VTS).

La versione 1 della versione dell'intestazione dell'immagine di avvio utilizza il seguente formato.

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

I dispositivi non A/B possono specificare un'immagine overlay DTB/ACPI per ripristino per contribuire a ridurre errori di aggiornamento over-the-air (OTA). (I dispositivi A/B non hanno questo problema, non devi specificare un'immagine overlay. Puoi specificare un'immagine DTBO un'immagine ACPIO, ma non entrambe (perché sono utilizzate da architetture diverse). Per configurare correttamente l'intestazione dell'immagine di avvio, quando utilizzi:

  • Un'immagine DTBO per il recupero, che includa i campi recovery_dtbo_size e recovery_dtbo_offset (e non i campi recovery_acpio_size e recovery_acpio_offset).

  • Un'immagine ACPIO per il ripristino, includi recovery_acpio_size e recovery_acpio_offset (e non includono i campi recovery_dtbo_size e recovery_dtbo_offset).

Il campo header_size contiene le dimensioni dell'intestazione dell'immagine di avvio. Se la versione dell'intestazione dell'immagine di avvio è impostata su 1, il campo id contiene il digest SHA-1 per la sezione recovery_[dtbo|acpio] dell'immagine di avvio, oltre a kernel, ramdisk e second sections. Per informazioni dettagliate sui campi recovery_[dtbo|acpio]_size e recovery_[dtbo|acpio]_offset, consulta Immagini di ripristino.

Intestazione immagine di avvio legacy, versione 0

Dispositivi lanciati prima di Android 9 utilizzando la versione precedente l'intestazione immagine di avvio è considerata come l'utilizzo di un'intestazione immagine di avvio versione 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];
};