我在写一个内核模块,我发现了一个问题,再次测试我的LKM中心。
uname -a print 3.10.0-123.13.2.el7.x86_64,我正在用这个kernel-headers /usr/src/kernels/3.10.0-123.13.2.el7编译我的KM。 x86_64 /并使用LINUX_VERSION_CODE来定义我的代码段。
我的问题是,编译失败,因为内核头文件包含在更多新内核版本中添加的代码,但LINUX_VERSION_CODE返回3.10。
例如,nf_hookfn在内核3.13中被修改,我的标题中已经有了这个修改。
我能做什么?
答案 0 :(得分:1)
LINUX_VERSION_CODE
返回Linux版本 3.10 和不 CentOS Linux版 3.10.0-123.13.2.el7 。从理论上讲,他们不应该使用API更改来应用补丁......你刚刚发现了原因:)
如果在CentOS上可以更改稳定的API,它们应该为CentOS提供类似于LINUX_VERSION_CODE
的内容。
您可以定义自己的预处理器变量,并在编译时根据您要使用的内核版本断言或取消断言(标准3.10或CentOS 3.10)
#ifdef CENTOS_PATCH /* CentOS 3.10 */
....
#else /* Standard 3.10 */
....
#endif
但是你必须管理两个不同的二进制文件
答案 1 :(得分:1)
Centos为此提供了一些有用的宏:
#if RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2)
//
#else
//
#endif
是的,Centos定制内核对最近的Linux内核进行了一些更改。