En-tête de l'image de démarrage

Android 9 a introduit un champ de version dans l'en-tête de l'image de démarrage, permettant des mises à jour de l'en-tête tout en maintenant la rétrocompatibilité. Le chargeur de démarrage doit vérifier le champ de version de l'en-tête et analyser l'en-tête en conséquence. Appareils lancés avec :

  • Android 13 peut utiliser la version 3 ou 4 de l'en-tête de démarrage. Pour les appareils prenant en charge l'architecture Generic Kernel Image (GKI) , la version 4 est l'image de démarrage principale et le champ os_version dans l'en-tête de démarrage doit être égal à zéro. Le chargeur de démarrage de l'appareil doit plutôt obtenir les informations de version à partir des propriétés Android Verified Boot (AVB) .
  • Android 12 peut utiliser l'en-tête de démarrage version 3 ou 4. Pour les appareils prenant en charge l'architecture Generic Kernel Image (GKI) , 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 les appareils prenant en charge l'architecture 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 un en-tête d'image de démarrage version 0.

Pour tous les appareils fonctionnant avec Android 9 ou version ultérieure, la suite de tests du fournisseur (VTS) vérifie le format de l'image de boot/recovery pour s'assurer que l'en-tête de l'image de démarrage utilise la version correcte. Pour afficher les détails AOSP sur tous les en-têtes d'image de démarrage et de démarrage du fournisseur actuellement pris en charge, reportez-vous à system/tools/mkbootimg/include/bootimg/bootimg.h .

Implémentation de la gestion des versions de l'en-tête de l'image de démarrage

L'outil mkbootimg accepte les arguments suivants.

Dispute La 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 :
  • 1 ou 2 prend en charge une image DTBO de récupération ou une image ACPIO de récupération.
  • 3 ne prend pas en charge les images de récupération.
recovery_dtbo Utilisé pour les architectures qui utilisent DTB. Spécifie le chemin d'accès à l'image DTBO 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 :
  • 1 ou 2 peuvent spécifier ce chemin ou utiliser la section recovery_acpio pour spécifier un chemin vers une image ACPIO de récupération.
  • 3 ne peut pas spécifier une image DTBO de récupération.
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 :
  • 1 ou 2 peuvent spécifier ce chemin ou utiliser la section recovery_dtbo pour spécifier un chemin vers une image DTBO de récupération.
  • 3 ne peut pas spécifier une image ACPIO de récupération.
dtb Chemin d'accès à l'image DTB incluse dans les images de démarrage/récupération.
dtb_offset Lorsqu'il est ajouté à l'argument de base , fournit l'adresse de chargement physique pour l'arborescence finale des périphériques. Par exemple, si l'argument base est 0x10000000 et que l'argument dtb_offset est 0x01000000 , le dtb_addr_field dans l'en-tête de l'image de démarrage est renseigné comme 0x11000000 .

Le périphérique BoardConfig.mk utilise la configuration BOARD_MKBOOTIMG_ARGS pour ajouter la header version d'en-tête aux autres arguments spécifiques à la carte de mkbootimg . Par 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 construction Android utilise la variable BoardConfig BOARD_PREBUILT_DTBOIMAGE pour définir l'argument recovery_dtbo de l'outil mkbootimg lors de la création de l'image de récupération. Pour plus de détails sur les modifications du projet Android Open Source (AOSP), consultez les listes de modifications associées pour la gestion des versions de l'en-tête de l'image de démarrage .

En-tête d'image de démarrage, version 4

Android 12 fournit un boot_signature dans l'en-tête de l'image de démarrage version 4, qui peut être utilisé pour vérifier l'intégrité du noyau et du disque virtuel. La vérification est effectuée dans VtsSecurityAvbTest et est requise pour les appareils utilisant l'architecture GKI. Cependant, boot_signature n'est pas impliqué dans le processus de démarrage vérifié spécifique au périphérique et n'est utilisé que dans VTS. Voir la configuration de la carte GKI boot.img et les paramètres de démarrage vérifiés par GKI pour plus de détails.

La version 4 de l'en-tête d'image de démarrage du fournisseur prend en charge plusieurs fragments de disque virtuel de fournisseur.

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 d'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 :

  • Chargeur de démarrage de deuxième étape. Les champs second_size et second_addr n'apparaissent plus dans l'en-tête de l'image de démarrage. Les appareils dotés d'un chargeur de démarrage de deuxième étape doivent stocker ce chargeur de démarrage dans sa propre partition.

  • Image de récupération. L'exigence de spécifier une image de récupération est obsolète et les champs recovery_dtbo_size , recovery_dtbo_offset , recovery_acpio_size et recovery_acpio_offset n'apparaissent plus dans l'en-tête de l'image de démarrage.

    • Les périphériques 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 l'en-tête d'image de démarrage version 1 ou 2.

  • Blob d'arborescence de périphériques (DTB). Le DTB est stocké dans la partition de démarrage du fournisseur , de sorte que les champs dtb_size et dtb_addr n'apparaissent plus dans l'en-tête de l'image de démarrage (mais sont présents 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 d'image de démarrage pour se conformer à l'architecture Generic Kernel Image (GKI) , qui unifie le noyau principal et déplace les modules du fournisseur requis pour le démarrage vers la partition vendor_boot (ce qui signifie que l'image de démarrage ne contient que des composants GKI). Appareils qui :

  • Utilisez GKI (nécessite le noyau android-4.19 ou android-5.4) mais n'utilisez pas les mises à jour A/B peuvent spécifier une image de récupération en utilisant l'image de démarrage version 3 pour l'image de démarrage et l'image de démarrage version 2 pour l'image de récupération.

  • N'utilisez pas GKI et n'utilisez pas les mises à jour A/B peuvent spécifier une image de récupération en utilisant l'image de démarrage version 1 ou 2 pour les images de démarrage et de récupération.

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

En-tête d'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 d' 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 d'image de démarrage, version 1

Android 9 convertit le champ unused de l'en-tête de l'image de démarrage en un champ de version d'en-tête. Les appareils lancés avec Android 9 doivent utiliser l'en-tête de l'image de démarrage avec la version de l'en-tête définie sur 1 ou une version supérieure (ceci est vérifié 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 la récupération afin d'aider à atténuer les échecs de mise à jour par liaison radio (OTA). (Les périphériques A/B n'ont pas ce problème et n'ont 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 différentes architectures). Pour configurer correctement l'en-tête de l'image de démarrage, lors de l'utilisation :

  • Une image DTBO pour la récupération, incluez les champs recovery_dtbo_size et recovery_dtbo_offset (et n'incluez pas les champs recovery_acpio_size et recovery_acpio_offset ).

  • Une image ACPIO pour la récupération, incluez les champs recovery_acpio_size et recovery_acpio_offset (et n'incluez pas les champs recovery_dtbo_size et recovery_dtbo_offset ).

Le champ header_size contient la taille de l'en-tête de l'image de démarrage. Si la version de l'en-tête de l'image de démarrage est définie sur 1, le champ id contient le résumé SHA-1 pour la section recovery_[dtbo|acpio] de l'image de démarrage en plus des sections kernel , ramdisk et second sections . Pour plus de détails sur les recovery_[dtbo|acpio]_size et recovery_[dtbo|acpio]_offset , consultez Images de récupération .

En-tête d'image de démarrage hérité, version 0

Les appareils lancés avant Android 9 utilisant l'en-tête d'image de démarrage hérité sont considérés comme utilisant un en-tête d'image de démarrage version 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];
};