內核模塊支持

通用內核映像 (GKI) 可能不包含使設備能夠掛載分區所需的驅動程序支持。為了使設備能夠掛載分區並繼續引導,增強了第一階段init以加載存在於 ramdisk 上的內核模塊。 ramdisk 分為通用和供應商 ramdisk。供應商內核模塊存儲在供應商 ramdisk 中。加載內核模塊的順序是可配置的。

模塊位置

ramdisk 是第一階段init,以及 A/B 和虛擬 A/B 設備上的 recovery/fastbootd 映像的文件系統。這是一個由引導加載程序連接的兩個 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指示要加載的模塊,以及在/lib/modules中對於 A/B 和虛擬 A/B 設備的加載順序。

第二個 cpio 歸檔文件,作為 boot.img 的 ramdisk 隨 GKI 一起提供並應用在第一個文件之上,包含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 及更低版本中的情況一樣, BOARD_VENDOR_KERNEL_MODULES中列出的內核模塊由 Android 平台構建複製到位於/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 11 中,恢復所需的內核模塊仍使用此宏指定。但是,恢復內核模塊被複製到供應商 ramdisk cpio,而不是通用 ramdisk cpio。默認情況下, BOARD_RECOVERY_KERNEL_MODULES中列出的所有內核模塊都在第一階段init期間加載。如果您只想加載這些模塊的子集,請在BOARD_RECOVERY_KERNEL_MODULES_LOAD中指定該子集的內容。

要了解如何創建供應商引導分區(其中包含本頁提到的供應商 ramdisk),請參閱引導分區