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:
|
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/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
esecond_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
erecovery_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
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 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
erecovery_dtbo_offset
(e non i campirecovery_acpio_size
erecovery_acpio_offset
).Un'immagine ACPIO per il recupero, che include i campi
recovery_acpio_size
erecovery_acpio_offset
(e non 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 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];
};