DTB 映像

Android 实现可以包含一个设备树 Blob (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 Blob 逐个串联。 引导加载程序使用每个 FDT 标头中的 totalsize 字段来读取和解析相应的 Blob。

  • DTB/DTBO 分区。 引导加载程序有一种有效的方法来选择正确的 DT Blob,方法是检查 dt_table_entry 结构(包含 idrevcustom 字段),该结构可以保存条目的硬件识别信息。有关详细信息,请参阅 DTB/DTBO 分区

在启动映像中包含 DTB 映像

运行 Android 10 的设备可以在启动映像中包含 DTB 映像。这消除了 Android 支持将 DTB 映像附加到内核中的 image.gz 的脚本的需求,并支持使用 供应商测试套件 (VTS) 测试来验证(和标准化)DTB 放置。

此外,对于非 A/B 设备,将 DTB 作为恢复映像的一部分而不是在单独的分区中更安全,以防止因 OTA 中断引起的问题。在 OTA 期间,如果在 DTB 分区更新后(但在完成完整更新之前)出现问题,设备会尝试启动到恢复模式以完成 OTA;但是,由于 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 参数为 0x10000000dtb_offset 参数为 0x01000000,则启动映像标头中的 dtb_addr_field 将填充为 0x11000000

必须使用板配置变量 BOARD_PREBUILT_DTBIMAGE_DIR 来指定 DTB 映像的路径。如果目录 BOARD_PREBUILT_DTBIMAGE_DIR 中存在多个扩展名为 *.dtb 的文件,则 Android 构建系统会将这些文件连接起来以创建用于启动映像创建的最终 DTB 映像。

要使用由 BOARD_PREBUILT_DTBIMAGE_DIR 指定的目录中的 DTB 映像将参数 dtb 传递给 mkbootimg.py,则必须将板配置变量 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=NN 报告为引导加载程序从启动映像中存在的一组 DTB 中选择的设备树的从零开始的索引。