Что такое DTBO для Android

Обновлено: 29.01.2023

Загрузочный образ Android используется для загрузки ОС Android. Обычно он содержит образ ядра (например, файл zImage) и ramdisk. Иногда он может содержать дополнительные двоичные файлы. Этот образ создается как часть AOSP (называется boot.img) и прошивается в загрузочный раздел на eMMC. Затем загрузчик считывает этот образ из загрузочного раздела в оперативную память и загружает из него ядро. Ядро затем запускает процесс инициализации с виртуального диска. Следует отметить, что образ восстановления ( recovery.img ) также имеет формат загрузочного образа Android.

Формат загрузочного образа Android описан в [1]. На данный момент он может иметь один из следующих заголовков изображения:

  • v0: заголовок загрузочного образа называется legacy; используется в устройствах, выпущенных до Android 9; содержит образ ядра, RAM-диск и загрузчик второго этапа (обычно не используется)
  • v1: используется на устройствах с Android 9; добавляет поле recovery_dtbo, которое следует использовать для устройств, отличных от A/B, в файле recovery.img (подробности см. в [2])
  • v2: используется на устройствах с Android 10; добавляет поле dtb, которое ссылается на полезную нагрузку, содержащую большие двоичные объекты DTB (либо объединенные один за другим, либо в формате изображения Android DTBO)

Форматы v2, v1 и v0 обратно совместимы.

Формат загрузочного образа Android представлен структурой andr_img_hdr в U-Boot, и его можно увидеть в include/android_image.h. U-Boot поддерживает загрузку загрузочного образа Android, а также имеет соответствующую команду

Загрузка¶

U-Boot может загружать ОС Android из загрузочного образа Android с помощью команды bootm. Чтобы использовать поддержку формата загрузочного образа Android, необходимо включить следующую опцию:

Затем можно использовать следующий вызов команды bootm для запуска Android:

где $loadaddr - адрес в оперативной памяти, по которому был загружен загрузочный образ; $fdtaddr - адрес в оперативной памяти, по которому был загружен BLOB-объект DTB.

И параметры, соответственно:

  1. Где находится образ ядра в оперативной памяти
  2. Где находится виртуальный диск в оперативной памяти (может быть "-", если не применимо)
  3. Где находится большой двоичный объект DTB в ОЗУ.

команда bootm обнаружит, что образ, расположенный в $loadaddr, имеет формат загрузочного образа Android, проанализирует его и загрузит ядро ​​с него, предоставив большой двоичный объект DTB ядру (из 3-го параметра), передав информацию о ramdisk ядру через DTB.

Блобы DTB и DTBO¶

Команда bootm не может просто использовать большой двоичный объект DTB из загрузочного образа Android (поле dtb), потому что:

  • в загрузочном образе Android до версии 2 нет области DTB
  • в области DTB может быть несколько больших двоичных объектов DTB (например, для разных SoC)
  • некоторые большие двоичные объекты DTBO перед загрузкой могут быть объединены с большими двоичными объектами DTB (например, для разных плат)

Поэтому пользователь должен вручную подготовить большой двоичный объект DTB и указать его в третьем параметре команды bootm. Для этого можно использовать следующие команды:

  1. abootimg : управляет загрузочным образом Android, позволяет извлекать из него метаинформацию и полезные данные.
  2. adtimg : управляет образом Android DTB/DTBO [3], позволяет извлекать из него большие двоичные объекты DTB/DTBO

Чтобы использовать их, включите следующие параметры конфигурации:

Например, предположим, что у нас есть следующие разделы Android на eMMC:

  • boot : содержит загрузочный образ Android v2 (включая большие двоичные объекты DTB)
  • dtbo : содержит большие двоичные объекты DTBO.

Затем можно использовать следующую последовательность команд для загрузки Android:

Эта последовательность должна использоваться для загрузки Android 10. Конечно, вся процедура загрузки Android включает в себя гораздо больше действий, например:

  • получение причины перезагрузки от BCB (см. [4])
  • выполнение загрузки с восстановлением
  • реализация быстрой загрузки
  • внедрение размещения A/B (см. [5])
  • реализация AVB2.0 (см. [6])

Но загрузка загрузочного образа Android является наиболее важной частью схемы загрузки Android.

