通用內核映像 (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.dep
,modules.softdep
,modules.alias
,modules.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),請參閱引導分區。