Android 9 a introduit un champ de version dans l'image de démarrage ce qui permet de mettre à jour l'en-tête tout en maintenant la rétrocompatibilité. Le bootloader doit vérifier le champ de version de l'en-tête et analyser l'en-tête en conséquence. Appareils à lancer avec:
- Android 13 peut utiliser la version 3 ou 4 de l'en-tête de démarrage. Pour
compatibles avec l'image de noyau générique
(GKI)
architecture, la version 4 est l'image de démarrage principale et
os_version
dans l'en-tête de démarrage doit être égale à zéro. Le bootloader de l’appareil doit obtenez les informations de version à partir du démarrage validé Android (AVB) propriétés. - Android 12 peut utiliser les versions 3 ou 4 de l'en-tête de démarrage. Pour compatibles avec l'image de noyau générique (GKI) architecture, la version 4 est l’image de démarrage principale.
- Android 11 peut utiliser la version 3 de l'en-tête de démarrage. Pour périphériques compatibles avec Generic Kernel Image (GKI) cette version doit être utilisée pour l'image de démarrage principale.
- Android 10 doit utiliser la version 2 de l'en-tête de démarrage.
- Android 9 doit utiliser la version 1 de l'en-tête de démarrage.
- Android 8 et les versions antérieures sont considérées comme utilisant une version d'en-tête d'image de démarrage 0.
Pour tous les appareils équipés d'Android 9 ou version ultérieure, le
La suite de test pour les fournisseurs (VTS) vérifie le format du
boot/recovery
pour vous assurer que l'en-tête de l'image de démarrage utilise la bonne
version. Afficher les détails d'AOSP sur tous les démarrages et démarrages de fournisseur compatibles
des en-têtes d'image, reportez-vous
system/tools/mkbootimg/include/bootimg/bootimg.h
Implémenter la gestion des versions d'en-tête d'image de démarrage
L'outil mkbootimg
accepte les arguments suivants.
Argument | Description |
---|---|
header_version |
Définit la version de l'en-tête de l'image de démarrage. Une image de démarrage avec une version d'en-tête:
|
recovery_dtbo |
Utilisé pour les architectures qui utilisent DTB. Indique le chemin d'accès à la récupération
Image DTBO. Facultatif pour les appareils A/B, qui n'ont pas besoin d'une image de récupération.
Appareils non-A/B utilisant header_version :
|
recovery_acpio |
Utilisé pour les architectures qui utilisent ACPI au lieu de DTB. Spécifie le chemin d'accès
à l'image ACPIO de récupération. Facultatif pour les appareils A/B, qui n'ont pas besoin d'une image de récupération. Appareils non A/B utilisant header_version :
|
dtb |
Chemin d'accès à l'image DTB incluse dans les images de démarrage/récupération. |
dtb_offset |
Lorsqu'elle est ajoutée à l'argument base , elle indique la charge physique
pour l'arborescence finale des appareils. Par exemple, si base
est 0x10000000 et l'argument dtb_offset
est 0x01000000 , le dtb_addr_field dans l'image de démarrage
est renseigné sous la forme 0x11000000 . |
L'appareil BoardConfig.mk
utilise la configuration BOARD_MKBOOTIMG_ARGS
pour ajouter header version
aux autres arguments spécifiques à la carte de mkbootimg
. Exemple :
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Le système de compilation Android utilise la variable BoardConfig
BOARD_PREBUILT_DTBOIMAGE
pour définir l'argument recovery_dtbo
de
mkbootimg
lors de la création de l'image de récupération. Pour en savoir plus sur les
Modifications apportées au projet Android Open Source (AOSP), examinez les listes de modifications associées
pour l'en-tête de l'image de démarrage
gestion des versions.
En-tête de l'image de démarrage, version 4
Android 12 fournit un boot_signature
dans l'image de démarrage
l'en-tête version 4, qui permet de vérifier l'intégrité du noyau
"ramdisk". La vérification est effectuée dans
VtsSecurityAvbTest
et est requis pour les appareils utilisant l'architecture GKI. Toutefois,
boot_signature
n'est pas impliqué dans le processus de démarrage validé spécifique à l'appareil
et n'est utilisé que
dans les VTS. Voir Tableau de bord GKI boot.img
configuration
et le démarrage validé GKI
pour en savoir plus.
Image de démarrage du fournisseur titre La version 4 prend en charge plusieurs fragments ramdisk de fournisseurs.
La version 4 de la version d'en-tête de l'image de démarrage utilise le format suivant.
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 */
};
En-tête de l'image de démarrage, version 3
Android 11 met à jour l'en-tête de l'image de démarrage vers la version 3, ce qui supprime les données suivantes:
Boot bootloader de deuxième étape. Les champs
second_size
etsecond_addr
ne permettent dans l'en-tête de l'image de démarrage. Les appareils dotés d'un bootloader de deuxième étape doivent stocker ce bootloader dans sa propre partition.Image de récupération. Vous devez spécifier une image de récupération obsolète, et
recovery_dtbo_size
,recovery_dtbo_offset
, Les champsrecovery_acpio_size
etrecovery_acpio_offset
n'apparaissent plus dans l'en-tête de l'image de démarrage.Les appareils A/B utilisent un schéma de mise à jour et de récupération qui rend inutile la spécification d'une image DTBO ou ACPIO pour la récupération.
Les périphériques non A/B qui souhaitent spécifier une image de récupération (DTBO ou ACPIO) doivent utiliser les versions d'en-tête 1 ou 2 de l'image de démarrage.
Blob de l'arborescence de l'appareil (DTB). Le DTB est stocké dans le démarrage du fournisseur. partition, Les champs
dtb_size
etdtb_addr
n'apparaissent donc plus dans l'image de démarrage. (mais sont présentes dans l'en-tête de l'image de démarrage du fournisseur).
Les appareils peuvent utiliser la version 3 de l'en-tête de l'image de démarrage pour être conformes à la norme Generic Kernel Image (Image générique du noyau)
(GKI),
qui unifie le noyau principal et déplace les modules fournisseurs requis pour
démarrer sur la partition vendor_boot
(ce qui signifie que l'image de démarrage ne contient que GKI
composants). Appareils:
Utilisez GKI (nécessite le noyau android-4.19 ou android-5.4), mais n'utilisez pas Pour les mises à jour A/B, vous pouvez spécifier une image de récupération en utilisant la version 3 de l'image de démarrage l'image de démarrage et la version 2 de l'image de démarrage.
N'utilisez pas GKI et n'utilisez pas de mises à jour A/B. Vous pouvez spécifier une image de récupération en utilisant l'image de démarrage 1 ou 2 pour les images de démarrage et de récupération.
La version 3 de l'en-tête de l'image de démarrage utilise le format suivant.
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];
};
En-tête de l'image de démarrage, version 2
Android 10 met à jour l'en-tête de l'image de démarrage vers la version 2, qui ajoute une section pour les informations de l'image DTB de récupération (taille de l'image et adresse de chargement physique).
La version 2 de la version d'en-tête de l'image de démarrage utilise le format suivant.
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 */
};
En-tête de l'image de démarrage, version 1
Android 9 convertit le champ unused
du démarrage
d'image à un champ de version d'en-tête. Appareils équipés d'Android
9 doivent utiliser l'en-tête de l'image de démarrage
la version 1 ou ultérieure (qui est vérifiée par VTS).
La version 1 de la version d'en-tête de l'image de démarrage utilise le format suivant.
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 */
};
Les appareils non-A/B peuvent spécifier une image de superposition DTB/ACPI pour pour la reprise après sinistre afin d'atténuer les échecs de mise à jour Over The Air (OTA). (Les appareils A/B ne présentent pas ce problème et vous n'avez pas besoin de spécifier une image de superposition.) Vous pouvez spécifier une image DTBO ou une image ACPIO, mais pas les deux (car elles sont utilisées par des architectures différentes). Pour configurer correctement l'en-tête de l'image de démarrage lorsque vous utilisez :
Une image DTBO pour la récupération doit inclure les champs
recovery_dtbo_size
etrecovery_dtbo_offset
(et non les champsrecovery_acpio_size
etrecovery_acpio_offset
).Une image ACPIO pour la récupération, incluez
recovery_acpio_size
etrecovery_acpio_offset
(n'incluez pas les champsrecovery_dtbo_size
etrecovery_dtbo_offset
).
Le champ header_size
contient la taille de l'en-tête de l'image de démarrage. Si le démarrage
version d'en-tête d'image est définie sur 1, le champ id
contient le condensé SHA-1 de
la section recovery_[dtbo|acpio]
de l'image de démarrage, en plus
kernel
, ramdisk
et second sections
. Pour en savoir plus sur les
Champs recovery_[dtbo|acpio]_size
et recovery_[dtbo|acpio]_offset
, consultez
Images de récupération :
Ancien en-tête de l'image de démarrage, version 0
Appareils lancés avant la version 9 d'Android et utilisant l'ancienne version sont considérés comme utilisant la version 0 d'en-tête d'image de démarrage.
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];
};