Вся документация по требованиям к загрузчику Android доступна по адресу [7]. Некоторый обзор всего процесса загрузки Android 10 можно найти по адресу [8].

C API для работы с форматом загрузочного образа Android¶

int android_image_get_kernel ( const struct andr_img_hdr *hdr, int verify, ulong *os_data, ulong *os_len ) ¶

обрабатывает часть ядра загрузочных образов Android

Параметры

const struct andr_img_hdr *hdr Указатель на заголовок изображения, который находится в начале изображения. int verify Флаг проверки контрольной суммы. В настоящее время не реализован. ulong *os_data Указатель на переменную ulong, будет содержать начальный адрес данных ОС. ulong *os_len Указатель на переменную ulong, будет содержать длину данных os.

Описание

Эта функция возвращает начальный адрес и длину образа ОС. Кроме того, он добавляет командную строку ядра к переменной окружения bootargs.

Вернуться

Ноль, начальный адрес ОС и длина в случае успеха, в противном случае — в случае неудачи. bool android_image_get_dtbo ( ulong hdr_addr, ulong *addr, u32 *size ) ¶

Получить адрес и размер образа восстановления DTBO.

Параметры

ulong hdr_addr Адрес заголовка загрузочного образа ulong *addr Если не NULL, будет содержать адрес образа восстановления DTBO u32 *size Если не NULL, будет содержать размер образа восстановления DTBO

Описание

Получите адрес и размер образа DTBO в области «Восстановление DTBO» загрузочного образа Android в ОЗУ. Формат этого образа — Android DTBO (подробности см. в соответствующей документации AOSP «Разделы DTB/DTBO»). После того, как адрес получен из этой функции, можно использовать команду «adtimg» U-Boot или функции android_dt_*() для извлечения нужного большого двоичного объекта DTBO.

Этот DTBO (включенный в загрузочный образ) необходим только для устройств, отличных от A/B, и его можно найти только в образе восстановления. На устройствах A/B мы всегда можем положиться на раздел «dtbo». Дополнительные сведения см. в разделе «Включение DTBO в восстановление для устройств, отличных от A/B» в документации AOSP.

Вернуться

true в случае успеха или false в случае ошибки.

bool android_image_get_dtb_img_addr ( ulong hdr_addr, ulong *addr ) ¶

Получить адрес области DTB в загрузочном образе.

Параметры

ulong hdr_addr Адрес заголовка загрузочного образа ulong *addr Будет содержать адрес области DTB в загрузочном образе

Вернуться

true в случае успеха или false в случае неудачи.

bool android_image_get_dtb_by_index ( ulong hdr_addr, u32 index, ulong *addr, u32 *size) ¶ < /p>

Получить адрес и размер большого двоичного объекта в области DTB.

Параметры

ulong hdr_addr Адрес заголовка загрузочного образа u32 index Индекс желаемого DTB в области DTB (начиная с 0) ulong *addr Если не NULL, будет содержать адрес указанного DTB u32 *size Если не NULL, будет содержать размер указанного DTB< /p>

Описание

Получить адрес и размер большого двоичного объекта DTB по его индексу в области DTB загрузочного образа Android в ОЗУ.

Вернуться

true в случае успеха или false в случае ошибки.

void android_print_contents ( const struct andr_img_hdr *hdr ) ¶

распечатывает содержимое изображения в формате Android

Параметры

const struct andr_img_hdr *hdr указатель на заголовок изображения формата Android

Описание

android_print_contents() форматирует многострочное описание содержимого изображения Android. Подпрограмма выводит свойства изображения Android

Вернуться

Печатать информацию об одном большом двоичном объекте DTB в области DTB.

Параметры

const struct fdt_header *fdt DTB header u32 index Количество больших двоичных объектов DTB в области DTB.

Вернуться

true в случае успеха или false в случае ошибки.

bool android_image_print_dtb_contents (ulong hdr_addr) ¶

Печатать информацию о больших двоичных объектах DTB в области DTB.

Параметры

ulong hdr_addr Адрес заголовка загрузочного образа

