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

Particiones de arranque del proveedor

Android 11 introdujo el concepto de imagen de kernel genérica (GKI). Para habilitar fácilmente arrancar un dispositivo arbitrario con el GKI, Android 11 dispositivos pueden usar la versión de arranque encabezado de la imagen 3. En la versión 3, toda la información específica del proveedor como un factor fuera de la boot partición y se trasladó a un nuevo vendor_boot partición. Un dispositivo de lanzamiento ARM64 con Android 11 en el kernel 5.4 de Linux debe ser compatible con el vendor_boot partición y la actualización boot formato de partición para pasar las pruebas con el GKI.

12 dispositivos Android pueden utilizar la versión de arranque encabezado de la imagen 4, que apoya que incluye múltiples discos ram proveedor en el vendor_boot partición. Varios fragmentos de disco ram de proveedor se concatenan uno tras otro en la sección de disco ram de proveedor. Se utiliza una tabla de disco RAM de proveedor para describir el diseño de la sección de disco RAM de proveedor y los metadatos de cada fragmento de disco RAM de proveedor.

Estructura de partición

La partición de arranque del proveedor es A / B con A / B virtual y está protegida por Android Verified Boot.

Versión 3

La partición consta de un encabezado, el disco RAM del proveedor y el blob del árbol de dispositivos (DTB).

Sección Número de páginas
Encabezado de inicio del proveedor (n páginas) n = (2112 + page_size - 1) / page_size
Proveedor ramdisk (o páginas) o = (vendor_ramdisk_size + page_size - 1) / page_size
DTB (p páginas) p = (dtb_size + page_size - 1) / page_size

Versión 4

La partición consta de un encabezado, la sección del disco ram del proveedor (que consta de todos los fragmentos del disco ram del proveedor, concatenados), el blob del árbol de dispositivos (DTB) y la tabla del disco ram del proveedor.

Sección Número de páginas
Encabezado de inicio del proveedor (n páginas) n = (2128 + page_size - 1) / page_size
Fragmentos de disco RAM del proveedor (o páginas) o = (vendor_ramdisk_size + page_size - 1) / page_size
DTB (p páginas) p = (dtb_size + page_size - 1) / page_size
Tabla de disco RAM de proveedor (q páginas) q = (vendor_ramdisk_table_size + page_size - 1) / page_size
Bootconfig (páginas r) r = (bootconfig_size + page_size - 1) / page_size

Encabezado de arranque del proveedor

El contenido de la cabecera de la partición de arranque proveedor consisten principalmente en datos que se han reubicados allí desde el encabezado de la imagen de arranque . También contiene información sobre el disco RAM del proveedor.

Versión 3

struct vendor_boot_img_hdr_v3
{
#define VENDOR_BOOT_MAGIC_SIZE 8
    uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
    uint32_t header_version;
    uint32_t page_size;           /* flash page size we assume */

    uint32_t kernel_addr;         /* physical load addr */
    uint32_t ramdisk_addr;        /* physical load addr */

    uint32_t vendor_ramdisk_size; /* size in bytes */

#define VENDOR_BOOT_ARGS_SIZE 2048
    uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];

    uint32_t tags_addr;           /* physical addr for kernel tags */

#define VENDOR_BOOT_NAME_SIZE 16
    uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
    uint32_t header_size;         /* size of vendor boot image header in
                                   * bytes */
    uint32_t dtb_size;            /* size of dtb image */
    uint64_t dtb_addr;            /* physical load address */

};

Versión 4

struct vendor_boot_img_hdr_v4
{
#define VENDOR_BOOT_MAGIC_SIZE 8
    uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
    uint32_t header_version;
    uint32_t page_size;           /* flash page size we assume */

    uint32_t kernel_addr;         /* physical load addr */
    uint32_t ramdisk_addr;        /* physical load addr */

    uint32_t vendor_ramdisk_size; /* size in bytes */

#define VENDOR_BOOT_ARGS_SIZE 2048
    uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];

    uint32_t tags_addr;           /* physical addr for kernel tags */

