核心模組支援

通用核心映像檔 (GKI) 可能不包含必要的驅動程式支援,無法讓裝置掛載分區。為了讓裝置掛載分割區並繼續啟動,第一階段的 init 會經過強化,以便載入位於 RAM 磁碟的核心模組。ramdisk 會分為一般和供應商 ramdisks,供應商核心模組會儲存在供應商的 ramdisk 中。您可以設定核心模組的載入順序。

模組位置

ramdisk 是第一階段 init, 的檔案系統,也是 A/B 和虛擬 A/B 裝置復原/快速啟動映像檔的檔案系統。這是由兩個 cpio 封存檔組成的 initramfs,會由引導程式連結。第一個 cpio 封存檔會儲存在供應商/boot 分區中,做為供應商 RAM 磁碟區,其中包含下列元件:

  • 位於 /lib/modules/ 中的第一階段 init 供應商核心模組。
  • modprobe 設定檔,位於 /lib/modules/modules.depmodules.softdepmodules.aliasmodules.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),請參閱「啟動分割區」。