请问问题出在哪里? 内核模块方面的。

hiairfly 2004-10-08 08:48:23
我写了2个简单的模块,编译通过了,但是插入时报错说不正确的内核格式。
请高人帮我看看。

/** start.c**/
#include <linux/kernel.h>
#include <linux/module.h>

int
init_module ()
{
printk ("Hello, World!\n");
return 0;
}

/** stop.c **/
#include <linux/kernel.h>

#define __NO_VERSION__
#include <linux/module.h>
#include <linux/version.h>

void cleanup_module()
{
printk("Bye!\n");
}

/** MakeFile **/
CC=gcc
MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX

hello.o: start.o stop.o
ld -m elf_i386 -r -o hello.o start.o stop.o
start.o: start.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c start.c
stop.o: stop.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c stop.c

make 通过了。
但是 insmod hello.o 报错说
insmod: error inserting 'hello.o': -1 Invalid module format



...全文
105 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tonywxd 2004-10-08
我也是用insmod -f hello.o
回复
hiairfly 2004-10-08
错误是一样的。
有进展了。我原来的内核是2.4.22-1.2115.nptl, 后来我下了个2.6.8的内核编译成功, 我在新内核下做上面的模块,插入模块时都报上面都错误。 后来, 我返回到以前的内核里(2.4.22),插入又报新的错误,如下:
hello.o: kernel-module version mismatch
hello.o was compiled for kernel version 2.4.20
while this kernel is version 2.4.22-1.2115.nptl.

最后, 我只好用 insmod -f hello.o, 有很多warnings, 不过插入了。
请问为什么会这样??
回复
gettext 2004-10-08
insmod start.o
insmod stop.o
可以吗?
回复
hiairfly 2004-10-08
那个不是问题,实际上我写其他的模块也出现这种问题。
会不会跟内核版本有关??
回复
tonywxd 2004-10-08
为什么不写到一个文件里?
回复
tkit 2004-10-08
insmod会检查模块编译时的编本号和当前运行内核的版本号,如果不一致,就有上述警告。因为新的内核在某些函数接口,例如参数上发生了变化,由于模块编译环境不一致,这就无法在编译时报错,运行就可能造成严重后果。-f则忽略了这些情况,但比较危险。最好是将MODVERSION编入你的内核,这样编译好的符号会带一个校验和,后者综合了参数个数和类型信息,如果接口未发生任何变化,则校验和一致,即使版本号不一致也没关系
回复
hiairfly 2004-10-08
你知道为什么吗? 难道就没有其他到方法吗? with warnings 让人很不放心啊!
回复
发动态
发帖子
Linux_Kernel
创建于2007-08-27

4004

社区成员

Linux/Unix社区 内核源代码研究区
申请成为版主
社区公告
暂无公告