通用核心映像 (GKI) 可能不包含使裝置能夠掛載分割區所需的驅動程式支援。為了讓裝置能夠掛載分割區並繼續引導,第一階段init
得到增強,可以載入 ramdisk 上存在的核心模組。 ramdisk 分為通用 ramdisk 和供應商 ramdisk。供應商核心模組儲存在供應商 ramdisk 中。載入核心模組的順序是可配置的。
模組位置
ramdisk 是用於第一階段init,
以及 A/B 和虛擬 A/B 裝置上的復原/快速啟動映像的檔案系統。它是一個initramfs
,由兩個由引導程式連接的 cpio 存檔組成。第一個 cpio 存檔作為供應商 ramdisk 儲存在供應商引導分區中,包含以下元件:
- 第一階段
init
供應商核心模組,位於/lib/modules/
。 -
modprobe
設定文件,位於/lib/modules/
:modules.dep
、modules.softdep
、modules.alias
、modules.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),請參閱開機分割區。