将内核功能配置为 GKI 模块

本页旨在介绍如何将新的内核功能或现有的内置内核功能配置为 GKI 模块。

将新功能配置为 GKI 模块

  1. 对于新功能,请修改 gki_defconfig 并将所需内核功能的配置项从 n 改设为 m (=m)。在 arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig 中均配置此设置。

  2. 将为该功能生成的 KO (.ko) 文件添加到 common/modules.bzlCOMMON_GKI_MODULES_LIST 部分。依序添加文件。如果您不确定生成的所有文件,构建会失败并会列出应向列表添加的所有必要 KO 文件。

  3. 将第 2 步中的同一组 KO 文件(按升序排列以便在运行时进行二进制文件搜索)添加到 common/android/gki_protected_modules 中,以将该模块指定为受保护的 GKI 模块。使用 tools/bazel run //common:kernel_aarch64_abi_update_protected_exports 更新受保护的导出列表,使其包含 common/android/abi_gki_protected_exports 中新添加的模块中的导出内容。即使已被指定为受保护的 GKI 模块,这些模块仍必须获得 Google 批准,才能成为受官方保护的模块。

  4. 将第 2 步中的同一组 KO 文件(按升序排列以便在运行时进行二进制文件搜索)添加到 common/android/gki_system_dlkm_modules 中,以确保这些文件都被复制到内核的 out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz 中。system_dlkm_staging_archive.tar.gz 归档中的模块可用作输入内容,以在平台 build 中生成 system_dlkm.img

  5. 提交您的更改以供审核。GKI 模块是 Android 专用内核功能,因此无需在上游提交模块转换补丁。不过,您必须遵循其他准则,才能提交 Android 通用内核 (ACK) 补丁

将内置内核功能配置为 GKI 模块

  1. 对于现有的内置内核功能,请修改 gki_defconfig 并将所需内核功能的配置项从 y 改设为 m (=m)。在 arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig 中均配置此设置。

  2. 将为该功能生成的 KO (.ko) 文件添加到 common/modules.bzlCOMMON_GKI_MODULES_LIST 部分。依序添加文件。如果您不确定生成的所有文件,构建会失败并会列出应向列表添加的所有必要 KO 文件。

  3. 将第 2 步中的同一组 KO 文件(按升序排列以便在运行时进行二进制文件搜索)添加到 common/android/gki_protected_modules 中,以将该模块指定为受保护的 GKI 模块。使用 tools/bazel run //common:kernel_aarch64_abi_update_protected_exports 更新受保护的导出列表,使其包含 common/android/abi_gki_protected_exports 中新添加的模块中的导出内容。即使已被指定为受保护的 GKI 模块,这些模块仍必须获得 Google 批准,才能成为受官方保护的模块。

  4. 将第 2 步中的同一组 KO 文件(按升序排列以便在运行时进行二进制文件搜索)添加到 common/android/gki_system_dlkm_modules 中,以确保这些文件都被复制到内核的 out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz 中。system_dlkm_staging_archive.tar.gz 归档中的模块可用作输入内容,以在平台 build 中生成 system_dlkm.img

  5. 提交您的更改以供审核。GKI 模块是 Android 专用内核功能,因此无需在上游提交模块转换补丁。不过,您必须按照其他准则提交 Android 通用内核 (ACK) 补丁

将受保护的 GKI 模块转换为不受保护的模块

  1. 从位于 common/android/gki_protected_modules 的受保护模块列表中移除从受保护状态转换为不受保护状态的模块。

  2. 使用 tools/bazel run //common:kernel_aarch64_abi_update_protected_exports 更新受保护导出的列表,以排除 common/android/abi_gki_protected_exports 中新转换的不受保护模块中的导出内容。

  3. 提交您的更改以供审核。GKI 模块是 Android 专用内核功能,因此无需在上游提交模块转换补丁。不过,您必须按照其他准则提交 Android 通用内核 (ACK) 补丁

GKI 模块符号违规行为解决方法快速指南

当未签名模块违反 GKI 模块的符号保护设置时,模块加载期间可能会遇到两种类型的错误,从而导致失败。

1. 使用受保护符号的未签名模块

错误:

module: Protected symbol: some_kernel_function (err -13)

原因:

module.ko 文件是一个未签名的供应商模块,它会尝试在加载期间解析 GKI 模块导出的符号 some_kernel_function,而不会在供应商符号列表中列出该符号。

解决方法:

如果 module.ko 不是受保护的 GKI 模块,更新符号列表以在供应商符号列表中添加 some_kernel_function 可解决该错误。或者,也可以使用 GKI 版本的 module.ko

2. 导出受保护符号的未签名模块

错误:

module: exports protected symbol some_kernel_function

原因:

导出 some_kernel_function 的模块是受保护的 GKI 模块,module.ko 可能是该模块的未签名自定义版本。当 module.ko 尝试导出 some_kernel_function(只能由已签名的 GKI 模块导出)时,加载会失败并显示此消息。

解决方法:

如果未签名模块是自定义版本,则可以使用导出 some_kernel_function 的模块的 GKI 版本来修正此问题。