正确的功能检查内核模块源代码

时间:2016-06-22 12:33:31

标签: c linux-kernel kernel-module kbuild

场景1:我尝试使用vanilla内核3.10(实际上,来自Elrepo的IBM)将GPFS kernel-lt驱动程序安装到RHEL6上。由于以下原因,GPL部分不会编译:

  • 传递给函数
  • 的参数太多/太少
  • struct x没有这样的成员
  • type mismatch

他们的代码编译好RHEL / Suse内核比我的更老或更新,但在这里失败。

场景2: 我尝试使用stock内核在softiwarp上编译开源RHEL6驱动程序,但是它失败并且与方案1中的错误相同。但是,它在vanilla内核上编译得很好。

这一切都是因为他们的功能检查标题如下所示:

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

但是RHEL和Suse有很多后退和错误修正,所以他们的3.10.101与香草3.10.101不一样。

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

1 个答案:

答案 0 :(得分:0)

  

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

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

因为我们正在谈论Autoconf,但是,只要它针对与你正在构建的内核相对应的内核头文件运行,至少有一些Autoconf宏应该适合你,你应该能够为他人编写自定义Autoconf测试。实际上,编译器在构建时可以检测到的任何问题,Autoconf也应该能够测试。

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