Las implementaciones de Android pueden incluir una imagen de BLOB del árbol de dispositivos (DTB) para que la use el bootloader. La ubicación de la imagen de DTB (y las opciones para especificar los parámetros de la imagen de DTB) difieren entre las versiones de Android.
En Android 11, los dispositivos que usan la imagen genérica del kernel (GKI) deben admitir la partición de inicio del proveedor, que incluye toda la información específica del proveedor que se reubicó desde la partición de inicio. Debido a que la imagen del DTB contiene datos específicos del proveedor, ahora forma parte de la partición de inicio del proveedor. Para especificar los parámetros de la imagen DTB, consulta Inicio del proveedor encabezado.
En Android 10, los dispositivos pueden incluir la imagen de DTB en la partición de inicio. Para especificar los parámetros de la imagen DTB, consulta Incluye la DTB. en la imagen de arranque.
En Android 9 y versiones anteriores, la imagen de DTB puede existir en su propia partición o adjuntarse al kernel
image.gz
para crear el kernel + la imagen de DTB (que luego se pasa amkbootimg
para crearboot.img
).
Formato de imagen de DTB
En Android 10 y versiones posteriores, la imagen DTB debe usar una de los siguientes formatos:
Búferes de DT concatenados uno tras otro. El bootloader usa el campo
totalsize
en cada encabezado de FDT para leer y analizar el blob correspondiente.Particiones de DTB/DTBO. El bootloader tiene una forma eficiente de seleccionar el BLOB de DT correcto examinando el struct
dt_table_entry
(contieneid
,rev
ycustom
) que pueden contener información de identificación del hardware para la entrada. Para obtener más información, consulta DTB/DTBO. Particiones.
Cómo incluir la imagen del DTB en la imagen de arranque
Los dispositivos que ejecutan Android 10 pueden incluir la imagen DTB en
la imagen de arranque. Esto elimina la necesidad de que Android admita secuencias de comandos que adjunten la imagen de DTB a image.gz
en el kernel y habilita el uso de la prueba del Conjunto de pruebas del proveedor (VTS) para verificar (y estandarizar) la ubicación de DTB.
Además, en el caso de los dispositivos que no son de A/B, es más seguro tener la DTB como parte de la imagen de recuperación en lugar de en una partición independiente para evitar problemas causados por OTAs interrumpidos. Durante una actualización inalámbrica, si se produce un problema después de actualizar la partición de DTB (pero antes de completar la actualización completa), el dispositivo intenta iniciarse en el modo de recuperación para completar la actualización inalámbrica. Sin embargo, como la partición de DTB ya se actualizó, podría producirse una discrepancia con la imagen de recuperación (que aún no se actualizó). Tener la imagen de DTB como parte del formato de imagen de arranque evita estos problemas, ya que hace que la imagen de recuperación sea autosuficiente (es decir, no depende de otra partición).
Estructura de la imagen de arranque
Los dispositivos que ejecutan Android 10 pueden incluir una imagen DTB con la siguiente estructura de imagen de inicio.
Sección de imagen de arranque | Cantidad de páginas |
---|---|
Encabezado de inicio (1 página) | 1 |
Kernel (páginas de l) | l = (kernel_size + page_size -
1) de page_size |
Ramdisk (m de páginas) | m = (ramdisk_size + page_size -
1) de page_size |
bootloader de segunda etapa (n páginas) | n = (second_size + page_size - 1) / page_size |
DTBO de recuperación (o páginas) | o = (recovery_dtbo_size + page_size -
1) de page_size |
DTB (p páginas) | p = (dtb_size + page_size -
1) de page_size |
Ruta de acceso a la imagen de DTB
Para dispositivos con Android 10, puedes usar
Herramienta mkbootimg.py
y los siguientes argumentos para especificar la ruta de acceso a la DTB
imagen.
Argumento | Descripción |
---|---|
dtb |
La ruta de acceso a la imagen DTB que se incluirá 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 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 propaga como 0x11000000 . |
Se debe usar la variable de configuración de la placa BOARD_PREBUILT_DTBIMAGE_DIR
para especificar la ruta de acceso a la imagen de la DTB. Si hay más de un archivo con la extensión *.dtb
presente en el directorio BOARD_PREBUILT_DTBIMAGE_DIR
, el sistema de compilación de Android
concatena los archivos para crear la imagen DTB final que se usa en la imagen de inicio
de la creación de cuentas de servicio.
Para pasar el argumento dtb
a mkbootimg.py
con la imagen DTB de la
que especifica BOARD_PREBUILT_DTBIMAGE_DIR
, la variable de configuración de la placa
BOARD_INCLUDE_DTB_IN_BOOTIMG
se debe establecer en true
. Por ejemplo:
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
Puedes agregar el argumento dtb_offset
a la variable de configuración de la placa BOARD_MKBOOTIMG_ARGS
con los otros desplazamientos y la versión del encabezado. Por ejemplo:
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Compatibilidad con el bootloader
Para que VTS se ejecute correctamente en dispositivos que ejecutan Android 10, el bootloader debe admitir la imagen de inicio actualizada y agregar el parámetro de línea de comandos del kernel androidboot.dtb_idx
para indicar el índice del árbol de dispositivos (DT) seleccionado. Solo puedes especificar un (1) índice. Por ejemplo, el parámetro androidboot.dtb_idx=N
informa N
como la
índice basado en cero del árbol de dispositivos seleccionado por el bootloader del conjunto de
Las DTB presentes en la imagen de arranque.