c - 对内核模块源代码进行适当的功能检查

标签 c linux-kernel kernel-module kbuild

场景 1: 我正在尝试将 IBM GPFS 驱动程序安装到带有 vanilla 内核 3.10(实际上,kernel -lt 来自 Elrepo)。由于以下原因,GPL 部分无法编译:

  • 传递给函数的参数太多/太少
  • struct x 没有这样的成员
  • 类型不匹配

他们的代码在比我的旧或新的 RHEL/Suse 内核上编译得很好,但在这里失败了。

场景 2: 我正在尝试在 RHEL6 上使用标准内核编译开源 softiwarp 驱动程序,但它失败并出现与场景 1 相同的错误。但是,它在 vanilla 内核上编译得很好.

这一切都是因为他们的功能检查 header 看起来像这样:

#if LINUX_KERNEL_VERSION >= 2061300
#define FOO <newer variant>
#else
#define FOO <older variant>
#endif

但 RHEL 和 Suse 有很多向后移植和错误修复,所以它们的 3.10.101 与 vanilla 3.10.101 不同。

如何编写代码来检查功能,而不是版本号?在用户空间程序中,我会使用 autoconf 宏 AC_CHECK_MEMBER/AC_CHECK_FUNC

最佳答案

How to write code that will check features, not version number? In a user-space program I would use autoconf macros AC_CHECK_MEMBER/AC_CHECK_FUNC

标准预处理器的功能比某些人想象的要少得多。它没有能力直接做你想做的事。 Autoconf 在这方面也没有提供魔法。它只是在配置时执行测试,通常只是通过检查编译器是否接受给定的代码片段,并且主要通过定义预处理器宏来将结果传达给编译器。 (并且您有责任在条件测试中根据需要使用这些宏,就像您的示例中的那样。)

然而,由于我们谈论的是 Autoconf,只要它针对与您正在构建的内核相对应的内核头文件运行,至少一些 Autoconf 宏应该对您有用,并且您应该能够编写为其他人定制 Autoconf 测试。事实上,编译器可以在构建时检测到的任何问题,Autoconf 也应该能够测试。

当然,也可以选择让模块构建器能够在出现此类棘手问题时明确指示所需的配置详细信息。例如,调整特征选择宏以同时注意为构建器保留的用于调整结果的符号。

关于c - 对内核模块源代码进行适当的功能检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37968134/

相关文章:

c - Linux内核开发中如何有效迭代

在内核模块中将网络字节序IP转换为ip4格式的主机字节序

c - 以下二维数组声明之间有什么区别?

c - 结构内存分配错误

c - 如何在 C 中制作 char** 的副本?

linux - 如果Linux内核删除自身会发生什么?

c - 从用户空间读取/写入 proc 条目

c - 如何从内核内置模块发送信号/中断到可加载内核模块?

linux - 使用模块读取内核内存

c++ - 如何检查 configure.ac 中的特定 gcc 功能