实现 DTO 包括分割设备树、编译、分区和运行。在实现可以正常工作之后,您还必须保持两个 DT 之间的兼容性,并确定用于确保每个 DT 分区安全性的策略。
分割 DT
首先将设备树分割成两 (2) 部分:
- 主 DT。由 SoC 供应商提供的仅限 SoC 访问的部分和默认配置。
- 叠加 DT。由原始设计制造商 (ODM)/原始设备制造商 (OEM) 提供的设备专用配置。
分割设备树之后,您必须确保主 DT 和叠加 DT 之间的兼容性,以便通过合并主 DT 和叠加 DT 为设备生成完整的 DT。有关 DTO 格式和规则的详细信息,请参阅 DTO 语法。如需详细了解多个设备树,请参阅多个 DT。
构建主 DT 和叠加 DT
如需构建主 DT,请执行以下操作:
- 将主 DT
.dts
编译为.dtb
文件。 - 将
.dtb
文件刷写到引导加载程序在运行时可访问的分区(详见下文)。
如需构建叠加 DT,请执行以下操作:
- 将叠加 DT
.dts
编译为.dtbo
文件。虽然此文件格式与格式设为扁平化设备树的.dtb
文件相同,但是用不同的文件扩展名可以将其与主 DT 区分开来。 - 将
.dtbo
文件刷写到引导加载程序在运行时可访问的分区(详见下文)。
如需详细了解如何使用 DTC 进行编译并在主机上验证 DTO 结果,请参阅编译和验证。
对 DT 进行分区
在闪存中确定引导加载程序在运行时可访问和可信任的位置以放入 .dtb
和 .dtbo
。
主 DT 的示例位置:
- 启动分区的一部分,已附加到内核 (
image.gz
)。 - 单独的 DT blob (
.dtb
),位于专用分区 (dtb
)。
叠加 DT 的示例位置:
专属分区 |
---|
![](https://source.android.google.cn/docs/core/architecture/images/treble_dto_dtbo_partition_1.png?authuser=7&hl=ro)
.dtbo
放在专属的分区(例如 dtbo
分区)中。ODM 分区 |
---|
![](https://source.android.google.cn/docs/core/architecture/images/treble_dto_dtbo_partition_2.png?authuser=7&hl=ro)
.dtbo
放入 odm
分区中(仅在您的引导加载程序能够从 odm
分区的文件系统中加载数据时才这样做)。注意:叠加 DT 分区的大小取决于设备和主 DT blob 上所需的更改量。通常,8 MB 已足够当前使用并已为未来扩展留出了空间(如果需要的话)。
对于支持无缝 (A/B) 更新的设备,请用 A/B 来标识主 DT 和叠加 DT 分区:
示例 1 |
---|
![](https://source.android.google.cn/docs/core/architecture/images/treble_dto_dtbo_ab_1.png?authuser=7&hl=ro)
示例 2 |
---|
![](https://source.android.google.cn/docs/core/architecture/images/treble_dto_dtbo_ab_2.png?authuser=7&hl=ro)
在引导加载程序中运行
如需运行,请执行以下操作:
![](https://source.android.google.cn/docs/core/architecture/images/treble_dto_dtbo.png?authuser=7&hl=ro)
- 将
.dtb
从存储空间加载到内存中。 - 将
.dtbo
从存储空间加载到内存中。 - 用
.dtb
叠加.dtbo
以形成合并的 DT。 - 启动内核(已给定合并 DT 的内存地址)。
保持兼容性
主 DTB(来自 SoC 供应商)会被视为 DTBO 的 API 表面。将设备树分离为 SoC 通用部件和设备专用部件后,您必须确保这两个部件以后相互兼容,包括:
- 主 DT 中的 DT 定义(例如,节点、属性、标签)。主 DT 中的任何定义更改都可能会触发叠加 DT 中的更改。例如,如需更正主 DT 中的某个节点名称,请定义映射到原始节点名称的“别名”标签(以免更改叠加 DT)。
- 叠加 DT 的存储位置(例如,分区名称、存储格式)。
确保安全
引导加载程序必须确保 DTB/DTBO 安全无虞、未被修改且未被损坏。您可以使用任何解决方案来保护 DTB/DTBO,例如,VBoot 1.0 中的启动映像签名或 AVB 哈希页脚 (VBoot 2.0)。
- 如果 DTB/DTBO 位于专属的分区中,您可以将该分区添加到 AVB 的信任链。信任链从硬件保护的信任根开始,并进入引导加载程序,从而验证 DTB/DTBO 分区的完整性和真实性。
- 如果 DTB/DTBO 位于现有分区(如
odm
分区)中,该分区应位于 AVB 的信任链中。(DTBO 分区可以与odm
分区共享一个公钥)。
如需了解详情,请参阅启动时验证。