通用核心映像檔 (GKI) 可能不包含必要的驅動程式支援,無法讓裝置掛載分區。為了讓裝置掛載分割區並繼續啟動,第一階段的 init
會經過強化,以便載入位於 RAM 磁碟的核心模組。ramdisk 會分為一般和供應商 ramdisks,供應商核心模組會儲存在供應商的 ramdisk 中。您可以設定核心模組的載入順序。
模組位置
ramdisk 是第一階段 init,
的檔案系統,也是 A/B 和虛擬 A/B 裝置復原/快速啟動映像檔的檔案系統。這是由兩個 cpio 封存檔組成的 initramfs
,會由引導程式連結。第一個 cpio 封存檔會儲存在供應商/boot 分區中,做為供應商 RAM 磁碟區,其中包含下列元件:
- 位於
/lib/modules/
中的第一階段init
供應商核心模組。 modprobe
設定檔,位於/lib/modules/
:modules.dep
、modules.softdep
、modules.alias
、modules.options
。modules.load
檔案,用於在/lib/modules/
中指出要在第一階段初始化時載入哪些模組,以及載入順序。/lib/modules/
中的供應商復原核心模組 (適用於 A/B 和虛擬 A/B 裝置)modules.load.recovery
,在/lib/modules
中,此值會指出要載入的模組,以及 A/B 和虛擬 A/B 裝置的載入順序。
第二個 cpio 封存檔會以 GKI 的形式提供,做為 boot.img 的 RAM 磁碟,並套用在第一個 cpio 封存檔上,其中包含 first_stage_init
和其依附的程式庫。
在第一階段初始化時載入模組
第一階段的 init
會從 RAM 磁碟上的 /lib/modules/
讀取 modprobe 設定檔。接著,它會讀取 /lib/modules/modules.load
中指定的模組清單 (或在復原的情況下,/lib/modules/modules.load.recovery
),並嘗試依照先前載入檔案中指定的設定,依序載入每個模組。為了滿足硬性或軟性依附元件,系統可能會偏離要求的順序。
建構支援、第一階段 init
如要指定要複製至供應商 RAM 磁碟 cpio 的核心模組,請在 BOARD_VENDOR_RAMDISK_KERNEL_MODULES
中列出這些模組。建構作業會在這些模組上執行 depmod
,並將產生的 modprobe 設定檔放入供應商的 RAMDISK cpio。
建構作業也會建立 modules.load
檔案,並將檔案儲存在供應商的 RAM 磁碟 cpio 中。根據預設,它包含 BOARD_VENDOR_RAMDISK_KERNEL_MODULES
中列出的所有模組。如要覆寫該檔案的內容,請使用 BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
,如以下範例所示:
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \ device/vendor/mydevice-kernel/first.ko \ device/vendor/mydevice-kernel/second.ko \ device/vendor/mydevice-kernel/third.ko
建構支援,完整版 Android
與 Android 10 以下版本相同,Android 平台會將 BOARD_VENDOR_KERNEL_MODULES
中列出的核心模組複製至 /vendor/lib/modules
中的供應商分區。平台建構作業會在這些模組上執行 depmod
,並將 depmod
輸出檔案複製到相同位置的供應商分區。從 /vendor
載入核心模組的機制,與先前 Android 版本相同。您可以決定何時及如何載入這些模組,但通常會使用 init.rc
指令碼執行此操作。
萬用字元和整合的核心版本
如果供應商將裝置核心版本與 Android 平台版本結合,可能會遇到問題,因為他們會使用上述 BOARD
巨集指定要複製至裝置的核心模組。如果供應商不想在裝置的平台建構檔案中列出核心模組,他們可以使用萬用字元 ($(wildcard device/vendor/mydevice/*.ko
)。請注意,在整合核心版本中無法使用萬用字元,因為叫用時該萬用字元無法在 makefile 中展開,而巨集在 makefile 中已展開,因此核心模組尚未建構,因此巨集為空白。
為解決這個問題,供應商可能會請供應商建立 ZIP 封存檔,並在該封存區中加入要複製到各個分區的核心模組。在 BOARD_*_KERNEL_MODULES_ARCHIVE
中設定該 ZIP 封存檔的路徑,其中 *
是分區的名稱 (例如 BOARD_VENDOR_KERNEL_MODULES_ARCHIVE
)。Android 平台版本會將這個 ZIP 封存檔解壓縮至適當位置,並在模組上執行 depmod
。
核心模組 ZIP 封存檔應設有編譯規則,確保平台建構作業可在需要時產生封存檔。
復原
在先前的 Android 版本中,系統會在 BOARD_RECOVERY_KERNEL_MODULES
中指定復原作業所需的核心模組。在 Android 12 中,仍會使用這個巨集指定復原作業所需的核心模組。不過,復原核心模組會複製至供應商的 RAMDISK cpio,而非一般 RAMDISK cpio。根據預設,BOARD_RECOVERY_KERNEL_MODULES
中列出的所有核心模組會在第一階段 init
期間載入。如果只想載入這些模組的子集,請在 BOARD_RECOVERY_KERNEL_MODULES_LOAD
中指定該子集的內容。
相關說明文件
如要瞭解如何建立供應商啟動分割區 (其中包含本頁提及的供應商 RAMDISK),請參閱「啟動分割區」。