Android 實作項目可以包含裝置樹狀結構 blob (DTB) 映像檔,供引導程式使用。DTB 映像檔的位置 (以及指定 DTB 圖像參數的選項) 會因 Android 版本而異。
在 Android 11 中,使用一般核心映像檔 (GKI) 的裝置必須支援供應商開機分區,其中包含從開機分區搬遷的所有供應商專屬資訊。由於 DTB 映像檔包含廠商專屬資料,因此現在是廠商開機分區的一部分。如要指定 DTB 映像檔參數,請參閱「供應商啟動標頭」。
在 Android 10 中,裝置可以在啟動分割區中加入 DTB 映像檔。如要指定 DTB 映像檔參數,請參閱「在開機映像檔中加入 DTB 映像檔」。
在 Android 9 以下版本中,DTB 映像檔可以位於其專屬的分割區,也可以附加至核心
image.gz
以建立核心 + DTB 映像檔 (然後傳遞至mkbootimg
以建立boot.img
)。
DTB 圖片格式
在 Android 10 以上版本中,DTB 圖片必須使用下列其中一種格式:
連接在一起的 DT 元組。系統啟動載入程式會使用每個 FDT 標頭中的
totalsize
欄位來讀取及剖析對應的 blob。DTB/DTBO 分區。引導程式有一種有效的方法,可透過檢查
dt_table_entry
結構體 (包含id
、rev
和custom
欄位) 來選取正確的 DT blob,該結構體可儲存項目的硬體識別資訊。詳情請參閱「DTB/DTBO 區隔區」。
在開機映像檔中加入 DTB 映像檔
搭載 Android 10 的裝置可以在開機映像檔中加入 DTB 映像檔。這樣一來,Android 就不需要支援將 DTB 映像檔附加至核心的 image.gz
指令碼,並可使用供應商測試套件 (VTS) 測試,驗證 (並標準化) DTB 位置。
此外,如果是非 A/B 裝置,建議您將 DTB 當做復原映像檔的一部分,而不要放在單獨的分區中,以免 OTA 中斷造成問題。在 OTA 期間,如果在更新 DTB 分割區後 (但尚未完成完整更新) 發生問題,裝置會嘗試啟動至復原模式來完成 OTA;不過,由於 DTB 分割區已更新,因此可能會與復原映像檔 (尚未更新) 發生不相符的情形。將 DTB 映像檔納入開機映像檔格式,可讓復原映像檔自給自足 (也就是不依賴其他分割區),進而避免發生這類問題。
開機映像檔結構
搭載 Android 10 的裝置可透過下列啟動映像檔結構納入 DTB 映像檔。
開機映像檔區段 | 頁數 |
---|---|
開機頁首 (1 頁) | 1 |
核心 (l 頁面) | l = (kernel_size + page_size -
1) / page_size |
Ramdisk (m 頁面) | m = (ramdisk_size + page_size -
1) / page_size |
第二階段啟動載入程式 (n 個頁面) | n = (second_size + page_size -
1) / page_size |
復原 DTBO (o 頁面) | o = (recovery_dtbo_size + page_size -
1) / page_size |
DTB (p 頁面) | p = (dtb_size + page_size -
1) / page_size |
DTB 圖片路徑
如果是搭載 Android 10 的裝置,您可以使用 mkbootimg.py
工具和下列引數,指定 DTB 映像檔的路徑。
引數 | 說明 |
---|---|
dtb |
開機/復原映像檔中要納入的 DTB 映像檔路徑。 |
dtb_offset |
新增至 base 引數時,會提供最終裝置樹狀結構的實際載入位址。舉例來說,如果 base 引數是 0x10000000 ,且 dtb_offset 引數為 0x01000000 ,系統會將開機映像檔標頭中的 dtb_addr_field 填入 0x11000000 。 |
您必須使用板卡設定變數 BOARD_PREBUILT_DTBIMAGE_DIR
指定 DTB 映像檔的路徑。如果 BOARD_PREBUILT_DTBIMAGE_DIR
目錄中有多個副檔名為 *.dtb
的檔案,Android 建構系統會串連這些檔案,以建立用於建立開機映像檔的最終 DTB 映像檔。
如要將引數 dtb
傳遞至 mkbootimg.py
,並使用 BOARD_PREBUILT_DTBIMAGE_DIR
指定目錄中的 DTB 映像檔,板卡設定變數 BOARD_INCLUDE_DTB_IN_BOOTIMG
必須設為 true
。例如:
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
您可以將 dtb_offset
引數附加至 BOARD_MKBOOTIMG_ARGS
板卡設定變數,並附上其他偏移量和標頭版本。例如:
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
系統啟動載入程式支援
如要讓 VTS 在執行 Android 10 的裝置上順利執行,引導程式必須支援更新的啟動映像檔,並新增 androidboot.dtb_idx
核心指令列參數,指出所選裝置樹狀結構 (DT) 的索引。您只能指定一個 (1) 索引。舉例來說,參數 androidboot.dtb_idx=N
會將 N
回報為 bootloader 從啟動映像檔中一組 DTB 選取的裝置樹狀結構,以 0 為基底的索引。