В реализациях Android может быть образ BLOB дерева устройств (DTB), используемый загрузчиком операционной системы. Расположение образа DTB (и параметры, которые можно указать для образа DTB) различаются в разных версиях Android.
В Android 11 устройства, использующие Generic Kernel Image (GKI), должны поддерживать раздел загрузки поставщика, в котором содержится вся информация, относящаяся к поставщику и перенесенная из раздела загрузки. Поскольку образ DTB содержит данные, относящиеся к определенному поставщику, теперь он является частью загрузочного раздела поставщика. Чтобы задать параметры изображения DTB, ознакомьтесь с разделом Заголовок загрузки поставщика.
В Android 10 устройства могут включать образ DTB в раздел загрузки. Чтобы указать параметры образа DTB, ознакомьтесь с разделом Как включить образ DTB в загрузочный образ.
В Android 9 и более ранних версиях образ DTB может находиться в собственном разделе или быть прикреплен к образу ядра
image.gzдля создания образа ядра + DTB (который затем передается вmkbootimgдля созданияboot.img).
Формат изображения DTB
В Android 10 и более поздних версий образ DTB должен быть в одном из следующих форматов:
Объединение объектов DT. Загрузчик использует поле
totalsizeв каждом заголовке FDT, чтобы прочитать и проанализировать соответствующий большой двоичный объект.Разделы DTB/DTBO. Загрузчик имеет эффективный способ выбора правильного объекта DT, изучая структуру
dt_table_entry(содержит поляid,revиcustom), в которой может храниться информация, идентифицирующая оборудование для записи. Подробнее о разделах DTB/DTBO…
Включите образ DTB в загрузочный образ
На устройствах с Android 10 образ DTB может быть включен в загрузочный образ. Это позволяет отказаться от поддержки в Android скриптов, которые добавляют образ DTB в image.gz в ядре, и использовать набор тестов поставщика (VTS) для проверки (и стандартизации) размещения DTB.
Кроме того, для устройств без поддержки A/B безопаснее включить DTB в образ восстановления, а не хранить его в отдельном разделе, чтобы предотвратить проблемы, вызванные прерыванием беспроводного обновления. Если во время беспроводного обновления после обновления раздела DTB (но до завершения полного обновления) возникает проблема, устройство пытается загрузиться в режиме восстановления, чтобы завершить беспроводное обновление. Однако, поскольку раздел DTB уже обновлен, может возникнуть несоответствие с образом для восстановления (который ещё не обновлен). Если образ DTB является частью формата образа загрузки, это позволяет избежать подобных проблем, поскольку образ восстановления становится самодостаточным (то есть не зависит от другого раздела).
Структура загрузочного образа
Устройства с Android 10 могут включать образ DTB, используя следующую структуру загрузочного образа.
| Раздел "Загрузочный образ" | Количество страниц |
|---|---|
| Заголовок загрузки (1 страница) | 1 |
| Ядро (l страниц) | l = (kernel_size + page_size -
1) / page_size |
| Ramdisk (m страниц) | 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 страниц) | 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
config вместе с другими смещениями и версией заголовка. Пример:
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). Можно указать только один индекс. Например, параметр androidboot.dtb_idx=N сообщает, что N – это индекс дерева устройств, выбранного загрузчиком из набора DTB, представленных в образе загрузки.