Android 9 introdujo un campo de versión en la imagen de inicio encabezado, lo que habilita las actualizaciones del encabezado y, al mismo tiempo, mantiene la retrocompatibilidad. El bootloader debe verificar el campo de versión del encabezado y analizarlo según corresponda. Dispositivos que se lanzan con:
- Android 13 puede usar la versión 3 o 4 del encabezado de inicio. Para
compatibles con la imagen genérica del kernel
(GKI)
de inicio, la versión 4 es la imagen de arranque principal y la
os_version
en el encabezado de inicio debe ser cero. Se espera que el bootloader del dispositivo obtener la información de la versión del inicio verificado de Android (AVB) propiedades en su lugar. - Android 12 puede usar las versiones 3 o 4 del encabezado de inicio. Para compatibles con la imagen genérica del kernel (GKI) arquitectura, la versión 4 es la imagen de arranque principal.
- Android 11 puede usar la versión 3 del encabezado de inicio. Para que admiten imágenes genéricas de kernel (GKI) , esta versión debe usarse para la imagen de arranque principal.
- Android 10 debe usar la versión 2 del encabezado de inicio.
- Android 9 debe usar la versión 1 del encabezado de inicio.
- Se considera que Android 8 y las versiones anteriores usan la versión 0 del encabezado de imagen de arranque.
Para todos los dispositivos que ejecutan Android 9 o versiones posteriores, la
El paquete de pruebas del proveedor (VTS) verifica el formato del
boot/recovery
para garantizar que el encabezado de la imagen de arranque use el elemento
versión. Cómo ver detalles del AOSP en todos los inicios compatibles y del proveedor
encabezados de imagen, consulta
system/tools/mkbootimg/include/bootimg/bootimg.h
Implementa el control de versiones del encabezado de 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:
|
recovery_dtbo |
Se usa para arquitecturas que usan DTB. Especifica la ruta de acceso a la recuperación.
Imagen de DTBO. Opcional para los dispositivos A/B, que no necesitan una imagen de recuperación.
Dispositivos que no son A/B y usan header_version :
|
recovery_acpio |
Se usa para arquitecturas que usan ACPI en lugar de DTB. Especifica la ruta de acceso.
a la imagen de recuperación de ACPIO. Opcional para los dispositivos A/B, que no necesitan un
la imagen de recuperación. Dispositivos que no son A/B y usan header_version :
|
dtb |
Ruta de acceso a la imagen DTB que se incluye en las imágenes de inicio y recuperación. |
dtb_offset |
Cuando se agrega al argumento base , proporciona la carga física
del árbol de dispositivos final. Por ejemplo, si base
el argumento es 0x10000000 y el argumento dtb_offset
es 0x01000000 , el dtb_addr_field en la imagen de arranque
se propaga 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 usa la variable BoardConfig
.
BOARD_PREBUILT_DTBOIMAGE
para establecer el argumento recovery_dtbo
de la
mkbootimg
durante la creación de la imagen de recuperación. Para obtener más información
Cambios en el Proyecto de código abierto de Android (AOSP), revisa las listas de cambios asociadas.
para el encabezado de la imagen de arranque
control de versiones.
Encabezado de la imagen de arranque, versión 4
Android 12 proporciona un boot_signature
en la imagen de arranque
versión 4 del encabezado, que se puede usar para comprobar la integridad del kernel y la
ramdisk La verificación se completa en
VtsSecurityAvbTest
y es necesaria para los dispositivos que usan la arquitectura de GKI. Sin embargo, el
boot_signature
no participa en el proceso de inicio verificado específico del dispositivo.
y solo se usa en VTS. Consulta el panel boot.img de GKI.
configuración
y el inicio verificado de GKI
Configuración
para conocer los detalles.
Imagen de arranque del proveedor encabezado La versión 4 admite varios fragmentos de ramdisk del proveedor.
La versión 4 del encabezado de imagen de arranque usa 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 la imagen de arranque, versión 3
Android 11 actualiza el encabezado de la imagen de arranque a la versión 3. lo que quita los siguientes datos:
Bootloader de segunda etapa. Los campos
second_size
ysecond_addr
no en el encabezado de la imagen de arranque. Dispositivos con un bootloader de segunda etapa debe almacenar el bootloader en su propia partición.Imagen de recuperación. El requisito de especificar una imagen de recuperación obsoleto, y
recovery_dtbo_size
,recovery_dtbo_offset
, Los camposrecovery_acpio_size
yrecovery_acpio_offset
ya no aparecen en el encabezado de la imagen de arranque.Los dispositivos A/B usan un esquema de actualización y recuperación que elimina la necesidad especificar una imagen DTBO o ACPIO para la recuperación.
Dispositivos que no son A/B y desean especificar una imagen de recuperación (ya sea DTBO o ACPIO) deben usar la versión 1 o 2 del encabezado de la imagen de arranque.
Búfer del árbol de dispositivos (DTB). La DTB se almacena en el inicio del proveedor partición, por lo que los campos
dtb_size
ydtb_addr
ya no aparecen en la imagen de arranque. encabezado de imagen de arranque del proveedor (pero están presentes en el encabezado de la imagen de arranque del proveedor).
Los dispositivos pueden usar la versión 3 del encabezado de la imagen de arranque para cumplir con la imagen genérica del kernel
(GKI) de Kubernetes,
que unifica el kernel principal y traslada los módulos de proveedores necesarios para
se inicia en la partición vendor_boot
(lo que significa que la imagen de arranque solo contiene GKI)
componentes). Dispositivos que:
Usa GKI (requiere el kernel android-4.19 o android-5.4), pero no lo uses. Con las actualizaciones A/B, se puede especificar una imagen de recuperación con la versión 3 de la imagen de arranque para el y la imagen de arranque versión 2 para la imagen de recuperación.
No uses GKI ni uses A/B. Las actualizaciones pueden especificar una imagen de recuperación mediante versión 1 o 2 de las imágenes de arranque y recuperación.
La versión 3 del encabezado de imagen de arranque usa 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 la 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 la recuperación DTB Información de la imagen (tamaño de la imagen) y la dirección de carga física).
La versión 2 del encabezado de imagen de arranque usa 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 la imagen de arranque, versión 1
Android 9 convierte el campo unused
del inicio
encabezado de imagen a un campo de versión de encabezado. Dispositivos que se lanzan con Android
9 debe usar el encabezado de imagen de arranque con el encabezado
versión establecida en 1 o superior (esto lo verifica VTS).
La versión 1 del encabezado de imagen de arranque usa 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 recuperación para mitigar las fallas en las actualizaciones inalámbricas (OTA). (Los dispositivos A/B no tienen este problema y no necesitas especificar una imagen superpuesta). Puedes especificar una imagen DTBO una imagen de ACPIO, pero no en ambas (ya que se usan en diferentes arquitecturas). Para configurar el encabezado de la imagen de arranque de forma correcta, haz lo siguiente:
Una imagen de DTBO para la recuperación, incluye el
recovery_dtbo_size
yrecovery_dtbo_offset
(y no incluyen los camposrecovery_acpio_size
nirecovery_acpio_offset
).Una imagen de ACPIO para la recuperación, incluye el
recovery_acpio_size
yrecovery_acpio_offset
(y no incluyen los camposrecovery_dtbo_size
nirecovery_dtbo_offset
).
El campo header_size
contiene el tamaño del encabezado de la imagen de arranque. Si el botón de arranque
versión del encabezado de imagen se estableció en 1, el campo id
contiene el resumen SHA-1 del
la sección recovery_[dtbo|acpio]
de la imagen de arranque, además de la
kernel
, ramdisk
y second sections
. Para obtener más información
recovery_[dtbo|acpio]_size
y recovery_[dtbo|acpio]_offset
, consulta
Imágenes de recuperación.
Encabezado de la imagen de arranque heredado, versión 0
Dispositivos lanzados antes de Android 9 con la versión heredada se considera que el encabezado de imagen de arranque usa la 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];
};