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 blob 一個接一個地連接起來。引導加載程序使用每個 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 映像。
要使用BOARD_PREBUILT_DTBIMAGE_DIR
指定的目錄中的 DTB 圖像將參數dtb
傳遞給mkbootimg.py
,必須將板配置變量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
報告為引導加載程序從引導映像中存在的 DTB 集合中選擇的設備樹的從零開始的索引。