实现 DTO

实现设备树叠加层 (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,请执行以下操作:

  1. 将主 DT .dts 编译为 .dtb 文件。
  2. .dtb 文件刷写到启动加载程序运行时可访问的分区中(详见[分区 DT](#partition))。

要构建叠加层 DT,请执行以下操作:

  1. 将叠加层 DT .dts 编译为 .dtbo 文件。虽然此文件格式与格式化为扁平化 DT 的 .dtb 文件格式相同,但不同的文件扩展名可将其与主 DT 区分开来。
  2. .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 的典型运行时实现。

  1. 从存储空间将 .dtb 加载到内存中。
  2. 从存储空间将 .dtbo 加载到内存中。
  3. 使用 .dtbo 覆盖 .dtb 以合并成一个 DT。
  4. 启动内核,并指定合并后的 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