系統啟動載入程式總覽

開機載入程式是供應商專屬的映像檔,負責在裝置上啟動核心。開機載入程式會保護裝置狀態,並負責初始化受信任的執行環境 (TEE),以及繫結其信任根。啟動載入程式也會在將執行作業移至核心之前,驗證 bootrecovery 分區的完整性。

系統啟動載入程式流程範例

以下是開機載入程式流程範例:

  1. 載入並初始化記憶體。

  2. 按照驗證開機程序流程驗證裝置。

  3. 根據驗證開機程序流程,驗證啟動分區,包括 bootdtboinit_bootrecovery。在這個步驟中,請檢查開機映像檔標頭版本,並據此剖析標頭。

  4. 如果使用 A/B 更新,請判斷要啟動的目前插槽。

  5. 判斷是否應啟動復原模式。詳情請參閱「支援 OTA 更新」。

  6. 載入開機映像檔,例如 boot.imgvendor_boot.imginit_boot.img 和其他專屬供應商開機映像檔。這些開機映像檔包含核心和 ramdisk 映像檔。

    1. 將核心載入記憶體,做為可自行執行的壓縮二進位檔。核心會自行解壓縮,並開始在記憶體中執行。

    2. 將 ramdisk 和 bootconfig 區段載入記憶體,建立 initramfs

與開機載入程式相關的其他功能

以下列出可實作的其他開機載入程式相關功能:

  • 裝置樹狀結構疊加層 (DTO)。 裝置樹狀結構疊加層可讓開機載入器支援不同的硬體設定。DTO 會編譯成裝置樹狀結構 Blob (DTB),供系統啟動載入程式使用。

  • 核心映像檔虛擬位址隨機化。開機載入器支援隨機載入核心映像檔的虛擬位址。如要隨機設定位址,請在核心設定中將 RANDOMIZE_BASE 設為 true。啟動載入程式必須在 /chosen/kaslr-seed 裝置樹狀結構節點中傳遞隨機 u64 值,藉此提供熵。

  • 驗證開機程序驗證開機程序可讓系統啟動載入程式確保所有執行的程式碼都來自可信任的來源。

  • 啟動設定開機設定適用於 Android 12 以上版本,可將建構和系統啟動載入程式的設定詳細資料傳遞至作業系統。在 Android 12 之前,系統會使用前置字元為 androidboot 的核心指令列參數。

  • 無線更新 (OTA)。現場的 Android 裝置可以接收並安裝系統、應用程式軟體和時區規則的 OTA 更新。這項功能會影響開機載入程式的實作方式。如需 OTA 的一般資訊,請參閱「OTA 更新」。如要瞭解系統啟動載入程式專屬的 OTA 實作詳細資料,請參閱「支援 OTA 更新」。

  • 版本繫結版本繫結會將安全金鑰繫結至作業系統和修補程式等級版本。版本繫結可確保攻擊者即使發現舊版系統或 TEE 軟體有弱點,也無法將裝置還原至有弱點的版本,並使用以新版建立的金鑰。為支援版本繫結,開機載入程式必須提供特定資訊。詳情請參閱「AVB 屬性中的版本資訊」。

核心指令列

從下列位置串連核心指令列:

  • 系統啟動載入程式指令列:由系統啟動載入程式決定的一組靜態和動態參數

  • 裝置樹狀結構:從 chosen/bootargs 節點開始

  • defconfig:從 CONFIG_CMDLINE

  • boot.img:從指令列 (如需位移和大小,請參閱 system/core/mkbootimg/bootimg.h

自 Android 12 起,對於需要傳遞至 Android 使用者空間的 androidboot.* 參數,我們可以使用 bootconfig,而非核心指令列。