Encabezado de imagen de arranque

Android 9 introdujo un campo de versión en el encabezado de la imagen de inicio, lo que permite actualizaciones del encabezado manteniendo la compatibilidad con versiones anteriores. El gestor de arranque debe verificar el campo de versión del encabezado y analizar el encabezado en consecuencia. Dispositivos que se inician con:

  • Android 13 puede usar la versión 3 o 4 del encabezado de inicio. Para los dispositivos que admiten la arquitectura de imagen de kernel genérica (GKI) , la versión 4 es la imagen de inicio principal y el campo os_version en el encabezado de inicio debe ser cero. Se espera que el gestor de arranque del dispositivo obtenga la información de la versión de las propiedades de arranque verificado de Android (AVB) .
  • Android 12 puede usar la versión 3 o 4 del encabezado de arranque. Para los dispositivos que admiten la arquitectura de imagen de kernel genérica (GKI) , la versión 4 es la imagen de arranque principal.
  • Android 11 puede usar la versión 3 del encabezado de arranque. Para dispositivos que admiten la arquitectura de imagen de kernel genérica (GKI) , esta versión debe usarse para la imagen de arranque principal.
  • Android 10 debe usar el encabezado de arranque versión 2.
  • Android 9 debe usar el encabezado de arranque versión 1.
  • Se considera que Android 8 y versiones anteriores utilizan un encabezado de imagen de inicio versión 0.

Para todos los dispositivos que ejecutan Android 9 o superior, Vendor Test Suite (VTS) verifica el formato de la imagen boot/recovery para garantizar que el encabezado de la imagen de inicio utilice la versión correcta. Para ver los detalles de AOSP en todos los encabezados de imágenes de arranque de proveedores y de arranque actualmente admitidos, consulte system/tools/mkbootimg/include/bootimg/bootimg.h .

Implementación del control de versiones del encabezado de la imagen de arranque

La herramienta mkbootimg acepta los siguientes argumentos.

Argumento Descripción
header_version Establece la versión del encabezado de la imagen de arranque. Una imagen de arranque con una versión de encabezado:
  • 1 o 2 admiten una imagen DTBO de recuperación o una imagen ACPIO de recuperación.
  • 3 no admite imágenes de recuperación.
recovery_dtbo Se utiliza para arquitecturas que utilizan DTB. Especifica la ruta a la imagen DTBO de recuperación. Opcional para dispositivos A/B, que no necesitan una imagen de recuperación. Dispositivos que no son A/B que usan header_version :
  • 1 o 2 pueden especificar esta ruta o usar la sección recovery_acpio para especificar una ruta a una imagen ACPIO de recuperación.
  • 3 no puede especificar una imagen DTBO de recuperación.
recovery_acpio Se utiliza para arquitecturas que utilizan ACPI en lugar de DTB. Especifica la ruta a la imagen ACPIO de recuperación. Opcional para dispositivos A/B, que no necesitan una imagen de recuperación. Dispositivos que no son A/B que usan header_version :
  • 1 o 2 pueden especificar esta ruta o usar la sección recovery_dtbo para especificar una ruta a una imagen DTBO de recuperación.
  • 3 no puede especificar una imagen ACPIO de recuperación.
dtb Ruta a la imagen DTB que se incluye en las imágenes de arranque/recuperación.
dtb_offset Cuando se agrega al argumento base , proporciona la dirección de carga física para el árbol de dispositivos final. Por ejemplo, si el argumento base es 0x10000000 y el argumento dtb_offset es 0x01000000 , el dtb_addr_field en el encabezado de la imagen de inicio se completa como 0x11000000 .

El dispositivo BoardConfig.mk usa la configuración BOARD_MKBOOTIMG_ARGS para agregar header version a los otros argumentos específicos de la placa de mkbootimg . Por ejemplo:

BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)

El sistema de compilación de Android utiliza la variable BoardConfig BOARD_PREBUILT_DTBOIMAGE para configurar el argumento recovery_dtbo de la herramienta mkbootimg durante la creación de la imagen de recuperación. Para obtener detalles sobre los cambios del Proyecto de código abierto de Android (AOSP), revise las listas de cambios asociadas para el control de versiones del encabezado de la imagen de arranque .

Encabezado de imagen de arranque, versión 4

Android 12 proporciona una boot_signature en el encabezado de la imagen de arranque versión 4, que se puede usar para verificar la integridad del kernel y el disco ram. La verificación se realiza en VtsSecurityAvbTest y es necesaria para dispositivos que utilizan la arquitectura GKI. Sin embargo, boot_signature no participa en el proceso de inicio verificado específico del dispositivo y solo se usa en VTS. Consulte la configuración de la placa GKI boot.img y la configuración de inicio verificada de GKI para obtener más detalles.

