實作 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:

  1. 將主要 DT .dts 編譯到 .dtb 檔案中。
  2. .dtb 檔案刷入可供引導程式在執行階段存取的分區 (詳情請參閱「[Partition DTs](#partition)」)。

如要建構重疊式 DT:

  1. 將疊加式 DT .dts 編譯為 .dtbo 檔案。雖然這個檔案格式與以扁平化 DT 格式建立的 .dtb 檔案相同,但不同的副檔名可將其與主要 DT 區分開來。
  2. .dtbo 檔案刷入可供引導程式存取的執行階段分區 (詳情請參閱「[Partition DTs](#partition)」)。

如要進一步瞭解如何使用 DTC 進行編譯,並在主機上驗證 DTO 結果,請參閱「編譯及驗證」一文。

分區日期時間

在快閃記憶體中找出可供系統啟動載入程式在執行階段存取且可信的位置,以便放置 .dtb.dtbo

主要 DT 的範例位置:

  • 啟動分區的一部分,附加至核心 (image.gz)
  • 在專屬分區 (dtb) 中分隔 DT 資料 blob (.dtb)

重疊式 DT 的示例位置:

圖 1. 將 .dtbo 放入 odm 分割區 (只有在您的引導程式具有從 odm 分割區的檔案系統載入資料的功能時,才執行此操作)。

圖 2. 將 .dtbo 放入專屬分區,例如 dtbo 分區。

注意:疊加式 DT 分割區的大小取決於裝置,以及在主要 DT blob 上需要進行的變更量。一般來說,8 MB 就足夠了,而且日後如有需要,還能讓容量增加。

如果裝置支援無縫 (A/B) 更新,請 A/B 主 DT 和覆蓋 DT 分區:

圖 3. DTBO 分區 A/B,示例 1。

圖 4. DTBO 分區 A/B,示例 2。

在系統啟動載入程式中執行

執行方式如下:

圖 5. 系統啟動載入程式中 DTO 的一般執行階段實作。

  1. .dtb 從儲存空間載入記憶體。
  2. .dtbo 從儲存空間載入記憶體。
  3. .dtb.dtbo 重疊,以便合併 DT。
  4. 根據合併的 DT 記憶體位址啟動核心。

維持相容性

主要 DTB (來自 SoC 供應商) 會視為 DTBO 的 API 介面。將 DT 分割為 SoC 通用部分和裝置專屬部分後,您必須在日後讓這兩個部分保持相容,包括:

  • 主要資料轉移作業中的資料轉移定義。例如節點、屬性和標籤。主 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 分割區共用公開金鑰)。

詳情請參閱「驗證開機程序」。