Реализации Android могут включать образ дерева устройств (DTB) для использования загрузчиком. Расположение образа DTB (и параметры указания параметров образа DTB) различаются в разных выпусках Android.
В Android 11 устройства, использующие Generic Kernel Image (GKI), должны поддерживать раздел загрузки поставщика , который включает всю информацию, специфичную для поставщика, которая была перемещена из раздела загрузки. Поскольку образ DTB содержит данные, специфичные для поставщика, он теперь является частью раздела загрузки поставщика. Чтобы указать параметры образа DTB, см. раздел Заголовок загрузки поставщика .
В Android 10 устройства могут включать образ DTB в загрузочный раздел. Чтобы указать параметры образа DTB, см . Включение образа DTB в загрузочный образ .
В Android 9 и ниже образ DTB может существовать в собственном разделе или быть добавлен к файлу kernel
image.gz
для создания образа ядра + DTB (который затем передается вmkbootimg
для созданияboot.img
).
Формат изображения DTB
В Android 10 и выше образ DTB должен использовать один из следующих форматов:
DT blobs, объединенные один за другим. Загрузчик использует поле
totalsize
в каждом заголовке FDT для чтения и анализа соответствующего blob.Разделы DTB/DTBO. Загрузчик имеет эффективный способ выбора правильного DT blob, проверяя структуру
dt_table_entry
(содержитid
,rev
иcustom
поля), которая может содержать информацию об идентификации оборудования для записи. Подробности см. в разделе Разделы DTB/DTBO .
Включить образ DTB в загрузочный образ
Устройства под управлением Android 10 могут включать образ DTB в загрузочный образ. Это устраняет необходимость поддержки скриптов Android, которые добавляют образ DTB к image.gz
в ядре, и позволяет использовать тест Vendor Test Suite (VTS) для проверки (и стандартизации) размещения DTB.
Кроме того, для устройств, не относящихся к A/B, безопаснее иметь DTB как часть образа восстановления, а не в отдельном разделе, чтобы предотвратить проблемы, вызванные прерванными OTA. Во время OTA, если проблема возникает после обновления раздела DTB (но до завершения полного обновления), устройство пытается загрузиться в режиме восстановления, чтобы завершить OTA; однако, поскольку раздел DTB уже был обновлен, может возникнуть несоответствие с образом восстановления (который еще не был обновлен). Наличие образа DTB как части формата загрузочного образа предотвращает такие проблемы, делая образ восстановления самодостаточным (то есть он не зависит от другого раздела).
Структура загрузочного образа
Устройства под управлением Android 10 могут включать образ DTB, используя следующую структуру загрузочного образа.
Раздел загрузочного образа | Количество страниц |
---|---|
Заголовок загрузки (1 страница) | 1 |
Ядро (l страниц) | l = ( kernel_size + page_size - 1) / page_size |
Ramdisk (млн страниц) | m = ( ramdisk_size + page_size - 1) / page_size |
Загрузчик второго этапа (n страниц) | n = ( second_size + page_size - 1) / page_size |
Восстановление DTBO (o страниц) | o = ( recovery_dtbo_size + page_size - 1) / page_size |
DTB (стр.) | p = ( dtb_size + page_size - 1) / page_size |
Путь к изображению DTB
Для устройств под управлением Android 10 можно использовать инструмент mkbootimg.py
и следующие аргументы, чтобы указать путь к образу DTB.
Аргумент | Описание |
---|---|
dtb | Путь к образу DTB, который будет включен в образы загрузки/восстановления. |
dtb_offset | При добавлении к аргументу base предоставляет физический адрес загрузки для конечного дерева устройств. Например, если аргумент base равен 0x10000000 , а аргумент dtb_offset равен 0x01000000 , поле dtb_addr_field в заголовке образа загрузки заполняется как 0x11000000 . |
Переменная конфигурации платы BOARD_PREBUILT_DTBIMAGE_DIR
должна использоваться для указания пути к образу DTB. Если в каталоге BOARD_PREBUILT_DTBIMAGE_DIR
присутствует более одного файла с расширением *.dtb
, система сборки Android объединяет файлы для создания окончательного образа DTB, используемого при создании загрузочного образа.
Чтобы передать аргумент dtb
в mkbootimg.py
с образом DTB из каталога, указанного в BOARD_PREBUILT_DTBIMAGE_DIR
, переменная конфигурации платы BOARD_INCLUDE_DTB_IN_BOOTIMG
должна быть установлена в true
. Например:
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
Вы можете добавить аргумент dtb_offset
к переменной конфигурации платы BOARD_MKBOOTIMG_ARGS
с другими смещениями и версией заголовка. Например:
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)
Поддержка загрузчика
Для успешного запуска VTS на устройствах под управлением Android 10 загрузчик должен поддерживать обновленный загрузочный образ и должен добавить параметр командной строки ядра androidboot.dtb_idx
для указания индекса выбранного дерева устройств (DT). Вы можете указать только один (1) индекс. Например, параметр androidboot.dtb_idx=N
сообщает N
как отсчитываемый от нуля индекс дерева устройств, выбранного загрузчиком из набора DTB, присутствующих в загрузочном образе.
Реализации Android могут включать образ дерева устройств (DTB) для использования загрузчиком. Расположение образа DTB (и параметры указания параметров образа DTB) различаются в разных выпусках Android.
В Android 11 устройства, использующие Generic Kernel Image (GKI), должны поддерживать раздел загрузки поставщика , который включает всю информацию, специфичную для поставщика, которая была перемещена из раздела загрузки. Поскольку образ DTB содержит данные, специфичные для поставщика, он теперь является частью раздела загрузки поставщика. Чтобы указать параметры образа DTB, см. раздел Заголовок загрузки поставщика .
В Android 10 устройства могут включать образ DTB в загрузочный раздел. Чтобы указать параметры образа DTB, см . Включение образа DTB в загрузочный образ .
В Android 9 и ниже образ DTB может существовать в собственном разделе или быть добавлен к файлу kernel
image.gz
для создания образа ядра + DTB (который затем передается вmkbootimg
для созданияboot.img
).
Формат изображения DTB
В Android 10 и выше образ DTB должен использовать один из следующих форматов:
DT blobs, объединенные один за другим. Загрузчик использует поле
totalsize
в каждом заголовке FDT для чтения и анализа соответствующего blob.Разделы DTB/DTBO. Загрузчик имеет эффективный способ выбора правильного DT blob, проверяя структуру
dt_table_entry
(содержитid
,rev
иcustom
поля), которая может содержать информацию об идентификации оборудования для записи. Подробности см. в разделе Разделы DTB/DTBO .
Включить образ DTB в загрузочный образ
Устройства под управлением Android 10 могут включать образ DTB в загрузочный образ. Это устраняет необходимость поддержки скриптов Android, которые добавляют образ DTB к image.gz
в ядре, и позволяет использовать тест Vendor Test Suite (VTS) для проверки (и стандартизации) размещения DTB.
Кроме того, для устройств, не относящихся к A/B, безопаснее иметь DTB как часть образа восстановления, а не в отдельном разделе, чтобы предотвратить проблемы, вызванные прерванными OTA. Во время OTA, если проблема возникает после обновления раздела DTB (но до завершения полного обновления), устройство пытается загрузиться в режиме восстановления, чтобы завершить OTA; однако, поскольку раздел DTB уже был обновлен, может возникнуть несоответствие с образом восстановления (который еще не был обновлен). Наличие образа DTB как части формата загрузочного образа предотвращает такие проблемы, делая образ восстановления самодостаточным (то есть он не зависит от другого раздела).
Структура загрузочного образа
Устройства под управлением Android 10 могут включать образ DTB, используя следующую структуру загрузочного образа.
Раздел загрузочного образа | Количество страниц |
---|---|
Заголовок загрузки (1 страница) | 1 |
Ядро (l страниц) | l = ( kernel_size + page_size - 1) / page_size |
Ramdisk (млн страниц) | m = ( ramdisk_size + page_size - 1) / page_size |
Загрузчик второго этапа (n страниц) | n = ( second_size + page_size - 1) / page_size |
Восстановление DTBO (o страниц) | o = ( recovery_dtbo_size + page_size - 1) / page_size |
DTB (стр.) | p = ( dtb_size + page_size - 1) / page_size |
Путь к изображению DTB
Для устройств под управлением Android 10 можно использовать инструмент mkbootimg.py
и следующие аргументы, чтобы указать путь к образу DTB.
Аргумент | Описание |
---|---|
dtb | Путь к образу DTB, который будет включен в образы загрузки/восстановления. |
dtb_offset | При добавлении к аргументу base предоставляет физический адрес загрузки для конечного дерева устройств. Например, если аргумент base равен 0x10000000 , а аргумент dtb_offset равен 0x01000000 , поле dtb_addr_field в заголовке образа загрузки заполняется как 0x11000000 . |
Переменная конфигурации платы BOARD_PREBUILT_DTBIMAGE_DIR
должна использоваться для указания пути к образу DTB. Если в каталоге BOARD_PREBUILT_DTBIMAGE_DIR
присутствует более одного файла с расширением *.dtb
, система сборки Android объединяет файлы для создания окончательного образа DTB, используемого при создании загрузочного образа.
Чтобы передать аргумент dtb
в mkbootimg.py
с образом DTB из каталога, указанного в BOARD_PREBUILT_DTBIMAGE_DIR
, переменная конфигурации платы BOARD_INCLUDE_DTB_IN_BOOTIMG
должна быть установлена в true
. Например:
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
Вы можете добавить аргумент dtb_offset
к переменной конфигурации платы BOARD_MKBOOTIMG_ARGS
с другими смещениями и версией заголовка. Например:
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)
Поддержка загрузчика
Для успешного запуска VTS на устройствах под управлением Android 10 загрузчик должен поддерживать обновленный загрузочный образ и должен добавить параметр командной строки ядра androidboot.dtb_idx
для указания индекса выбранного дерева устройств (DT). Вы можете указать только один (1) индекс. Например, параметр androidboot.dtb_idx=N
сообщает N
как отсчитываемый от нуля индекс дерева устройств, выбранного загрузчиком из набора DTB, присутствующих в загрузочном образе.