001ye 发表于 2004-6-18 22:25:43

请教,linux的驱动模块的问题!

我按照《linux设备驱动程序》这本书的第一个程序写的!但是不行,请教各位大大,应该怎么办阿!
我的程序:
#define MODULE
#include <linux/module.h>

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

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

我编译时的,警告:
# gcc -Wall -c module.c
module.c: In function `init_module':
module.c:6: warning: implicit declaration of function `printk'

我加载模块时的,错误:
# insmod module.o
module.o: kernel-module version mismatch
      module.o was compiled for kernel version 2.4.20
      while this kernel is version 2.4.20-8.

我用的是red hat 9.0。
谢谢!

_z_ 发表于 2004-6-18 23:12:58

#define __KERNEL__

or

gcc -Wall -c -D__KERNEL__ module.c


insmod -f module.o

or

modify the version number

Dragonfly 发表于 2004-6-19 03:02:48

search here and find a hello world example.

001ye 发表于 2004-6-19 11:17:42

各位大大,编译时还有警告:
# gcc -Wall -c -D__KERNEL__ module.c
module.c: In function `init_module':
module.c:6: warning: implicit declaration of function `printk'
加载模块的时候,还有:
# insmod -f module.o
insmod: a module named module already exists
请教,这是什么问题啊?怎么解决!谢谢!

acesx 发表于 2004-7-11 22:30:29

你需要指定内核源代码的路径。

ttjswdy 发表于 2004-7-12 17:43:59

你是不是用的red hat linux9?我在学习《linux设备驱动程序》时,也遇到过类似问题,我的理解和解决方法是这样的,希望对你能有帮助:
一开始我编译那本书提供的例子时,插入模块也是出现和你一样的警告,说模块版本和内核版本不匹配,我觉得所谓的版本不匹配,应该指的是你所用的内核头文件的版本应该和你所用的操作系统内核匹配。我发现我的red hat9里的/usr/src/下并没有linux内核的源码,这种情况下你所需要的应用于内核编程的头文件默认的目录其实是/usr/include/linux,而不是/usr/src/linux-2.4.20-8/include/linux/。事实上/usr/incude/linux/里的头文件的版本是2.4.20而不是2.4.20-8,我想这应该是出警告的原因。
解决办法是下载linux-2.4.20-8的内核源码,放到/usr/src目录下(如果你的/usr/src/下已经有了linux-2.4.20-8的内核源码的话,前面一步就可以省了),然后编译内核模块时加上编译选项“-I/usr/src/linux-2.4.20-8/include/”,这样你编译器会优先到正宗的2.4.20-8版本源码的include目录下寻找头文件,所以你的模块版本就是2.4.20-8了。
页: [1]
查看完整版本: 请教,linux的驱动模块的问题!