Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Encabezado de imagen de arranque

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

  • Android 12 puede utilizar la versión de arranque encabezado 3 o 4. Para los dispositivos que soportan el núcleo genérico de imagen (GKI) la arquitectura, la versión 4 es la imagen de arranque principal.
  • Android 11 puede utilizar la versión de cabecera de arranque 3. Para dispositivos que admiten núcleo genérico de imagen (GKI) la arquitectura, esta versión se debe utilizar la imagen de arranque primario para.
  • Android 10 debe usar la versión 2 del encabezado de arranque.
  • Android 9 debe usar la versión 1 del encabezado de arranque.
  • Se considera que Android 8 y versiones anteriores utilizan una versión de encabezado de imagen de arranque 0.

Para todos los dispositivos que funcionan con Android 9 o superior, el conjunto de pruebas de proveedor (VTS) comprueba el formato del boot/recovery imagen para asegurarse de que el encabezado de la imagen de arranque usa la versión correcta. Para ver los detalles AOSP en todos los proveedores de arranque y cabeceras de imagen de arranque actualmente soportadas, consulte system/tools/mkbootimg/include/bootimg/bootimg.h .

Implementar el control de versiones del encabezado de la imagen de arranque

El mkbootimg herramienta 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 admite 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. Non-A / B usando dispositivos header_version :
  • 1 o 2 puede especificar este camino o utilizar el recovery_acpio sección para especificar una ruta de una imagen de recuperación ACPIO a.
  • 3 no se 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. Non-A / B usando dispositivos header_version :
  • 1 o 2 puede especificar este camino o utilizar el recovery_dtbo sección para especificar una ruta de una imagen de DTBO recuperación a.
  • 3 no se puede especificar una imagen ACPIO de recuperación.
dtb Ruta a la imagen de DTB que se incluye en las imágenes de arranque / recuperación.
dtb_offset Cuando se añade a la base argumento, proporciona la dirección de carga física para el árbol de dispositivos final. Por ejemplo, si la base argumento es 0x10000000 y el dtb_offset argumento es 0x01000000 , el dtb_addr_field en el encabezado de la imagen de arranque está poblada como 0x11000000 .

El dispositivo BoardConfig.mk utiliza la configuración BOARD_MKBOOTIMG_ARGS añadir header version a los otros argumentos tablero-específicas 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 construcción Android utiliza el BoardConfig variables BOARD_PREBUILT_DTBOIMAGE a establecer el argumento recovery_dtbo del mkbootimg herramienta durante la creación de la imagen de recuperación. Para detalles sobre el proyecto de código abierto Android cambios (AOSP), revisar las listas de cambios asociados para la cabecera de imagen de arranque de versiones .

Encabezado de imagen de arranque, versión 4

Android 12 proporciona una boot_signature en la versión de arranque encabezado de la imagen 4, que se puede utilizar para comprobar la integridad del núcleo y el disco RAM. La comprobación se realiza en VtsSecurityAvbTest y es necesario para los dispositivos que utilizan la arquitectura GKI 2.0. Sin embargo, el boot_signature no está involucrado en el proceso de arranque de dispositivo específico verificado y sólo se utiliza en VTS. Ver GKI integración 2.0 boot.img para más detalles.

Proveedor de cabecera de imagen de arranque de la versión 4 es compatible con fragmentos del disco ram múltiples proveedores.

La versión 4 de la versión del encabezado de la imagen de arranque 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 arranque a la versión 3, que elimina los siguientes datos:

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

  • Imagen de recuperación. El requisito para especificar una imagen de recuperación ya no se utiliza, y los recovery_dtbo_size , recovery_dtbo_offset , recovery_acpio_size y recovery_acpio_offset campos ya no aparecen en el encabezado de la imagen de arranque.

    • 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 no A / B que deseen especificar una imagen de recuperación (DTBO o ACPIO) deben usar la versión 1 o 2 del encabezado de la imagen de arranque.

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

Los dispositivos se pueden utilizar imágenes de arranque de la versión 3 de cabecera para cumplir con núcleo genérico de imagen (GKI) arquitectura, que unifica el núcleo central y se mueve proveedor de módulos que son necesarios para el arranque a la vendor_boot partición (es decir, la imagen de arranque contiene sólo 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 arranque versión 3 para la imagen de arranque y la imagen de arranque 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 arranque tanto para las imágenes de arranque como para las de recuperación.

La versión 3 de la versión del encabezado de la imagen de arranque 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 actualizaciones de la cabecera de imagen de arranque a la versión 2, que añade una sección de recuperación de imagen DTB información (tamaño de la imagen y la dirección de la carga física).

La versión 2 de la versión del encabezado de la imagen de arranque 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 la unused del campo de la cabecera de la imagen de arranque en un campo de versión de cabecera. Los dispositivos que se inician con Android 9 deben usar el encabezado de la imagen de arranque con la versión del encabezado establecida en 1 o superior (esto lo verifica VTS).

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

No A / B dispositivos puede especificar una imagen superpuesta DTB / ACPI para la recuperación para ayudar a mitigar el exceso de aire (OTA) errores de actualización. (Los dispositivos A / B no tienen este problema y no necesitan especificar una imagen de superposición). Puede especificar una imagen DTBO o una imagen ACPIO, pero no ambas (porque las usan diferentes arquitecturas). Para configurar el encabezado de la imagen de arranque correctamente, al usar:

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

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

El header_size campo contiene el tamaño de la cabecera de imagen de arranque. Si la versión de la cabecera de imagen de inicio se establece en 1, la id campo contiene el SHA-1 digerir para el recovery_[dtbo|acpio] sección de la imagen de arranque, además del kernel , ramdisk , y la second sections . Para más detalles sobre la recovery_[dtbo|acpio]_size y recovery_[dtbo|acpio]_offset campos, ver 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 usan el encabezado de imagen de arranque heredado usan un encabezado de imagen de arranque 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];
};