Что такое 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.
И параметры, соответственно:
- Где находится образ ядра в оперативной памяти
- Где находится виртуальный диск в оперативной памяти (может быть "-", если не применимо)
- Где находится большой двоичный объект DTB в ОЗУ.
команда bootm обнаружит, что образ, расположенный в $loadaddr, имеет формат загрузочного образа Android, проанализирует его и загрузит ядро с него, предоставив большой двоичный объект DTB ядру (из 3-го параметра), передав информацию о ramdisk ядру через DTB.
Блобы DTB и DTBO¶
Команда bootm не может просто использовать большой двоичный объект DTB из загрузочного образа Android (поле dtb), потому что:
- в загрузочном образе Android до версии 2 нет области DTB
- в области DTB может быть несколько больших двоичных объектов DTB (например, для разных SoC)
- некоторые большие двоичные объекты DTBO перед загрузкой могут быть объединены с большими двоичными объектами DTB (например, для разных плат)
Поэтому пользователь должен вручную подготовить большой двоичный объект DTB и указать его в третьем параметре команды bootm. Для этого можно использовать следующие команды:
- abootimg : управляет загрузочным образом Android, позволяет извлекать из него метаинформацию и полезные данные.
- 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 Адрес заголовка загрузочного образа
Описание
- Сцепленные большие двоичные объекты DTB
- Формат DTBO для Android (подробности см. в CONFIG_CMD_ADTIMG) ол>
- Распечатывает формат, используемый в области DTB.
- Перебирает все большие двоичные объекты DTB в области DTB и распечатывает информацию для каждого большого двоичного объекта.
- исходная сборка/envsetup.sh
- обед
- система mmma/libufdt/util/src
- Первый идентификатор dt_table_entry ( board1.dtbo ) – 0x00010000, а custom[0] – 0x00000abc.
- Второй идентификатор — 0x00006800, а custom[0] — 0x00000abc.
- Третий идентификатор — 0x00006801, а custom[0] — 0x00000123.
- Все остальные используют значение по умолчанию (0).
- Ubuntu или любая другая ОС на базе Linux
- Стабильное подключение к Интернету
- Терпение
Вернуться
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.
Использование 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=, чтобы назначить другое значение.
Команда cfg_create
Команда cfg_create создает образ с файлом конфигурации в следующем формате:
команда дампа
Для образов dtb/dtbo используйте команду дампа, чтобы напечатать информацию в образе. Пример:
Введение :
Я не эксперт в разработке ядра, но хотел бы поделиться шагами, которые я выполнил для сборки своего ядра. Если кто-то из других разработчиков ядра хочет добавить несколько советов или что-то исправить, пожалуйста!
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.
Выпуск | Схема обновления | Соответствие GKI | Версия загрузочного заголовка (запускающие устройства) | < th>Версия загрузочного заголовка (обновление устройств)Требуется специальный образ для восстановления | |
---|---|---|---|---|---|
11 | A/B , Виртуальный A/B | Да | 3 * | Н/Д | Нет | tr>
A/B, Виртуальный A/B | Нет | 2, 3 | 0, 1, 2 , 3 | Нет | |
не A/B | Да | 3 | < td>Н/ДДа | ||
не A/B | Нет | 2, 3 | 0, 1, 2, 3 | Да | |
10 (Q) | < td>A/BН/Д | 2 | 0, 1, 2 | Нет | |
не A/B | Н/Д | 2 | 0, 1, 2 | Да | |
9 (P) | A/B | Н/Д | 1 | 0, 1 | Нет |
не A/B | Н/Д td> | 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 или более поздней версии, обновите структуру загрузочного образа следующим образом.
Раздел загрузочного образа | Количество страниц |
---|---|
Заголовок загрузки (1 страница) | < td>1|
Ядро (l страниц) | l = (kernel_size + page_size - 1) / page_size |
Виртуальный диск (m страниц) | m = ( ramdisk_size + page_size - 1) / page_size |
Загрузчик второго этапа (n страниц) td> | 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 и/или ее дочерних компаний.
Читайте также: