LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3885|回复: 9

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

[复制链接]
发表于 2005-7-18 21:41:32 | 显示全部楼层 |阅读模式
最近在学一些内核方面的东西,都很基础,书上有这么一个引导新手的例子:

文件: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.

请问我该怎么做??望各位指点,先谢过诸位。
发表于 2005-7-18 22:52:13 | 显示全部楼层
这一般是因为你编译模块的时候使用的头文件不对,如果你不用
-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的工具,所以应该没有这样的问题

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

使用道具 举报

 楼主| 发表于 2005-7-19 00:04:31 | 显示全部楼层
谢谢楼上的回答,你说的那个帖子我刚才找了一下,找到了,看过了。

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

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

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

是不是不对啊??应该怎么弄那??再次谢谢你。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-19 01:59:54 | 显示全部楼层
哈哈,^_^,又试了试成功了,但是给了 Warining提示,是with warning执行的

还有一个问题:为什么不显示Hello World那??
回复 支持 反对

使用道具 举报

发表于 2005-7-19 09:14:11 | 显示全部楼层
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")
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-22 12:49:37 | 显示全部楼层
问题解决,原理还不懂,要学的太多了

再次感谢xieweiyi
回复 支持 反对

使用道具 举报

发表于 2005-7-22 16:06:20 | 显示全部楼层
呵呵,其实 就是内核版本的问题!!!
回复 支持 反对

使用道具 举报

发表于 2009-5-7 00:31:12 | 显示全部楼层
好帖子,终于解决我的问题了。。。
回复 支持 反对

使用道具 举报

发表于 2010-4-29 12:56:11 | 显示全部楼层
Post by OnceMemory;1214057
哈哈,^_^,又试了试成功了,但是给了 Warining提示,是with warning执行的

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


这个到底是怎么调成功的呢!我也遇到了同样的问题!
还请详细说下呀!
回复 支持 反对

使用道具 举报

发表于 2010-9-17 11:33:03 | 显示全部楼层
晕,用gcc去编译内核模块, 还是写个makefile吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表