设备树 (DT) 是用于描述“不可发现”硬件的命名节点和属性构成的一种数据结构。内核(例如在 Android 中使用的 Linux 内核)会使用 DT 来支持 Android 设备使用的各种硬件配置。硬件供应商会提供自己的设备树源 (DTS) 文件,系统会使用设备树编译器将这些文件编译到设备树 Blob (DTB) 文件中。随后,这些文件将供引导加载程序使用。DTB 文件包含二进制格式的扁平化设备树。
设备树叠加层 (DTO) 可让主要的 DTB 叠加在 DT(设备树 Blob 叠加层 (DTBO))上。使用 DTO 的引导加载程序可以维护系统芯片 (SoC) DT,并动态叠加设备特定的 DT,从而向树中添加节点并对现有树中的属性进行更改。
Android 9 版本中的更新
在 Android 9 中,在将统一 DTB 传递给内核之前,引导加载程序不得修改 DTO 中定义的属性。
加载 DT
在引导加载程序中加载 DT 会涉及到构建、分区和运行。
图 1. 在引导加载程序中加载设备树的典型实现。
如需创建和刷写 DTB,请执行以下操作:
1a. 使用 DTC (
dtc
) 将 DTS (.dts
) 编译成 DTB (.dtb
)。DTB 的格式为扁平化 DT。 1b. 将.dtb
文件刷写到引导加载程序在运行时可访问的位置(详见下文)。如需进行分区,请确定闪存中引导加载程序在运行时可访问的可信位置以放置
.dtb
。地点示例:图 2. 将 .dtb 放在启动分区中,方法是:将其附加到 image.gz,并将其作为“内核”传递给 mkbootimg。
图 3. 将 .dtb 放在专属分区(例如 dtb 分区)中。
如需加载 DTB 并启动内核,请执行以下操作:
- 将
.dtb
从存储空间加载到内存中。 - 使用所加载 DT 的内存地址来启动内核。
- 将
后续操作
本页详细介绍了引导加载程序加载 DT 的典型工作流程,并列出了常见的 DT 术语。本部分的其他页面介绍了如何实现引导加载程序支持,如何编译、验证和优化 DTO 以及如何使用多个 DT。您还可以获取关于 DTO 语法和必需的 DTO 和 DTBO 分区格式的详细信息。