Реализации Android могут включать образ дерева устройств (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, объединенные один за другим. Загрузчик использует поле
totalsize
в каждом заголовке FDT для чтения и анализа соответствующего блока.Разделы DTB/DTBO. Загрузчик использует эффективный способ выбора правильного BLOB-объекта DT, анализируя структуру
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 (но до завершения полного обновления), устройство пытается загрузиться в режиме восстановления для завершения обновления. Однако, поскольку раздел 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 . |
Для указания пути к образу DTB необходимо использовать переменную конфигурации платы BOARD_PREBUILT_DTBIMAGE_DIR
. Если в каталоге 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, присутствующих в загрузочном образе.