Intestazione immagine di avvio

Android 9 ha introdotto un campo della versione nell'intestazione dell'immagine di avvio, consentendo gli aggiornamenti dell'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 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 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 i dispositivi che supportano l'architettura 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 la versione 1 dell'intestazione di avvio.
  • Android 8 e versioni precedenti sono considerati come se utilizzassero un'intestazione dell'immagine di avvio 0.

Per tutti i dispositivi con Android 9 o versioni successive, la Vendor Test Suite (VTS) controlla il formato dell'immagine boot/recovery per assicurarsi che l'intestazione dell'immagine di avvio utilizzi la versione corretta. Per visualizzare i dettagli AOSP su tutte le intestazioni delle immagini di avvio del fornitore e di avvio supportate, consulta 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 dell'intestazione:
  • 1 o 2 supporta un'immagine DTBO di ripristino o un'immagine ACPIO di ripristino.
  • 3 non supporta le immagini di ripristino.
recovery_dtbo Utilizzato per le architetture che utilizzano DTB. Specifica il percorso dell'immagine DTBO 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 la sezione recovery_acpio per specificare un percorso a un'immagine ACPIO di ripristino.
  • 3 non è possibile specificare un'immagine DTBO di recupero.
recovery_acpio Utilizzato per le architetture che utilizzano ACPI anziché DTB. Specifica il percorso dell'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 la sezione recovery_dtbo per specificare un percorso a un'immagine DTBO di ripristino.
  • 3 non è possibile specificare un'immagine ACPIO di recupero.
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 di dispositivi finale. Ad esempio, se l'argomento base è 0x10000000 e l'argomento dtb_offset è 0x01000000, dtb_addr_field nell'intestazione dell'immagine di avvio viene compilato come 0x11000000.

Il dispositivo BoardConfig.mk utilizza la configurazione BOARD_MKBOOTIMG_ARGS per aggiungere header version agli altri argomenti specifici della scheda 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 dello strumento mkbootimg durante la creazione dell'immagine di ripristino. Per informazioni dettagliate sulle modifiche dell'Android Open Source Project (AOSP), consulta i changelog associati per il versionamento dell'intestazione dell'immagine di avvio.

Intestazione dell'immagine di avvio, versione 4

Android 12 fornisce un boot_signature nell'intestazione della versione 4 dell'immagine di avvio, che può essere utilizzato per controllare l'integrità del kernel e del ramdisk. Il controllo viene eseguito in VtsSecurityAvbTest ed è obbligatorio per i dispositivi che utilizzano l'architettura GKI. Tuttavia, il boot_signature non è coinvolto nel processo di avvio verificato specifico del dispositivo e viene utilizzato solo nei VTS. Per maggiori dettagli, consulta la configurazione della scheda GKI boot.img e le impostazioni di Boot verificato GKI.

La versione 4 dell'intestazione dell'immagine di avvio del fornitore supporta più frammenti ramdisk del fornitore.

La versione 4 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 dell'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 vengono più visualizzati nell'intestazione dell'immagine di avvio. I dispositivi con un bootloader di secondo livello devono memorizzare il bootloader nella 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 utilizzano uno schema di aggiornamento e recupero che rende superfluo specificare un'immagine DTBO o ACPIO per il recupero.

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

  • Blob del grafico del dispositivo (DTB). Il DTB viene archiviato nella partizione di avvio del fornitore, pertanto i campi dtb_size e dtb_addr non vengono più visualizzati nell'intestazione dell'immagine di avvio, ma sono presenti nell'intestazione dell'immagine di avvio del fornitore.

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

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

  • Non utilizzare GKI e non utilizzare gli aggiornamenti A/B. Puoi specificare un'immagine di ripristino utilizzando l'immagine di avvio versione 1 o 2 sia per le immagini di avvio che per le immagini 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 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 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 */
    uint32_t dtb_size;                  /* size of dtb image */
    uint64_t dtb_addr;                  /* physical load address */
};

Intestazione dell'immagine di avvio, versione 1

Android 9 converte il campo unused dell'intestazione dell'immagine di avvio in un campo della versione dell'intestazione. I dispositivi che vengono lanciati con Android 9 devono utilizzare l'intestazione dell'immagine di avvio con la versione dell'intestazione impostata su 1 o successiva (questo è verificato 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 in overlay DTB/ACPI per il recupero per contribuire a ridurre i fallimenti degli aggiornamenti over-the-air (OTA). I dispositivi A/B non hanno questo problema e non è necessario specificare un'immagine in overlay. Puoi specificare un'immagine DTBO o un'immagine ACPIO, ma non entrambe (poiché vengono 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 recupero, che include i campi recovery_acpio_size e recovery_acpio_offset (e non 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 maggiori dettagli sui campi recovery_[dtbo|acpio]_size e recovery_[dtbo|acpio]_offset, consulta Immagini di ripristino.

Intestazione dell'immagine di avvio precedente, versione 0

I dispositivi lanciati prima di Android 9 utilizzando l'intestazione immagine di avvio legacy sono considerati come 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];
};