Intestazione dell'immagine di avvio

Android 9 ha introdotto un campo versione nell'intestazione dell'immagine di avvio, consentendo gli aggiornamenti all'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 si avviano con:

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

Per tutti i dispositivi con Android 9 o versioni successive, Vendor Test Suite (VTS) controlla il formato dell'immagine boot/recovery per garantire che l'intestazione dell'immagine di avvio utilizzi la versione corretta. Per visualizzare i dettagli AOSP su tutte le intestazioni delle immagini di avvio e di avvio del fornitore attualmente supportate, fare riferimento a system/tools/mkbootimg/include/bootimg/bootimg.h .

Implementazione del controllo delle versioni dell'intestazione dell'immagine di avvio

Lo strumento mkbootimg accetta i seguenti argomenti.

Discussione 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 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 necessitano di 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 per un'immagine ACPIO di ripristino.
  • 3 non è possibile specificare un'immagine DTBO di ripristino.
recovery_acpio Utilizzato per architetture che utilizzano ACPI anziché DTB. Specifica il percorso dell'immagine ACPIO di ripristino. Facoltativo per i dispositivi A/B, che non necessitano di 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 per un'immagine DTBO di ripristino.
  • 3 non è possibile 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 del carico fisico per l'albero del dispositivo finale. Ad esempio, se l'argomento base è 0x10000000 e l'argomento dtb_offset è 0x01000000 , il dtb_addr_field nell'intestazione dell'immagine di avvio viene popolato 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 build 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 dettagli sulle modifiche del progetto Android Open Source (AOSP), esamina gli elenchi di modifiche associati per il controllo delle versioni dell'intestazione dell'immagine di avvio .

Intestazione dell'immagine di avvio, versione 4

Android 12 fornisce una boot_signature nell'intestazione dell'immagine di avvio versione 4, che può essere utilizzata per verificare l'integrità del kernel e del ramdisk. Il controllo viene eseguito in VtsSecurityAvbTest ed è richiesto per i dispositivi che utilizzano l'architettura GKI. Tuttavia, boot_signature non è coinvolta nel processo di avvio verificato specifico del dispositivo e viene utilizzata solo in VTS. Per i dettagli, consulta la configurazione della scheda GKI boot.img e le impostazioni di avvio verificate da GKI .

L'intestazione dell'immagine di avvio del fornitore versione 4 supporta più frammenti di 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, rimuovendo i seguenti dati:

  • Bootloader di seconda fase. I campi second_size e second_addr non vengono più visualizzati nell'intestazione dell'immagine di avvio. I dispositivi con un bootloader di secondo stadio devono archiviare quel bootloader nella propria partizione.

  • Immagine di ripristino. Il requisito per specificare un'immagine di ripristino è stato deprecato 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 ripristino che rende superfluo specificare un'immagine DTBO o ACPIO per il ripristino.

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

  • BLOB dell'albero dei dispositivi (DTB). Il DTB è archiviato nella partizione di avvio del fornitore , quindi 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 l'intestazione dell'immagine di avvio versione 3 per conformarsi all'architettura Generic Kernel Image (GKI) , che unifica il kernel principale e sposta i moduli del fornitore necessari per l'avvio nella partizione vendor_boot (il che significa che l'immagine di avvio contiene solo componenti GKI). Dispositivi che:

  • Utilizzare GKI (richiede il kernel Android-4.19 o Android-5.4) ma non utilizzare gli aggiornamenti A/B è possibile specificare un'immagine di ripristino utilizzando l'immagine di avvio versione 3 per l'immagine di avvio e l'immagine di avvio versione 2 per l'immagine di ripristino.

  • Non utilizzare GKI e non utilizzare aggiornamenti A/B è possibile specificare un'immagine di ripristino utilizzando l'immagine di avvio versione 1 o 2 sia per le immagini di avvio che per quelle di ripristino.

La versione 3 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];
};

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 ripristino (dimensione dell'immagine e indirizzo di carico 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 avviati 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 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 il ripristino per contribuire a mitigare gli errori di aggiornamento over-the-air (OTA). (I dispositivi A/B non presentano questo problema e non hanno bisogno di specificare un'immagine sovrapposta.) Puoi specificare un'immagine DTBO o un'immagine ACPIO, ma non entrambe (perché vengono utilizzate da architetture diverse). Per configurare correttamente l'intestazione dell'immagine di avvio, quando si utilizza:

  • Un'immagine DTBO per il ripristino include i campi recovery_dtbo_size e recovery_dtbo_offset (e non include i campi recovery_acpio_size e recovery_acpio_offset ).

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

Il campo header_size contiene la dimensione 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 al kernel , ramdisk e second sections . Per dettagli sui campi recovery_[dtbo|acpio]_size e recovery_[dtbo|acpio]_offset , consulta Immagini di ripristino .

Intestazione dell'immagine di avvio legacy, versione 0

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