實現 DTO 涉及劃分設備樹、構建、分區和運行。在你有一個可行的實現之後,你還必須保持兩個 DT 之間的兼容性,並確定一個策略來確保每個 DT 分區的安全性。
劃分DT
首先將設備樹分為兩 (2) 部分:
- 主DT 。 SoC 供應商提供的純 SoC 部分和默認配置。
- 覆蓋 DT 。由 ODM/OEM 提供的設備特定配置。
劃分設備樹後,必須保證主DT和overlay DT的兼容性,使主DT和overlay DT合併為一個完整的設備DT。有關 DTO 格式和規則的詳細信息,請參閱DTO 語法。有關多個設備樹的詳細信息,請參閱多個 DT 。
構建主要和覆蓋 DT
要構建主 DT:
- 將主 DT
.dts
編譯成.dtb
文件。 -
.dtb
文件閃存到引導加載程序運行時可訪問的分區(詳情如下)。
要構建覆蓋 DT:
- 將覆蓋 DT
.dts
編譯為.dtbo
文件。雖然此文件格式與格式化為扁平設備樹的.dtb
文件相同,但不同的文件擴展名將其與主 DT 區分開來。 -
.dtbo
文件閃存到引導加載程序運行時可訪問的分區(如下所述)。
有關使用 DTC 編譯和在主機上驗證 DTO 結果的詳細信息,請參閱編譯和驗證。
對 DT 進行分區
在閃存中確定引導加載程序運行時可訪問且受信任的位置以放置.dtb
和.dtbo
。
主要 DT 的示例位置:
- 引導分區的一部分,附加到內核 (
image.gz
)。 - 在專用分區 (
dtb
.dtb
。
覆蓋 DT 的示例位置:
唯一分區 |
---|
![](https://source.android.google.cn/devices/architecture/images/treble_dto_dtbo_partition_1.png?authuser=19&hl=zh-tw)
.dtbo
放入唯一的分區,例如dtbo
分區。 ODM 分區 |
---|
![](https://source.android.google.cn/devices/architecture/images/treble_dto_dtbo_partition_2.png?authuser=19&hl=zh-tw)
.dtbo
放入odm
分區(僅當您的引導加載程序能夠從odm
分區的文件系統加載數據時才這樣做)。注意:覆蓋 DT 分區的大小取決於設備和主 DT blob 頂部所需的更改量。通常,8 MB 綽綽有餘,如果需要,還可以在未來增加空間。
對於支持無縫 (A/B) 更新的設備,A/B 主 DT 和覆蓋 DT 分區:
示例 1 |
---|
![](https://source.android.google.cn/devices/architecture/images/treble_dto_dtbo_ab_1.png?authuser=19&hl=zh-tw)
示例 2 |
---|
![](https://source.android.google.cn/devices/architecture/images/treble_dto_dtbo_ab_2.png?authuser=19&hl=zh-tw)
在引導加載程序中運行
跑步:
![](https://source.android.google.cn/devices/architecture/images/treble_dto_dtbo.png?authuser=19&hl=zh-tw)
-
.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 HASH 頁腳(VBoot 2.0) 中的引導映像簽名。
- 如果 DTB/DTBO 在唯一的分區中,您可以將該分區添加到 AVB 的信任鏈中。信任鏈從受硬件保護的信任根開始,進入引導加載程序,驗證 DTB/DTBO 分區的完整性和真實性。
- 如果 DTB/DTBO 在現有分區中(例如
odm
分區),則該分區應該在 AVB 的信任鏈中。 (DTBO 分區可以與odm
分區共享一個公鑰)。
有關詳細信息,請參閱驗證啟動。