保持稳定的内核模块接口 (KMI)

为供应商模块维护稳定的 KMI 至关重要。 GKI 内核以二进制形式构建和交付,供应商可加载模块构建在单独的树中。生成的 GKI 内核和供应商模块必须像构建在一起一样工作。

通常,Linux 社区对主线内核的内核 ABI 稳定性概念持反对态度。面对不同的工具链、配置和不断发展的 Linux 主线内核,在主线中保持稳定的 KMI 是不可行的。但是,可以在具有以下约束的高度受限的 GKI 环境中保持稳定的 KMI:

  • 只有一个配置gki_defconfig可用于构建内核。

  • KMI 仅在同一 LTS 和 Android 版本的内核中是稳定的,例如android13-5.10android12-5.10android13-5.15

    • 没有为android-mainline维护 KMI 稳定性。
  • 只有在 AOSP 中提供并为相应分支定义的特定Clang工具链用于构建内核和模块。

  • 仅监视符号列表中指定的模块使用的已知符号的稳定性并考虑 KMI 符号。

    • 推论是供应商模块必须仅使用 KMI 符号。如果需要非 KMI 符号,则通过失败的模块加载来强制执行此约束。
  • 冻结 KMI 分支后,允许更改但不能破坏 KMI。这些变化包括以下内容:

    • 配置更改
    • 内核代码更改
    • 工具链更改(包括更新)

使用密封构建过程和 LLVM 工具链

密封构建过程通过在kernel/manifest中的repo清单完全描述构建环境来确保稳定的 KMI。例如, android13-5.15的清单包括工具链、构建脚本以及构建通用内核映像 (GKI) 内核所需的所有其他内容。各自的build.config配置文件,例如 GKI 构建配置build.config.gki.aarch64 ,确保正确使用包含的工具来生成一致的构建结果。

使用封闭式构建过程还可以确保树的 ABI 描述是否由 Google 生成(例如,用于android13-5.15abi_gki_aarch64.xml或在包含供应商模块的本地树中生成。用于创建和比较内核模块接口 (KMI) 的ABI 描述也作为清单描述的存储库的一部分提供。

用于构建 GKI 内核的工具链必须与用于构建供应商模块的工具链完全兼容。从 Android 10 开始,所有 Android 内核都必须使用 LLVM 工具链构建。使用 GKI,用于构建产品内核和供应商模块的 LLVM 工具链必须生成与来自 AOSP 的 LLVM 工具链相同的 ABI,并且合作伙伴必须确保 KMI 与 GKI 内核兼容。强烈建议使用提供的构建工具,因为它们提供了兼容性保证。

下一步是什么?