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 ottenere le informazioni sulla versione dalle proprietà di 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 considerate come se utilizzassero una versione 0 dell'intestazione dell'immagine di avvio.
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 di AOSP su tutte le intestazioni delle immagini di avvio e di avvio del fornitore 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:
|
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 :
|
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 :
|
dtb |
Percorso dell'immagine DTB inclusa nelle immagini di avvio/recupero. |
dtb_offset |
Se aggiunto all'argomento base , fornisce l'indirizzo di caricamento fisico per l'albero dei 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 all'Android Open Source Project (AOSP), consulta gli elenchi delle modifiche associati
per il controllo delle versioni
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 verificare 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 in VTS. Per maggiori dettagli, consulta Configurazione della scheda boot.img di GKI e Impostazioni di avvio verificato di GKI.
L'intestazione dell'immagine di avvio del fornitore versione 4 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 seconda fase. I campi
second_size
esecond_addr
non vengono più visualizzati nell'intestazione dell'immagine di avvio. I dispositivi con un bootloader di secondo livello devono memorizzarlo 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
erecovery_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 vogliono specificare un'immagine di ripristino (DTBO o ACPIO) devono utilizzare la versione 1 o 2 dell'intestazione dell'immagine di avvio.
Blob Device Tree (DTB). Il DTB è archiviato nella partizione di avvio del fornitore, pertanto i campi
dtb_size
edtb_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 rispettare l'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 i componenti GKI). Dispositivi che:
Utilizza GKI (richiede il kernel android-4.19 o android-5.4) ma non utilizzare Gli aggiornamenti A/B possono specificare un'immagine di ripristino utilizzando la versione 3 dell'immagine di avvio per l'immagine di avvio e la versione 2 dell'immagine di avvio 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 l'immagine di avvio che per quella 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 (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 versioni successive (questo viene 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 di overlay DTB/ACPI per il recupero per contribuire a ridurre gli errori di aggiornamento over-the-air (OTA). (I dispositivi A/B non presentano questo problema e non è necessario specificare un'immagine di overlay.) 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 utilizzi:
Un'immagine DTBO per il ripristino, includi i campi
recovery_dtbo_size
erecovery_dtbo_offset
(e non includere i campirecovery_acpio_size
erecovery_acpio_offset
).Un'immagine ACPIO per il ripristino, includi i campi
recovery_acpio_size
erecovery_acpio_offset
(e non includere i campirecovery_dtbo_size
erecovery_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
, vedi
Immagini di ripristino.
Intestazione dell'immagine di avvio legacy, versione 0
I dispositivi lanciati prima di Android 9 che utilizzano l'intestazione dell'immagine di avvio precedente sono considerati come se utilizzassero una versione 0 dell'intestazione dell'immagine di avvio.
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];
};