实现设备树叠加层 (DTO) 涉及划分设备树 (DT)、构建、分区和运行。在您完成有效的实现后,还必须维护两个 DT 之间的兼容性,并确定确保每个 DT 分区安全性的策略。
划分 DT
首先将 DT 分成两个部分
- 主 DT。仅限 SoC 的部分和默认配置(由 SoC 供应商提供)。
- 叠加层 DT。设备专用配置(由 ODM/OEM 提供)。
划分 DT 后,您必须确保主 DT 和叠加层 DT 之间的兼容性,以便合并主 DT 和叠加层 DT 后生成适用于设备的完整 DT。如需详细了解 DTO 格式和规则,请参阅 DTO 语法。如需详细了解多个 DT,请参阅使用多个 DT。
构建主 DT 和叠加层 DT
要构建主 DT,请执行以下操作:
- 将主 DT
.dts
编译为.dtb
文件。 - 将
.dtb
文件刷写到启动加载程序运行时可访问的分区中(详见[分区 DT](#partition))。
要构建叠加层 DT,请执行以下操作:
- 将叠加层 DT
.dts
编译为.dtbo
文件。虽然此文件格式与格式化为扁平化 DT 的.dtb
文件格式相同,但不同的文件扩展名可将其与主 DT 区分开来。 - 将
.dtbo
文件刷写到启动加载程序运行时可访问的分区中(详见[分区 DT](#partition))。
如需详细了解如何使用 DTC 进行编译以及如何在主机上验证 DTO 结果,请参阅编译和验证。
分区 DT
确定闪存中启动加载程序运行时可访问且受信任的位置,以放置 .dtb
和 .dtbo
。
主 DT 的示例位置:
- 启动分区的一部分,附加到内核 (
image.gz
) - 专用分区 (
dtb
) 中的单独 DT Blob (.dtb
)
叠加层 DT 的示例位置:
图 1. 将 .dtbo 放入 odm 分区中(仅当您的启动加载程序能够从 odm 分区的文件系统加载数据时才执行此操作)。
图 2. 将 .dtbo 放入唯一分区中,例如 dtbo 分区。
注意:叠加层 DT 分区的大小取决于设备以及主 DT Blob 之上需要的更改量。通常,8 MB 以上已足够,并且如果将来需要,还允许有增长空间。
对于支持无缝 (A/B) 更新的设备,请对主 DT 和叠加层 DT 分区执行 A/B 分区
图 3. DTBO 分区 A/B,示例 1。
图 4. DTBO 分区 A/B,示例 2。
在启动加载程序中运行
要运行,请执行以下操作:
图 5. 启动加载程序中 DTO 的典型运行时实现。
- 从存储空间将
.dtb
加载到内存中。 - 从存储空间将
.dtbo
加载到内存中。 - 使用
.dtbo
覆盖.dtb
以合并成一个 DT。 - 启动内核,并指定合并后的 DT 的内存地址。
保持兼容性
主 DTB(来自 SoC 供应商)被视为 DTBO 的 API 接口。在将 DT 分离为 SoC 通用部分和设备特定部分之后,您必须在未来保持这两部分之间的相互兼容性,包括:
- 主 DT 中的 DT 定义。例如,节点、属性、标签。主 DT 中的任何定义更改都可能触发覆盖 DT 中的更改。例如,要更正主 DT 中的节点名称,请定义一个映射到原始节点名称的“别名”标签(以避免更改覆盖 DT)。
- 覆盖 DT 存储位置。例如,分区名称、存储格式。
确保安全性
引导加载程序必须确保 DTB 或 DTBO 是安全、未修改且未损坏的。您可以使用任何解决方案来保护 DTB 或 DTBO 的安全,例如 VBoot 1.0 中的引导镜像签名或 AVB HASH 尾部 (VBoot 2.0)。
- 如果 DTB 或 DTBO 位于唯一分区中,您可以将该分区添加到 AVB 的信任链中。信任链从硬件保护的信任根开始,一直到引导加载程序,引导加载程序验证 DTB 或 DTBO 分区的完整性和真实性。
- 如果 DTB 或 DTBO 位于现有分区中(例如
odm
分区),则该分区应位于 AVB 的信任链中。(DTBO 分区可以与odm
分区共享一个公钥)。
有关详细信息,请参阅Verified Boot。