內核模塊支持

通用核心映像 (GKI) 可能不包含使裝置能夠掛載分割區所需的驅動程式支援。為了讓裝置能夠掛載分割區並繼續引導,第一階段init得到增強,可以載入 ramdisk 上存在的核心模組。 ramdisk 分為通用 ramdisk 和供應商 ramdisk。供應商核心模組儲存在供應商 ramdisk 中。載入核心模組的順序是可配置的。

模組位置

ramdisk 是用於第一階段init,以及 A/B 和虛擬 A/B 裝置上的復原/快速啟動映像的檔案系統。它是一個initramfs ,由兩個由引導程式連接的 cpio 存檔組成。第一個 cpio 存檔作為供應商 ramdisk 儲存在供應商引導分區中,包含以下元件:

  • 第一階段init供應商核心模組,位於/lib/modules/
  • modprobe設定文件,位於/lib/modules/modules.depmodules.softdepmodules.aliasmodules.options
  • 一個modules.load文件,指示在第一階段 init 期間載入哪些模組以及載入順序,位於/lib/modules/中。
  • 供應商恢復內核模組,適用於 A/B 和虛擬 A/B 設備,位於/lib/modules/
  • modules.load.recovery指示/lib/modules中的 A/B 和虛擬 A/B 裝置要載入的模組以及載入順序。

第二個 cpio 檔案由 GKI 作為 boot.img 的 ramdisk 提供,並應用於第一個 cpio 存檔,包含first_stage_init及其依賴的函式庫。

第一階段 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),請參閱開機分割區