Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

內核模塊支持

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

模塊位置

ramdisk是用於第一階段init,以及A / B和虛擬A / B設備上的恢復/快速啟動映像的文件系統。它是由兩個cpio歸檔文件組成的initramfs ,這些歸檔文件由引導加載程序連接。第一個cpio歸檔文件(作為供應商ramdisk存儲在vendor-boot分區中)包含以下組件:

  • 第一階段的init供應商內核模塊,位於/lib/modules/
  • modprobe配置文件,位於/lib/modules/modules.depmodules.softdepmodules.aliasmodules.options
  • 一個modules.load文件,該文件指示/lib/modules/在第一階段初始化期間要加載的模塊以及順序。
  • /lib/modules/用於A / B和虛擬A / B設備的供應商恢復內核模塊
  • modules.load.recovery指示/lib/modules A / B和虛擬A / B設備要加載的模塊以及順序。

first_stage_init提供的第二個cpio歸檔文件是boot.img的虛擬磁盤,並應用在第一個cpio歸檔文件中,其中包含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腳本來完成的。

通配符和集成內核構建

使用上述BOARD宏指定要復製到設備上的內核模塊時,將其設備內核版本與Android平台版本相結合的供應商可能會遇到問題。如果供應商希望避免在設備的平台構建文件中列出內核模塊,則可以使用通配符( $(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)的信息,請參閱“引導分區”