+ -
当前位置:首页 → 问答吧 → 请教一个非常简单的模块程序加载的问题,请大家帮帮忙。

请教一个非常简单的模块程序加载的问题,请大家帮帮忙。

时间:2005-07-19

来源:互联网

最近在学一些内核方面的东西,都很基础,书上有这么一个引导新手的例子:

文件:helloworld.c
#define MODULE
#include <linux/module.h>

int init_module(void)
{
printk("<1> Hello World!\n");
return 0;
}

void cleanup_module(void)
{
printk("<1>Goodbye!\n")
}


我按照书上说的用了下面两条命令。
先编译:#gcc -c helloworld.c
这个通过了。
然后 :#insmod helloworld.o
这时候出现下面问题:
Warining:kernel-module version mismatch.
helloworld.o was compiled for kernel version 2.4.20
while this kernel is version 2.4.20-8.

请问我该怎么做??望各位指点,先谢过诸位。

作者: OnceMemory   发布时间: 2005-07-19

这一般是因为你编译模块的时候使用的头文件不对,如果你不用
-I 指定你的头文件路径的话,那么gcc默认使用
/usr/include/linux

/usr/include/asm
这里的头文件,module.h 里面包含一个叫 version.h 的东西
里面有
#define UTS_RELEASE "2.4.20"
#define LINUX_VERSION_CODE 132116
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
这样的版本信息,可能和当前内核不符。

解决的办法很明显了,要么用 -I 显示指定头文件路径(推荐)
也可以把 /usr/include/linux /usr/include/asm 改成符号连接
指向 /usr/srr/'uname -r'/include 下面的 linux 和 asm-i386 目录
(一般是i386而已,看情况)

以上是针对2.4版本的kernel module,对于2.6的,因为其Makefile里面
都是 直接 -C 去使用内核的 module build的工具,所以应该没有这样的问题

前面贴过一遍了,其实有空的话,翻翻前面的帖子,找不到答案再发问

作者: xieweiyi   发布时间: 2005-07-19

谢谢楼上的回答,你说的那个帖子我刚才找了一下,找到了,看过了。

但是...其实我看不太明白,我是个很新的新手。只是才学了一点gcc命令方面的东西,按照一本Linux内核指导的试验教材自己瞎学点东西。

我刚才按着你说的用-I指定目录的方法试了,insmod还是不行,是不是我指定的目录不对,应该指定哪个??
我是这样用的:gcc -I/usr/src/linux 2.4.20-8/include/asm -i386
然后把上面的改成#include <module.h>

我看到上面那个目录下面有个module.h文件。

是不是不对啊??应该怎么弄那??再次谢谢你。

作者: OnceMemory   发布时间: 2005-07-19

哈哈,^_^,又试了试成功了,但是给了 Warining提示,是with warning执行的

还有一个问题:为什么不显示Hello World那??

作者: OnceMemory   发布时间: 2005-07-19

printk是内核的输出,在默认情况下不会直接打印到屏幕上,而是输出到buf里面,然后到你的log文件里面
你可以 dmesg 看到他,如果输出太多就 dmesg 5 这样输出最后5行,应该就看到了.
至于warning,你说的是什么 warning? License?
你可以在你的代码里面增加一行
MODULE_LICENSE("GPL")
来说明你的模块的LICENSE就可以了

#define MODULE
#include <linux/module.h>
MODULE_LICENSE("GPL");

int init_module(void)
{
printk("<1> Hello World!\n");
return 0;
}

void cleanup_module(void)
{
printk("<1>Goodbye!\n")
}

作者: xieweiyi   发布时间: 2005-07-19

问题解决,原理还不懂,要学的太多了

再次感谢xieweiyi

作者: OnceMemory   发布时间: 2005-07-22

呵呵,其实 就是内核版本的问题!!!

作者: paowang   发布时间: 2005-07-22

好帖子,终于解决我的问题了。。。

作者: deargodzw   发布时间: 2009-05-07

引用:
作者: OnceMemory
哈哈,^_^,又试了试成功了,但是给了 Warining提示,是with warning执行的

还有一个问题:为什么不显示Hello World那??
这个到底是怎么调成功的呢!我也遇到了同样的问题!
还请详细说下呀!

作者: haiyywvf   发布时间: 2010-04-29

热门下载

更多