当前位置: 技术问答>linux和unix
求助一个内核模块的版本问题
来源: 互联网 发布时间:2015-12-09
本文导语: 问一个内核模块的版本问题: 我加载模块总是报错:当前版本是2.4.20-8 我的模块版本是2.4.20 可是版本号好像只有三部分表示啊 | 如果你编译的module是内核自带的,那么很简单,你可能选错了...
问一个内核模块的版本问题:
我加载模块总是报错:当前版本是2.4.20-8
我的模块版本是2.4.20
可是版本号好像只有三部分表示啊
我加载模块总是报错:当前版本是2.4.20-8
我的模块版本是2.4.20
可是版本号好像只有三部分表示啊
|
如果你编译的module是内核自带的,那么很简单,你可能选错了内核树,你去/usr/src/linux-2.4.20-8中重新编译该module就好了。
如果是你自己写的module,你一定是在编译module时加错了内核头文件目录,你还是应该在编译时将/usr/src/linux-2.4.20-8/include/linux和/usr/src/linux-2.4.20-8/include/asm放在所有其他头文件搜索路径之前,而不是/usr/include/linux和/usr/include/asm,我的依据是:看上去你的模块kernel_version和内核的不匹配,你一定在编译时包含了/usr/include/linux/module.h,正确的版本的应该来自/usr/src/linux-2.4.20-8/include/linux/module.h,分析如下:
你说的比较笼统,靠你自己诊断了。内核识别模块版本号是用两种机制,一种gensym,该机制为所有内核符号根据接口生成一个唯一的CRC符号串,如果内核和模块都开启了该功能,那么当加载版本不匹配的模块时,就会报错,而且这种错误,当使用强行加载时通常也会失败,原因很简单,因为模快使用的内核函数原型发生了变化。第二种就是kernel_version,这个全局串在linux/module.h中定义,并被编译入所有的模块中,当加载时模块时如果内核和模块任何一个不能使用gensym机制,那么insmod会检查模块的kernel_version符号是否和当前内核的版本标志匹配,如果不匹配则报版本不匹配错,这种情况也许可以通过强行加载解决--当模块所调用的内核函数接口没有变化的时候。
如果是你自己写的module,你一定是在编译module时加错了内核头文件目录,你还是应该在编译时将/usr/src/linux-2.4.20-8/include/linux和/usr/src/linux-2.4.20-8/include/asm放在所有其他头文件搜索路径之前,而不是/usr/include/linux和/usr/include/asm,我的依据是:看上去你的模块kernel_version和内核的不匹配,你一定在编译时包含了/usr/include/linux/module.h,正确的版本的应该来自/usr/src/linux-2.4.20-8/include/linux/module.h,分析如下:
你说的比较笼统,靠你自己诊断了。内核识别模块版本号是用两种机制,一种gensym,该机制为所有内核符号根据接口生成一个唯一的CRC符号串,如果内核和模块都开启了该功能,那么当加载版本不匹配的模块时,就会报错,而且这种错误,当使用强行加载时通常也会失败,原因很简单,因为模快使用的内核函数原型发生了变化。第二种就是kernel_version,这个全局串在linux/module.h中定义,并被编译入所有的模块中,当加载时模块时如果内核和模块任何一个不能使用gensym机制,那么insmod会检查模块的kernel_version符号是否和当前内核的版本标志匹配,如果不匹配则报版本不匹配错,这种情况也许可以通过强行加载解决--当模块所调用的内核函数接口没有变化的时候。