当前位置: 技术问答>linux和unix
模块问题?困惑中
来源: 互联网 发布时间:2015-09-19
本文导语: 最近搞到一本,照着书上敲了一个模块的例子!编译后insmod! 报错: kernelhello.o: kernel-module version mismatch kernelhello.o was compiled for kernel version 2.4.20 while this kernel is version 2.4.22-1.2115.nptl. 用的...
最近搞到一本,照着书上敲了一个模块的例子!编译后insmod!
报错:
kernelhello.o: kernel-module version mismatch
kernelhello.o was compiled for kernel version 2.4.20
while this kernel is version 2.4.22-1.2115.nptl.
用的是Fedora core 1
小弟菜鸟还望各位大虾指点一二.
希望各位不要只说毛病,要给出解决办法的哟:)
报错:
kernelhello.o: kernel-module version mismatch
kernelhello.o was compiled for kernel version 2.4.20
while this kernel is version 2.4.22-1.2115.nptl.
用的是Fedora core 1
小弟菜鸟还望各位大虾指点一二.
希望各位不要只说毛病,要给出解决办法的哟:)
|
在内核源代码中include/linux/version.h头文件中的UTS_RELEASE宏,定义了一个版本信息,
由它来指定我们编译的内核的版本信息,也就是uname -r 得到当前运行的内核版本信息。
而我们编译的模块时,也要指定版本信息,也是通过这个宏来指定的,你想为不同的内核版本
编译模块,就要包含相应内核源码中的该头文件,以保证你的模块可以在该内核中运行。
有一个基本的原则,要在一个运行的内核中插入模块,内核的版本和你编译的模块的版本要是一致的。
比如你现在有一个2.4.23的内核源码,你使用这个源码编译好了一个内核
当你你想为你编译好的2.4.23的内核编译要插入的模块,你就要使用2.4.23源码中的相应的头文件。
这样你的内核和模块都使用的是同一套头文件,UTS_RELEASE的值也一样,版本就一致了。
RH 9安装以后,如果你不作修改的话直接进入内核源代码中重新编译内核,
得到的内核版本是2.4.20-8-custom,因为系统默认UTS_RELEASE就是这个值,为了避免安装的时候覆盖掉自带的2.4.20-8内核。
由它来指定我们编译的内核的版本信息,也就是uname -r 得到当前运行的内核版本信息。
而我们编译的模块时,也要指定版本信息,也是通过这个宏来指定的,你想为不同的内核版本
编译模块,就要包含相应内核源码中的该头文件,以保证你的模块可以在该内核中运行。
有一个基本的原则,要在一个运行的内核中插入模块,内核的版本和你编译的模块的版本要是一致的。
比如你现在有一个2.4.23的内核源码,你使用这个源码编译好了一个内核
当你你想为你编译好的2.4.23的内核编译要插入的模块,你就要使用2.4.23源码中的相应的头文件。
这样你的内核和模块都使用的是同一套头文件,UTS_RELEASE的值也一样,版本就一致了。
RH 9安装以后,如果你不作修改的话直接进入内核源代码中重新编译内核,
得到的内核版本是2.4.20-8-custom,因为系统默认UTS_RELEASE就是这个值,为了避免安装的时候覆盖掉自带的2.4.20-8内核。
|
insmod -f是强制装载内核,如果内核不支持强制装载也会失败的.
最解决根本的方法就是改头文件
/usr/include/version.h中有个宏UTS_RELEASE,把它改成你当前内核的版本信息(用uname -r得到)就好了
最解决根本的方法就是改头文件
/usr/include/version.h中有个宏UTS_RELEASE,把它改成你当前内核的版本信息(用uname -r得到)就好了
|
并不是程序错了,而是版本不匹配,
用insmod -f ... 即可.
用insmod -f ... 即可.
|
insmod -f ./kernelhello.o ,
其他的以后拿书再往后看吧.
其他的以后拿书再往后看吧.
|
方式一:
这样编译gcc -c hello.c -I/usr/src/linux-2.4/include -o hello.o
方式二:
cd /usr/src/linux-2.4
make mrproper
make menuconfig(随便弄一下)
make dep
然后再编译
这样编译gcc -c hello.c -I/usr/src/linux-2.4/include -o hello.o
方式二:
cd /usr/src/linux-2.4
make mrproper
make menuconfig(随便弄一下)
make dep
然后再编译