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_table_entry结构(包含idrevcustom字段)来选择正确的 DT blob 有一种有效的方法。有关详细信息,请参阅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参数是0x10000000并且dtb_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 集合中选择的设备树的从零开始的索引。