La versión 4 del encabezado de la imagen de arranque del proveedor admite múltiples fragmentos de disco RAM del proveedor.

La versión 4 de la versión del encabezado de la imagen de inicio utiliza el siguiente 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 */
};

Encabezado de imagen de arranque, versión 3

Android 11 actualiza el encabezado de la imagen de inicio a la versión 3, que elimina los siguientes datos:

  • Cargador de arranque de segunda etapa. Los campos second_size y second_addr ya no aparecen en el encabezado de la imagen de inicio. Los dispositivos con un gestor de arranque de segunda etapa deben almacenar ese gestor de arranque en su propia partición.

  • Imagen de recuperación. El requisito de especificar una imagen de recuperación ha quedado obsoleto y los campos recovery_dtbo_size , recovery_dtbo_offset , recovery_acpio_size y recovery_acpio_offset ya no aparecen en el encabezado de la imagen de inicio.

    • Los dispositivos A/B utilizan un esquema de actualización y recuperación que hace innecesario especificar una imagen DTBO o ACPIO para la recuperación.

    • Los dispositivos que no son A/B y desean especificar una imagen de recuperación (ya sea DTBO o ACPIO) deben usar el encabezado de imagen de inicio versión 1 o 2.

  • Blob de árbol de dispositivos (DTB). El DTB se almacena en la partición de inicio del proveedor , por lo que los campos dtb_size y dtb_addr ya no aparecen en el encabezado de la imagen de inicio (pero están presentes en el encabezado de la imagen de inicio del proveedor).

Los dispositivos pueden usar la versión 3 del encabezado de la imagen de inicio para cumplir con la arquitectura Generic Kernel Image (GKI) , que unifica el núcleo central y mueve los módulos del proveedor necesarios para el inicio a la partición vendor_boot (lo que significa que la imagen de inicio contiene solo componentes GKI). Dispositivos que:

  • Use GKI (requiere el kernel android-4.19 o android-5.4) pero no use actualizaciones A/B. Puede especificar una imagen de recuperación usando la imagen de inicio versión 3 para la imagen de inicio y la imagen de inicio versión 2 para la imagen de recuperación.

  • No use GKI y no use actualizaciones A/B, puede especificar una imagen de recuperación usando la versión 1 o 2 de la imagen de inicio tanto para las imágenes de inicio como para las de recuperación.

La versión 3 de la versión del encabezado de la imagen de inicio utiliza el siguiente 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];
};

Encabezado de imagen de arranque, versión 2

Android 10 actualiza el encabezado de la imagen de arranque a la versión 2, que agrega una sección para recuperar información de la imagen DTB (tamaño de la imagen y dirección de carga física).

La versión 2 de la versión del encabezado de la imagen de inicio utiliza el siguiente 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 */
};

Encabezado de imagen de arranque, versión 1

Android 9 convierte el campo unused del encabezado de la imagen de inicio en un campo de versión del encabezado. Los dispositivos que se inician con Android 9 deben usar el encabezado de la imagen de inicio con la versión del encabezado configurada en 1 o superior (esto lo verifica VTS).

La versión 1 de la versión del encabezado de la imagen de inicio utiliza el siguiente 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 */
};

Los dispositivos que no son A/B pueden especificar una imagen superpuesta DTB/ACPI para la recuperación y ayudar a mitigar las fallas de actualización inalámbrica (OTA). (Los dispositivos A/B no tienen este problema y no necesitan especificar una imagen superpuesta). Puede especificar una imagen DTBO o una imagen ACPIO, pero no ambas (porque las utilizan diferentes arquitecturas). Para configurar el encabezado de la imagen de inicio correctamente, al usar:

  • Una imagen DTBO para recuperación incluye los campos recovery_dtbo_size y recovery_dtbo_offset (y no incluye los campos recovery_acpio_size y recovery_acpio_offset ).

  • Una imagen ACPIO para recuperación incluye los campos recovery_acpio_size y recovery_acpio_offset (y no incluye los campos recovery_dtbo_size y recovery_dtbo_offset ).

El campo header_size contiene el tamaño del encabezado de la imagen de inicio. Si la versión del encabezado de la imagen de arranque está configurada en 1, el campo id contiene el resumen SHA-1 para la sección recovery_[dtbo|acpio] de la imagen de arranque además del kernel , ramdisk y second sections . Para obtener detalles sobre los campos recovery_[dtbo|acpio]_size y recovery_[dtbo|acpio]_offset , consulte Imágenes de recuperación .

Encabezado de imagen de arranque heredado, versión 0

Se considera que los dispositivos lanzados antes de Android 9 que utilizan el encabezado de imagen de inicio heredado utilizan un encabezado de imagen de inicio versión 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];
};