通用核心映像檔 (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.dep
、modules.softdep
、modules.alias
、modules.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 磁碟),請參閱「啟動分區」。