Intestazione immagine di avvio

Android 9 ha introdotto un campo versione nell'intestazione dell'immagine di avvio, consentendo 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 12 possono utilizzare l'avvio intestazione versione 3 o 4. Per dispositivi che supportano il kernel generica immagine (GKI) architettura, versione 4 è un'immagine di boot primario.
  • Android 11 possono usare intestazione avvio versione 3. Per i dispositivi che supportano Kernel Generico Image (GKI) dell'architettura, questa versione deve essere utilizzata per l'immagine di avvio principale.
  • Android 10 deve utilizzare l'intestazione di avvio versione 2.
  • Android 9 deve utilizzare l'intestazione di avvio versione 1.
  • Android 8 e versioni precedenti sono considerati come l'utilizzo di un'intestazione dell'immagine di avvio versione 0.

Per tutti i dispositivi con sistema operativo Android con 9 o superiore, il Test Suite Vendor (VTS) controlla il formato del boot/recovery immagine per assicurare che l'intestazione immagine di avvio utilizza la versione corretta. Per visualizzare i dettagli AOSP su tutte le intestazioni di immagine di boot di avvio e vendor attualmente supportati, fare riferimento al system/tools/mkbootimg/include/bootimg/bootimg.h .

Implementazione del versionamento dell'intestazione dell'immagine di avvio

Il mkbootimg strumento accetta i seguenti argomenti.

Discussione 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 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. Non-A / B e che utilizzano dispositivi header_version :
  • 1 o 2 può specificare questo percorso o usare il recovery_acpio sezione per specificare il percorso di un'immagine di ripristino ACPIO.
  • 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. Non-A / B e che utilizzano dispositivi header_version :
  • 1 o 2 può specificare questo percorso o usare il recovery_dtbo sezione per specificare il percorso di un'immagine di ripristino DTBO.
  • 3 non è possibile specificare un'immagine ACPIO di ripristino.
dtb Percorso dell'immagine DTB inclusa nelle immagini di avvio/ripristino.
dtb_offset Quando aggiunto alla base discussione, fornisce l'indirizzo di carico fisico per l'albero dispositivo finale. Ad esempio, se la base argomento è 0x10000000 e la dtb_offset argomento è 0x01000000 , il dtb_addr_field nell'intestazione immagine di avvio viene compilata come 0x11000000 .

Il dispositivo BoardConfig.mk utilizza config BOARD_MKBOOTIMG_ARGS per aggiungere header version agli altri argomenti bordo specifici della 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 il BoardConfig variabile BOARD_PREBUILT_DTBOIMAGE per impostare l'argomento recovery_dtbo del mkbootimg dell'utensile durante la creazione dell'immagine di ripristino. Per i dettagli sul progetto Open Source Android (AOSP modifiche), rivedere le changelists associati per avvio di intestazione immagine delle versioni .

Intestazione immagine di avvio, versione 4

Android 12 fornisce un boot_signature nella versione bagagliaio intestazione immagine 4, che può essere utilizzato per controllare l'integrità del kernel e il ramdisk. Il controllo viene eseguito in VtsSecurityAvbTest è richiesta per dispositivi che utilizzano l'architettura GKI. Tuttavia, il boot_signature non è coinvolto nel dispositivo specifico verificato processo di avvio e viene utilizzato solo in VTS.

Venditore immagine di avvio di intestazione di versione 4 supporta vendor multipli frammenti ramdisk.

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 stadio. I second_size e second_addr campi non appaiono più nella testata immagine di avvio. I dispositivi con un bootloader di secondo livello devono archiviare quel bootloader nella propria partizione.

  • Immagine di recupero. Il requisito per specificare un'immagine di ripristino è stato deprecato, e le recovery_dtbo_size , recovery_dtbo_offset , recovery_acpio_size , e recovery_acpio_offset campi non appaiono più nell'intestazione 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 della struttura ad albero dei dispositivi (DTB). DTB viene memorizzato nella partizione di avvio fornitore , così il dtb_size e dtb_addr campi appaiono più nell'intestazione immagine di avvio (ma sono presenti nell'intestazione dell'immagine avvio fornitore).

I dispositivi possono utilizzare un'immagine di avvio intestazione versione 3 alle Kernel Generico Image (GKI) architettura, che unisce il kernel nucleo e si muove fornitore moduli necessari per l'avvio al vendor_boot partizione (cioè 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 gli aggiornamenti A/B è possibile specificare un'immagine di ripristino utilizzando la versione 1 o 2 dell'immagine di avvio sia per l'immagine di avvio che per quella di ripristino.

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

Intestazione dell'immagine di avvio, versione 2

Android 10 aggiornamenti l'immagine di avvio di intestazione per la versione 2, che aggiunge una sezione per il recupero di immagini DTB informazioni (dimensioni dell'immagine e l'indirizzo carico fisico).

La versione 2 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 */
    uint32_t dtb_size;                  /* size of dtb image */
    uint64_t dtb_addr;                  /* physical load address */
};

Intestazione immagine di avvio, versione 1

Android 9 converte l' unused campo dell'intestazione immagine di avvio ad un campo di versione di intestazione. I dispositivi che si avviano con Android 9 devono utilizzare l'intestazione dell'immagine di avvio con la versione dell'intestazione impostata su 1 o successiva (verifica 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 */
};

Non-A / B dispositivi può specificare una sovrapposizione di immagini DTB / ACPI per il recupero per contribuire a mitigare over-the-air (OTA) errori di aggiornamento. (I dispositivi A/B non hanno questo problema e non è necessario specificare un'immagine di sovrapposizione.) È possibile specificare un'immagine DTBO o un'immagine ACPIO, ma non entrambe (perché sono utilizzate da architetture diverse). Per configurare correttamente l'intestazione dell'immagine di avvio, quando si utilizza:

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

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

Il header_size campo contiene la dimensione dell'intestazione immagine di avvio. Se l'avvio versione intestazione dell'immagine è impostata su 1, l' id campo contiene lo SHA-1 digest per la recovery_[dtbo|acpio] sezione l'immagine di avvio, oltre alla kernel , ramdisk e second sections . Per i dettagli sulla recovery_[dtbo|acpio]_size e recovery_[dtbo|acpio]_offset campi, vedere immagini di ripristino .

Intestazione dell'immagine di avvio legacy, versione 0

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