核心模組支援

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

模組位置

ramdisk 是第一階段的檔案系統,也是 A/B 和虛擬 A/B 裝置上復原/fastbootd 映像檔的檔案系統。init,這兩個 cpio 封存檔會由開機載入程式串連。initramfs第一個 cpio 封存檔會儲存在供應商開機分割區中,做為供應商 ramdisk,內含下列元件:

  • 第一階段 init 供應商核心模組,位於 /lib/modules/
  • modprobe 設定檔,位於 /lib/modules/modules.depmodules.softdepmodules.aliasmodules.options
  • modules.load 檔案,指出要在第一階段初始化期間載入哪些模組,以及載入順序 (位於 /lib/modules/ 中)。
  • 適用於 A/B 和虛擬 A/B 裝置的供應商復原核心模組,位於 /lib/modules/
  • modules.load.recovery,指出要載入的模組,以及 A/B 和虛擬 A/B 裝置的載入順序 (位於 /lib/modules 中)。

第二個 cpio 封存檔會與 GKI 一併提供,做為 boot.img 的 ramdisk,並套用至第一個封存檔,其中包含 first_stage_init 和依附的程式庫。

在第一階段初始化中載入模組

第一階段 init 會先從 ramdisk 讀取 /lib/modules/ 中的 modprobe 設定檔。接著,它會讀取 /lib/modules/modules.load (或復原時的 /lib/modules/modules.load.recovery) 中指定的模組清單,並嘗試依序載入每個模組,遵循先前載入檔案中指定的設定。為滿足硬性或軟性依附元件,系統可能會調整要求的順序。

建構支援功能,第一階段初始化

如要指定要複製到供應商 ramdisk cpio 的核心模組,請在 BOARD_VENDOR_RAMDISK_KERNEL_MODULES 中列出這些模組。建構作業會depmod在這些模組上執行,並將產生的 modprobe 設定檔放在供應商 ramdisk cpio 中。

建構作業也會建立 modules.load 檔案,並將其儲存在供應商 ramdisk 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)。請注意,萬用字元不適用於整合式核心建構作業,因為在叫用 make 且巨集在 makefile 中展開時,核心模組尚未建構,因此巨集為空白。

為解決這個問題,供應商可能會讓核心建構作業建立含有核心模組的 ZIP 封存檔,並將這些模組複製到每個分割區。在 BOARD_*_KERNEL_MODULES_ARCHIVE 中設定該 zip 封存檔的路徑,其中 * 是分割區的名稱 (例如 BOARD_VENDOR_KERNEL_MODULES_ARCHIVE)。Android 平台建構作業會將這個 zip 封存檔解壓縮到適當位置,並在模組上執行 depmod

核心模組 ZIP 封存檔應具備 make 規則,確保平台建構作業可在需要時產生封存檔。

復原

在先前的 Android 版本中,復原所需的核心模組是在 BOARD_RECOVERY_KERNEL_MODULES 中指定。在 Android 12 中,復原所需的核心模組仍使用這個巨集指定。不過,復原核心模組會複製到供應商 ramdisk cpio,而不是一般 ramdisk cpio。根據預設,BOARD_RECOVERY_KERNEL_MODULES 中列出的所有核心模組都會在第一階段 init 期間載入。如果只想載入部分模組,請在 BOARD_RECOVERY_KERNEL_MODULES_LOAD 中指定該部分模組的內容。

如要瞭解如何建立供應商啟動分區 (內含本頁面提及的供應商 RAM 磁碟),請參閱「啟動分區」。