Las implementaciones de Android pueden incluir una imagen de blob de árbol de dispositivos (DTB) para que la use el gestor de arranque. La ubicación de la imagen DTB (y las opciones para especificar los parámetros de la imagen DTB) difieren entre las versiones de Android.
En Android 11, los dispositivos que utilizan la imagen de kernel genérica (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 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, consulte Encabezado de inicio del proveedor .
En Android 10, los dispositivos pueden incluir la imagen DTB en la partición de inicio. Para especificar los parámetros de la imagen DTB, consulte Incluir la imagen DTB en la imagen de inicio .
En Android 9 y versiones anteriores, la imagen DTB puede existir en su propia partición o agregarse al kernel
image.gz
para crear la imagen kernel + DTB (que luego se pasa amkbootimg
para crearboot.img
).
formato de imagen DTB
En Android 10 y versiones posteriores, la imagen DTB debe utilizar uno de los siguientes formatos:
Los blobs DT se concatenaban uno tras otro. El gestor de arranque utiliza el campo
totalsize
en cada encabezado FDT para leer y analizar el blob correspondiente.Particiones DTB/DTBO. El gestor de arranque tiene una manera eficiente de seleccionar el blob DT correcto examinando la estructura
dt_table_entry
(contieneid
,rev
y camposcustom
) que puede contener información de identificación de hardware para la entrada). Para obtener más información, consulte Particiones DTB/DTBO .
Incluir la imagen DTB en la imagen de arranque
Los dispositivos que ejecutan Android 10 pueden incluir la imagen DTB en la imagen de inicio. Esto elimina la necesidad de que Android admita secuencias de comandos que agregan la imagen DTB a image.gz
en el kernel y permite el uso de la prueba Vendor Test Suite (VTS) para verificar (y estandarizar) la ubicación de DTB.
Además, para dispositivos que no son A/B, es más seguro tener el DTB como parte de la imagen de recuperación en lugar de en una partición separada para evitar problemas causados por OTA interrumpidas. Durante una OTA, si ocurre un problema después de actualizar la partición DTB (pero antes de completar la actualización completa), el dispositivo intenta iniciar en modo de recuperación para completar la OTA; sin embargo, debido a que la partición DTB ya se actualizó, podría ocurrir una discrepancia con la imagen de recuperación (que aún no se ha actualizado). Tener la imagen DTB como parte del formato de la imagen de inicio evita estos problemas al hacer 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 utilizando la siguiente estructura de imagen de inicio.
Sección de imagen de arranque | Número de páginas |
---|---|
Encabezado de arranque (1 página) | 1 |
Núcleo (l páginas) | l = ( kernel_size + page_size - 1) / page_size |
Disco RAM (m páginas) | m = ( ramdisk_size + page_size - 1) / page_size |
Gestor de arranque de segunda etapa (n páginas) | n = ( second_size + page_size - 1) / page_size |
Recuperación DTBO (o páginas) | o = ( recovery_dtbo_size + page_size - 1) / page_size |
DTB (p páginas) | p = ( dtb_size + page_size - 1) / page_size |
Ruta de la imagen DTB
Para dispositivos que ejecutan Android 10, puede utilizar la herramienta mkbootimg.py
y los siguientes argumentos para especificar la ruta a la imagen DTB.
Argumento | Descripción |
---|---|
dtb | Ruta a la imagen DTB que se incluirá 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 . |
La variable de configuración de la placa BOARD_PREBUILT_DTBIMAGE_DIR
debe usarse para especificar la ruta a la imagen DTB. Si hay más de un archivo con extensión *.dtb
en el directorio BOARD_PREBUILT_DTBIMAGE_DIR
, el sistema de compilación de Android concatena los archivos para crear la imagen DTB final utilizada en la creación de la imagen de inicio.
Para pasar el argumento dtb
a mkbootimg.py
con la imagen DTB del directorio especificado por BOARD_PREBUILT_DTBIMAGE_DIR
, la variable de configuración de la placa BOARD_INCLUDE_DTB_IN_BOOTIMG
debe establecerse en true
. Por ejemplo:
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
Puede agregar el argumento dtb_offset
a la variable de configuración de la placa BOARD_MKBOOTIMG_ARGS
con las otras compensaciones 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)
Soporte de cargador de arranque
Para que VTS se ejecute correctamente en dispositivos que ejecutan Android 10, el gestor de arranque debe admitir la imagen de arranque actualizada y debe agregar el parámetro de línea de comando del kernel androidboot.dtb_idx
para indicar el índice del árbol de dispositivos seleccionado (DT). Puede especificar solo un (1) índice. Por ejemplo, el parámetro androidboot.dtb_idx=N
informa N
como el índice de base cero del árbol de dispositivos seleccionado por el gestor de arranque del conjunto de DTB presentes en la imagen de arranque.