Изображения DTB

Реализации Android могут включать в себя образ дерева устройств (DTB) для использования загрузчиком. Расположение образа DTB (и возможности указания параметров изображения DTB) различаются в разных версиях Android.

  • В Android 11 устройства, использующие универсальный образ ядра (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 в ядре, и позволяет использовать тест Vendor Test Suite (VTS) для проверки (и стандартизации) размещения DTB.

Кроме того, для устройств, отличных от A/B, безопаснее иметь DTB как часть образа восстановления, а не в отдельном разделе, чтобы предотвратить проблемы, вызванные прерванными OTA. Если во время OTA возникает проблема после обновления раздела DTB (но до завершения полного обновления), устройство пытается загрузиться в режиме восстановления для завершения OTA; однако, поскольку раздел DTB уже обновлен, может возникнуть несоответствие с образом восстановления (который еще не был обновлен). Наличие образа DTB как части формата загрузочного образа предотвращает подобные проблемы, делая образ восстановления самодостаточным (то есть он не зависит от другого раздела).

Структура загрузочного образа

Устройства под управлением Android 10 могут включать образ DTB, используя следующую структуру загрузочного образа.

Раздел загрузочного образа Количество страниц
Загрузочный заголовок (1 страница) 1
Ядро (л страниц) l = ( kernel_size + page_size - 1) / page_size
Рамдиск (м страниц) m = ( ramdisk_size + page_size - 1) / page_size
Загрузчик второго этапа (n страниц) n = ( second_size + page_size - 1) / page_size
Восстановление ДТБО (о стр.) 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_offset0x01000000 , поле 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 устройства, использующие универсальный образ ядра (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 в ядре, и позволяет использовать тест Vendor Test Suite (VTS) для проверки (и стандартизации) размещения DTB.

Кроме того, для устройств, отличных от A/B, безопаснее иметь DTB как часть образа восстановления, а не в отдельном разделе, чтобы предотвратить проблемы, вызванные прерванными OTA. Если во время OTA возникает проблема после обновления раздела DTB (но до завершения полного обновления), устройство пытается загрузиться в режиме восстановления для завершения OTA; однако, поскольку раздел DTB уже обновлен, может возникнуть несоответствие с образом восстановления (который еще не был обновлен). Наличие образа DTB как части формата загрузочного образа предотвращает подобные проблемы, делая образ восстановления самодостаточным (то есть он не зависит от другого раздела).

Структура загрузочного образа

Устройства под управлением Android 10 могут включать образ DTB, используя следующую структуру загрузочного образа.

Раздел загрузочного образа Количество страниц
Загрузочный заголовок (1 страница) 1
Ядро (л страниц) l = ( kernel_size + page_size - 1) / page_size
Рамдиск (м страниц) m = ( ramdisk_size + page_size - 1) / page_size
Загрузчик второго этапа (n страниц) n = ( second_size + page_size - 1) / page_size
Восстановление ДТБО (о стр.) 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_offset0x01000000 , поле 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, присутствующих в загрузочном образе.