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 blob,方法是檢查dt_table_entry結構(包含idrevcustom欄位),該結構可以保存條目的硬體標識資訊。詳細資訊請參閱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 = ( dtb_size + page_size - 1) / page_size

DTB影像路徑

對於運行 Android 10 的設備,您可以使用mkbootimg.py工具和以下參數來指定 DTB 映像的路徑。

爭論描述
dtb若要包含在啟動/復原映像中的 DTB 映像的路徑。
dtb_offset當新增到base參數時,提供最終設備樹的實體載入位址。例如,如果base參數為0x10000000dtb_offset參數為0x01000000 ,則引導映像標頭中的dtb_addr_field將填入0x11000000

必須使用板配置變數BOARD_PREBUILT_DTBIMAGE_DIR來指定 DTB 影像的路徑。如果目錄BOARD_PREBUILT_DTBIMAGE_DIR中存在多個副檔名為*.dtb的文件,則 Android 建置系統會串連這些檔案以建立用於啟動映像建立的最終 DTB 映像。

要將參數dtb使用BOARD_PREBUILT_DTBIMAGE_DIR指定的目錄中的 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 集中選擇的裝置樹的從零開始的索引。