#define VENDOR_BOOT_NAME_SIZE 16
    uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
    uint32_t header_size;         /* size of vendor boot image header in
                                   * bytes */
    uint32_t dtb_size;            /* size of dtb image */
    uint64_t dtb_addr;            /* physical load address */

    uint32_t vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk table */
    uint32_t vendor_ramdisk_table_entry_num; /* number of entries in the vendor ramdisk table */
    uint32_t vendor_ramdisk_table_entry_size; /* size in bytes for a vendor ramdisk table entry */
    uint32_t bootconfig_size; /* size in bytes for the bootconfig section */
};

#define VENDOR_RAMDISK_TYPE_NONE 0
#define VENDOR_RAMDISK_TYPE_PLATFORM 1
#define VENDOR_RAMDISK_TYPE_RECOVERY 2
#define VENDOR_RAMDISK_TYPE_DLKM 3

struct vendor_ramdisk_table_entry_v4
{
    uint32_t ramdisk_size; /* size in bytes for the ramdisk image */
    uint32_t ramdisk_offset; /* offset to the ramdisk image in vendor ramdisk section */
    uint32_t ramdisk_type; /* type of the ramdisk */
#define VENDOR_RAMDISK_NAME_SIZE 32
    uint8_t ramdisk_name[VENDOR_RAMDISK_NAME_SIZE]; /* asciiz ramdisk name */

#define VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE 16
    // Hardware identifiers describing the board, soc or platform which this
    // ramdisk is intended to be loaded on.
    uint32_t board_id[VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE];
};
  • vendor_ramdisk_size es el tamaño total de todos los fragmentos proveedor del disco ram.
  • ramdisk_type indica el tipo del disco de memoria, los valores posibles son:
    • VENDOR_RAMDISK_TYPE_NONE indica el valor no está especificado.
    • VENDOR_RAMDISK_TYPE_PLATFORM discos ram contienen bits de plataforma específica. El cargador de arranque siempre debe cargarlos en la memoria.
    • VENDOR_RAMDISK_TYPE_RECOVERY discos ram contienen recursos de recuperación. El cargador de arranque debe cargarlos en la memoria al arrancar en recuperación.
    • VENDOR_RAMDISK_TYPE_DLKM discos ram contienen los módulos del núcleo cargables dinámicos.
  • ramdisk_name es un nombre único del disco RAM.
  • board_id es un vector de identificadores de hardware de proveedor definido.

Soporte de cargador de arranque

Debido a que la partición de arranque del proveedor contiene información (como el tamaño de la página flash, el kernel, las direcciones de carga del disco ram, la propia DTB) que existía anteriormente en la partición de arranque, el cargador de arranque debe acceder a las particiones de arranque y del proveedor para tener suficientes datos para completar el arranque. .

El gestor de arranque debe cargar el disco de memoria genérica en la memoria inmediatamente después del disco de memoria proveedor (el CPIO, gzip, y formatos LZ4 apoyar este tipo de concatenación). No alinee la imagen genérica del ramdisk ni introduzca ningún otro espacio entre ella y el final del ramdisk del proveedor en la memoria. Después de que los descomprime kernel, extrae el archivo concatenado en un initramfs , que da como resultado una estructura de archivos que es un disco de memoria genérica superpuesta sobre la estructura de archivos de disco RAM vendedor.

Debido a que el ramdisk genérico y el ramdisk del proveedor se concatenan, deben tener el mismo formato. La imagen de arranque de GKI usa un ramdisk genérico comprimido con lz4, por lo que un dispositivo que sea compatible con GKI debe usar un ramdisk de proveedor comprimido con lz4. La configuración para esto se muestra a continuación.

Los requisitos del gestor de arranque para apoyar bootconfig se explican en la implementación Bootconfig página.

Ramdisks de varios proveedores (versión 4)

Con la versión de arranque encabezado de la imagen 4, el gestor de arranque puede seleccionar un subconjunto o la totalidad de los discos ram proveedores a cargar como el initramfs durante el arranque. La tabla de ramdisk del proveedor contiene los metadatos de cada ramdisk y puede ayudar al cargador de arranque a decidir qué ramdisks cargar. El gestor de arranque puede decidir el orden de carga de los ramdisks del proveedor seleccionado, siempre que el ramdisk genérico se cargue en último lugar.

