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
结构体(包含id
、rev
和custom
字段),该结构体可存放条目的硬件识别信息。如需了解详情,请参阅 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 映像。
如需将参数 dtb
连同 BOARD_PREBUILT_DTBIMAGE_DIR
指定的目录中的 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=N
将 N
报告为引导加载程序从启动映像中的一组 DTB 中选择的设备树的索引(从零开始)。