供应商和 ODM DLKM 分区

Android 11 引入了通用内核映像和供应商启动分区的概念。供应商启动分区存储与 GKI 兼容的内核模块,并由第一阶段 init 加载。Android 11 版本之前的内核模块也存储在供应商和 ODM 分区中,并由供应商进程加载。

对于 Android 11 或更高版本,内核和所有内核模块都可以独立于其余分区进行更新。要为存储在供应商分区中的内核模块启用更新(无需供应商分区更新),请将所有供应商分区模块移至名为 Vendor DLKM(动态可加载内核模块)的新分区。然后,您可以独立更新此分区。同样,您可以将 ODM 分区中存储的所有内核模块移至名为 ODM DLKM 的新分区。此分区也可以独立更新。

分区位置

vendor_dlkmodm_dlkm 分区位于超级分区中,作为另一个动态分区。

/vendor/lib/modules 中的 vendor_dlkm 内容

  • 供应商内核模块
  • modprobe 配置文件
  • modules.load 文件

/odm/lib/modules 中的 odm_dlkm 内容

  • ODM 内核模块
  • modprobe 配置文件
  • modules.load 文件

有关内核模块配置文件的更多详情,请参阅内核模块支持

构建支持

构建 vendor_dlkmodm_dlkm 的过程与其他动态分区的构建过程类似。

vendor_dlkm 构建示例

按照以下示例构建 vendor_dlkm

BoardConfig.mk

BOARD_USES_VENDOR_DLKMIMAGE := true
BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
BOARD_<GROUP_NAME>_PARTITION_LIST += vendor_dlkm

<GROUP_NAME> 替换为相应的更新组名称。更新组应为 vendor 分区所在的组。

对于 A/B 和 Virtual A/B 设备,device.mk

AB_OTA_PARTITIONS += vendor_dlkm

fstab

将以下条目添加到 vendor_dlkm 的 fstab 中。根据设备更改标志。使用 CL vendor_dlkm 添加到 CF 作为示例。

vendor_dlkm /vendor_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

odm_dlkm 构建示例

按照以下示例构建 odm_dlkm

BoardConfig.mk

BOARD_USES_ODM_DLKIMAGE := true
BOARD_ODM_DLKIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
BOARD_<group_name>_PARTITION_LIST += odm_dlkm

对于 A/B 和 Virtual A/B 设备,device.mk

AB_OTA_PARTITIONS += odm_dlkm

fstab

将以下条目添加到 odm_dlkm 的 fstab 中。根据设备更改标志。使用 CL odm_dlkm 添加到 CF 作为示例。

odm_dlkm /odm_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

将内核模块复制到分区中

要选择要复制到 vendor_dlkm 分区中的内核模块,请在 BOARD_VENDOR_KERNEL_MODULES 中列出它们。

如果要覆盖 modules.load 的内容,可以在 BOARD_VENDOR_KERNEL_MODULES_LOAD 中指定它。

在构建时,BOARD_VENDOR_KERNEL_MODULES 中列出的模块将安装在 $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules 中。将在 /vendor/lib/modules 处创建一个指向 /vendor_dlkm/lib/modules 的符号链接。

同样,要选择要复制到 odm_dlkm 分区中的内核模块,请在 BOARD_ODM_KERNEL_MODULES 中列出它们。平台构建对模块运行 depmod,并将 depmod 输出文件复制到映像中。构建会创建一个 modules.load 文件,并将其存储在映像中。此文件包含 BOARD_ODM_KERNEL_MODULES 中列出的所有模块。

如果要覆盖 modules.load 的内容,可以在 BOARD_ODM_KERNEL_MODULES_LOAD 中指定它。

在构建时,BOARD_ODM_KERNEL_MODULES 中列出的模块将安装在 $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules 中。将在 /odm/lib/modules 处创建一个指向 /odm_dlkm/lib/modules 的符号链接。

始终对供应商和 ODM 内核模块使用 /vendor/lib/modules/odm/lib/modules

切勿使用 /vendor_dlkm/lib/modules。没有 vendor_dlkm 分区的设备会将 BOARD_VENDOR_KERNEL_MODULES 直接安装到 /vendor/lib/modules。这会带来问题,因为 /vendor_dlkm/lib/modules 不存在。

切勿使用 /odm_dlkm/lib/modules没有 odm_dlkm 分区的设备会将 BOARD_ODM_KERNEL_MODULES 直接安装到 /odm/lib/modules。这会带来问题,因为 /odm_dlkm/lib/modules 不存在。

分区挂载和模块加载

first_stage_init 期间,vendor_dlkmodm_dlkm 分区分别挂载在 /vendor_dlkm/odm_dlkm 目录中。发生这种情况时,/vendor/lib/modules/odm/lib/modules 处的符号链接将变为可用。

然后,供应商进程(如 .rc 脚本)可以根据 modules.load 中指定的顺序加载内核模块。如果需要,供应商进程也可以在稍后加载模块。

有关创建 vendor-boot 分区(其中包含供应商 RAMDisk)的文档,请参阅内核模块支持