Описание

  1. Сцепленные большие двоичные объекты DTB
  2. Формат DTBO для Android (подробности см. в CONFIG_CMD_ADTIMG)
    1. Распечатывает формат, используемый в области DTB.
    2. Перебирает все большие двоичные объекты DTB в области DTB и распечатывает информацию для каждого большого двоичного объекта.

    Вернуться

    true в случае успеха или false в случае ошибки.

    Ссылки¶

    © Авторские права сообщества разработчиков U-Boot, редакция 840658b0 .

    Версии последняя стабильная v2021.07 v2021.04 v2021.01 v2020.10 v2020.07 v2020.04 Загрузки в Read the Docs Project Home Сборки Бесплатный хостинг документов предоставляется Read the Docs.

    Эта папка содержит утилиты для наложения дерева устройств.

    mkdtimg (УСТАРЕЛО, вместо этого используйте mkdtboimg.py.)

    Если ваш DTB/DTBO находится в уникальном разделе, например раздел dtb и dtbo. mkdtimg — это инструмент для создания образа dtb/dtbo. Вы можете использовать mkdtimg для упаковки одного или нескольких файлов DTB/DTBO в образ.

    Формат изображения

    Это макет для изображения dtb / dtbo:

    Вы можете найти структуру данных dt_table_header и dt_table_entry в файле src/dt_table.h

    Сборка mkdtimg

    Предположим, что вы находитесь в корневом каталоге исходного кода Android.

    1. исходная сборка/envsetup.sh
    2. обед
    3. система mmma/libufdt/util/src

    Использование mkdtimg

    mkdtimg поддерживает несколько команд, включая create , cfg_create и dump .

    создать команду

    Используйте команду create для создания образа dtb/dtbo:

    Каждое dtb/dtbo ftbX_filename будет генерировать dt_table_entry в образе. entryX_options — это значения, которые нужно присвоить dt_table_entry. Эти значения могут быть любыми из следующих:

    Числовые значения могут быть 32-битными цифрами (например, 68000 ) или шестнадцатеричными числами (например, 0x6800 ). Кроме того, вы можете указать путь, используя формат:

    Например, /board/:id . mkdtimg прочитает значение из пути в файле DTB/DTBO и назначит относительное свойство в dt_table_entry . Это должно быть 32-битное значение.

    Вы также можете указать global_option в качестве опции по умолчанию для всех записей. Значение по умолчанию page_size в dt_table_header равно 2048. Вы можете использовать global_option --page_size=, чтобы назначить другое значение.

    • Первый идентификатор dt_table_entry ( board1.dtbo ) – 0x00010000, а custom[0] – 0x00000abc.
    • Второй идентификатор — 0x00006800, а custom[0] — 0x00000abc.
    • Третий идентификатор — 0x00006801, а custom[0] — 0x00000123.
    • Все остальные используют значение по умолчанию (0).

    Команда cfg_create

    Команда cfg_create создает образ с файлом конфигурации в следующем формате:

    команда дампа

    Для образов dtb/dtbo используйте команду дампа, чтобы напечатать информацию в образе. Пример:

    Введение :
    Я не эксперт в разработке ядра, но хотел бы поделиться шагами, которые я выполнил для сборки своего ядра. Если кто-то из других разработчиков ядра хочет добавить несколько советов или что-то исправить, пожалуйста!

    • Ubuntu или любая другая ОС на базе Linux
    • Стабильное подключение к Интернету
    • Терпение

    WIFI и аудио не будут работать, если вы не внесете эти изменения, видимо, Xiaomi решила пропустить драйверы wlan и аудио в источниках круговой диаграммы.

    Шаг 4. Создание ядра

    Шаг 5: Как получить помощь, если вы столкнулись с ошибками
    В папке davinci-p-oss будет создан файл kernel.log, найдите строку, в которой говорится об ошибке.
    Если вы не можете найти решение, прикрепите файл kernel.log к своему ответу в этой теме.

    Шаг 6: Загрузка ядра
    После выполнения шага 4 перейдите в папку /out/arch/arm64/boot и найдите файл Image.gz-dtb (скомпилированный zImage)
    Загрузите шаблон anykernel для davinci из вложений и добавьте в архив свой файл Image.gz-dtb.
    Загрузитесь в TWRP, сделайте резервную копию вашего стандартного ядра и прошейте архив с любым ядром.

    Вложения

    ачервенкий

    Признанный участник

    Использование QCom Clang для компиляции ядра [Руководство Xiaomi]

    Шаг 1: Настройка среды сборки
    Откройте терминал и введите следующее:

    WIFI и аудио не будут работать, если вы не внесете эти изменения, видимо, Xiaomi решила пропустить драйверы wlan и аудио в источниках круговой диаграммы.

    Шаг 4. Создание ядра

    Шаг 5: Как получить помощь, если вы столкнулись с ошибками
    В папке davinci-p-oss будет создан файл kernel.log, найдите строку, в которой говорится об ошибке.
    Если вы не можете найти решение, прикрепите файл kernel.log к своему ответу в этой теме.

    Шаг 6: Загрузка ядра
    После выполнения шага 4 перейдите в папку /out/arch/arm64/boot и найдите файл Image.gz-dtb (скомпилированный zImage)
    Загрузите шаблон anykernel для davinci из вложений и добавьте в архив свой файл Image.gz-dtb.
    Загрузитесь в TWRP, сделайте резервную копию вашего стандартного ядра и прошейте архив с любым ядром.

    Этот метод упоминается в Wiki Xiaomi, вы можете выбрать любой по своему вкусу!

    ачервенкий

    Признанный участник

    Как скомпилировать собственный DTBO

    Файлы DTBO использовались на нашем устройстве в первую очередь для изменения частоты обновления.

    Требования:
    Скомпилированное ядро ​​без ошибок

    Шаг 1: Загрузите необходимые файлы
    Загрузите утилиты libufdt по этой ссылке.
    Откройте терминал в папке с загруженным файлом.

    Шаг 3: Запишите скомпилированный файл dtbo.img
    Скомпилированный файл dtbo.img будет расположен в /davinci-p-oss/out/arch/arm64/boot/ (та же выходная папка, что и zImage)
    Сделайте резервную копию вашего стандартного dtbo.img и прошейте только что скомпилированный dtbo.img

    Ссылки:
    Kernel Builder от mslezak

    ачервенкий

    Признанный участник

    Шнеди

    Старший участник

    Большое спасибо

    EDIT: скомпилировано без ошибок

    кевп75

    Признанный участник

    Как ни странно, я не могу скомпилировать их ядро ​​по этой методологии. Я считаю, что это как-то связано с Clang.

    Я собираюсь посмотреть, смогу ли я воспроизвести возможность компиляции для Mi9, используя ту же методологию

    BLUuuE83

    Старший участник

    Я успешно скомпилировал ядро ​​и dtbo, используя виртуальную машину Ubuntu, связанную с OP, но размер dtbo.img составляет всего 3 МБ.
    Когда я сбросил dtbo моего Mi 9T, это 32 МБ. Это нормально?

    Я сравнил вывод

    и кажется, что dt_entry_count равно 24 в скомпилированном dtbo по сравнению с 28 в моем выгруженном dtbo.

    У меня глобальная прошивка MIUI V10.3.11.0.

    Вложения

    ачервенкий

    Признанный участник

    Я успешно скомпилировал ядро ​​и dtbo, используя виртуальную машину Ubuntu, связанную с OP, но размер dtbo.img составляет всего 3 МБ.
    Когда я сбросил dtbo моего Mi 9T, это 32 МБ. Это нормально?

    Я сравнил вывод

    и кажется, что dt_entry_count равно 24 в скомпилированном dtbo по сравнению с 28 в моем выгруженном dtbo.

    У меня глобальная прошивка MIUI V10.3.11.0.

    Да, это нормально.

    draand28

    Член

    BLUuuE83

    Старший участник

    Да, это нормально.

    Еще один вопрос, если вы не возражаете.

    Что произойдет, если я укажу слишком малое время отображения?Я знаю, что на мониторе компьютера будет просто черный экран, но Windows сбросит настройки по умолчанию через 15 секунд, если вы ничего не сделаете.
    Получу ли я просто черный экран, означающий, что я заблокировал свой телефон?

    ачервенкий

    Признанный участник

    Еще один вопрос, если вы не возражаете.

    Что произойдет, если я укажу слишком малое время отображения? Я знаю, что на мониторе компьютера будет просто черный экран, но Windows сбросит настройки по умолчанию через 15 секунд, если вы ничего не сделаете.
    Получу ли я просто черный экран, означающий, что я заблокировал свой телефон?

    Если вы установите слишком низкое/высокое время, они будут сброшены до значений по умолчанию.

    draand28

    Член

    Привет! Спасибо за ответы. Я редактировал эти частоты, но на телефоне ничего не изменилось. Все равно максимум 585mhz на gpu, хотя пробовал разные модификации (700,800,825). Даже пробовал добавлять новые ступени выше оригинальных. У меня работает мод частоты обновления. Кроме того, если бы вы могли сказать мне расположение тепловой конфигурации, это было бы здорово. Я нашел файл sm8150-thermal.dtsi, но не могу определить фактическую температуру, просто некоторые цифры слишком низкие, чтобы быть правильными.

    Я оставлю вас с изменениями, внесенными в файлы gpu и gpu-v2.

    ВД171

    Старший участник

    Как скомпилировать собственный DTBO

    Файлы DTBO использовались на нашем устройстве в первую очередь для изменения частоты обновления.

    Требования:
    Скомпилированное ядро ​​без ошибок

    Шаг 1: Загрузите необходимые файлы
    Загрузите утилиты libufdt по этой ссылке.
    Откройте терминал в папке с загруженным файлом.

    Шаг 3: Запишите скомпилированный файл dtbo.img
    Скомпилированный файл dtbo.img будет расположен в /davinci-p-oss/out/arch/arm64/boot/ (та же выходная папка, что и zImage)
    Сделайте резервную копию вашего стандартного dtbo.img и прошейте только что скомпилированный dtbo.img

    Ссылки:
    Kernel Builder от mslezak

    Член

    Я следовал инструкциям по сборке на Ubuntu 20.04 и получил следующий вывод консоли

    На устройствах, отличных от A/B, образ для восстановления должен содержать информацию из большого двоичного объекта дерева устройств (DTB) или наложенного образа расширенного интерфейса конфигурации и питания (ACPI). Когда такие устройства загружаются в режиме восстановления, загрузчик может затем загрузить образ наложения, совместимый с образом восстановления. Устройства, которые поддерживают обновления A/B (бесшовные), должны использовать восстановление в качестве загрузки вместо отдельного раздела восстановления (подробности см. в разделе Реализация обновлений A/B).

    Варианты включения DTBO/ACPIO для восстановления в образ загрузки/восстановления различаются в разных версиях Android.

    < th>Версия загрузочного заголовка (обновление устройств) < td>Н/Д < td>A/B
    Выпуск Схема обновления Соответствие GKI Версия загрузочного заголовка (запускающие устройства) Требуется специальный образ для восстановления
    11 A/B ,
    Виртуальный A/B
    Да 3 * Н/Д Нет
    A/B,
    Виртуальный A/B
    Нет 2, 3 0, 1, 2 , 3 Нет
    не A/B Да 3 Да
    не A/B Нет 2, 3 0, 1, 2, 3 Да
    10 (Q) Н/Д 2 0, 1, 2 Нет
    не A/B Н/Д 2 0, 1, 2 Да
    9 (P) A/B Н/Д 1 0, 1 Нет
    не A/B Н/Д 1 0, 1 Да
    8 (O) A/B N/A N/A (считается 0) N/A (считается 0) Нет
    не-A/B Нет данных Нет данных (считается 0) Н/Д (считается 0) Да

    * Устройства A/B под управлением Android 11 или более поздней версии и использующие универсальный образ ядра (GKI) должны использовать основной загрузочный заголовок версии 3, чтобы быть совместимыми с загрузочным разделом поставщика.

    Устройствам A/B не нужно указывать образ восстановления, так как обновления A/B используют два набора разделов (включая загрузочный и dtbo ) и переключаются между ними во время обновления, что устраняет необходимость в образе восстановления. При желании устройства A/B могут по-прежнему использовать специальный образ для восстановления.

    Устройства без версий A/B, запускаемые с Android 11 или более поздней версии и использующие загрузочный заголовок версии 3, должны явно указать загрузочный заголовок версии 2 для образа восстановления отдельно. Например:

    Для архитектур, не поддерживающих деревья устройств, образ восстановления может включать образ ACPIO вместо образа DTBO.

    О сбоях OTA и образах для восстановления

    Чтобы предотвратить сбои по беспроводной сети (OTA) на устройствах, отличных от A/B, образ восстановления должен быть автономным и независимым от других образов.Во время обновления OTA, если проблема возникает после обновления образа наложения (но до завершения полного обновления), устройство пытается загрузиться в режиме восстановления для завершения обновления OTA. Однако, поскольку оверлейный раздел уже был обновлен, может возникнуть несоответствие с образом восстановления (который еще не обновлен).

    Чтобы предотвратить зависимость восстановления от раздела DTBO/ACPIO во время обновления, устройства без A/B под управлением Android 9 или более поздней версии могут указать образ восстановления DTBO/ACPIO, содержащий информацию из образа наложения, в виде отдельного раздела в загрузочном файле. формат изображения (должен использоваться загрузочный заголовок версии 1 или 2).

    Изменения загрузочного образа

    Чтобы образ восстановления содержал DTBO или ACPIO для восстановления на устройствах без A/B под управлением Android 9 или более поздней версии, обновите структуру загрузочного образа следующим образом.

    < td>1
    Раздел загрузочного образа Количество страниц
    Заголовок загрузки (1 страница)
    Ядро (l страниц) l = (kernel_size + page_size - 1) / page_size
    Виртуальный диск (m страниц) m = ( ramdisk_size + page_size - 1) / page_size
    Загрузчик второго этапа (n страниц) n = ( second_size + page_size - 1) / page_size
    Восстановление DTBO или ACPIO (o страниц) o = ( recovery_[ dtbo|acpio]_size + page_size - 1) / page_size

    Подробнее об аргументах инструмента mkbootimg для указания версии заголовка загрузочного образа и путей к накладываемому образу см. в разделе Управление версиями заголовка загрузочного образа.

    Внедрение DTBO

    Устройства, отличные от A/B, работающие под управлением 9 или более поздней версии, могут заполнять раздел recovery_dtbo образа восстановления. Чтобы включить образ recovery_dtbo в recovery.img, в BoardConfig.mk устройства:

    Установите для конфигурации BOARD_INCLUDE_RECOVERY_DTBO значение true :

    Расширьте переменную BOARD_MKBOOTIMG_ARGS, чтобы указать версию заголовка загрузочного образа:

    Убедитесь, что для переменной BOARD_PREBUILT_DTBOIMAGE задан путь к образу DTBO. Система сборки Android использует эту переменную для установки аргумента recovery_dtbo инструмента mkbootimg во время создания образа восстановления.

    Если переменные BOARD_INCLUDE_RECOVERY_DTBO , BOARD_MKBOOTIMG_ARGS и BOARD_PREBUILT_DTBOIMAGE установлены правильно, система сборки Android включает DTBO, указанный в переменной BOARD_PREBUILT_DTBOIMAGE в файле recovery.img .

    Реализация ACPIO

    Устройства не A/B под управлением Android 9 или более поздней версии могут использовать оверлейный образ ACPIO (вместо образа DTBO) и могут заполнять раздел recovery_acpio (вместо раздела recovery_dtbo) образа восстановления. Чтобы включить образ recovery_acpio в recovery.img, в BoardConfig.mk устройства:

    Установите для конфигурации BOARD_INCLUDE_RECOVERY_ACPIO значение true :

    Расширьте переменную BOARD_MKBOOTIMG_ARGS, чтобы указать версию заголовка загрузочного образа. Переменная должна быть больше или равна 1, чтобы поддерживать восстановление ACPIO.

    Убедитесь, что для переменной BOARD_RECOVERY_ACPIO задан путь к образу ACPIO. Система сборки Android использует эту переменную для установки аргумента recovery_acpio инструмента mkbootimg во время создания образа восстановления.

    Если переменные BOARD_INCLUDE_RECOVERY_ACPIO , BOARD_MKBOOTIMG_ARGS и BOARD_RECOVERY_ACPIO установлены правильно, система сборки Android включает ACPIO, указанный переменной BOARD_RECOVERY_ACPIO в файле recovery.img .

    Контент и примеры кода на этой странице подпадают под действие лицензий, описанных в Лицензии на контент. Java и OpenJDK являются товарными знаками или зарегистрированными товарными знаками Oracle и/или ее дочерних компаний.

    Читайте также: