DTB 圖像

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結構(包含idrevcustom字段)來選擇正確的 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=NN報告為引導加載程序從引導映像中存在的 DTB 集合中選擇的設備樹的從零開始的索引。