Por ejemplo, el cargador de arranque puede omitir discos ram carga de proveedores de tipo VENDOR_RAMDISK_TYPE_RECOVERY durante el arranque normal a recursos de conserva, por lo único proveedor discos ram de tipo VENDOR_RAMDISK_TYPE_PLATFORM y VENDOR_RAMDISK_TYPE_DLKM se cargan en memoria. Por otra parte, discos ram proveedores de tipo VENDOR_RAMDISK_TYPE_PLATFORM , VENDOR_RAMDISK_TYPE_RECOVERY y VENDOR_RAMDISK_TYPE_DLKM se cargan en memoria cuando se arranca en modo de recuperación.

Alternativamente, el gestor de arranque puede ignorar la tabla de disco RAM del proveedor y cargar toda la sección de disco RAM del proveedor. Esto tiene el mismo efecto que hace la carga de todos los fragmentos proveedor ramdisk en el vendor_boot partición.

Construir soporte

Para implementar el soporte de arranque del proveedor para un dispositivo:

  • Conjunto BOARD_BOOT_HEADER_VERSION a 3 o mayor.

  • Conjunto BOARD_RAMDISK_USE_LZ4 a true si su dispositivo es compatible con GKI, o si de lo contrario utiliza un disco de memoria genérica LZ4-comprimido.

  • Conjunto BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE a un tamaño adecuado para su dispositivo, teniendo en cuenta los módulos del núcleo que debe ir en el disco RAM vendedor.

  • Actualizar AB_OTA_PARTITIONS que incluyen vendor_boot y en cualquier lista de proveedores específicos de las particiones de OTA en el dispositivo.

  • Copiar su dispositivo fstab en /first_stage_ramdisk en el vendor_boot partición, no el boot de la partición. Por ejemplo, $(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM) .

Para incluir múltiples discos ram proveedores en vendor_boot :

  • Establecer BOARD_BOOT_HEADER_VERSION a 4 .
  • Set BOARD_VENDOR_RAMDISK_FRAGMENTS a una lista de proveedores lógica nombres de fragmentos de disco de memoria que se incluirán en vendor_boot .

  • Para agregar un proveedor de pre-compilados disco RAM, sistema de BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).PREBUILT a la ruta del archivo creado previamente.

  • Para agregar un proveedor disco RAM DLKM, juego BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).KERNEL_MODULE_DIRS a la lista de directorios de módulos del kernel para ser incluidos.

  • Conjunto BOARD_VENDOR_RAMDISK_FRAGMENT.$(vendor_ramdisk).MKBOOTIMG_ARGS a mkbootimg argumentos. Estos son los --board_id[0-15] y --ramdisk_type argumentos para el fragmento proveedor disco RAM. Para DLKM proveedor disco RAM, el valor predeterminado --ramdisk_type sería DLKM si no se especifica lo contrario.

Para construir recursos para la recuperación como un independiente recovery disco RAM en vendor_boot :

  • Establecer BOARD_BOOT_HEADER_VERSION a 4 .
  • Establecer BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT de true .
  • Establecer BOARD_INCLUDE_RECOVERY_RAMDISK_IN_VENDOR_BOOT de true .
  • Esto añade un fragmento proveedor disco de memoria cuya ramdisk_name es recovery y ramdisk_type es VENDOR_RAMDISK_TYPE_RECOVERY . El disco de memoria a continuación, contiene todos los archivos de recuperación, que son archivos instalados en $(TARGET_RECOVERY_ROOT_OUT) .

mkbootimg argumentos

Argumento Descripción
--ramdisk_type El tipo de disco RAM, puede ser uno de NONE , PLATFORM , RECOVERY o DLKM .
--board_id[0-15] Especificar el board_id vector, por defecto es 0 .

A continuación se muestra un ejemplo de configuración:

BOARD_KERNEL_MODULE_DIRS := foo bar baz
BOARD_BOOT_HEADER_VERSION := 4
BOARD_VENDOR_RAMDISK_FRAGMENTS := dlkm_foobar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.KERNEL_MODULE_DIRS := foo bar
BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm_foobar.MKBOOTIMG_ARGS := --board_id0 0xF00BA5 --board_id1 0xC0FFEE

El resultante vendor_boot contendría dos fragmentos proveedor del disco ram. El primero de ellos es el disco de memoria "por defecto", que contiene el directorio DLKM baz y el resto de los archivos en $(TARGET_VENDOR_RAMDISK_OUT) . El segundo es el dlkm_foobar disco de memoria, que contiene los directorios DLKM foo y bar , y los --ramdisk_type por defecto DLKM .