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
結構(包含id
、rev
和custom
欄位),該結構可以保存條目的硬體標識資訊。詳細資訊請參閱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 參數為0x10000000 且dtb_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=N
將N
報告為引導程式從引導映像中存在的 DTB 集中選擇的裝置樹的從零開始的索引。