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

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



...全文
135 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
vctony 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
  • 打赏
  • 举报
回复
那个不是问题,实际上我写其他的模块也出现这种问题。
会不会跟内核版本有关??
vctony 2004-10-08
  • 打赏
  • 举报
回复
为什么不写到一个文件里?
tkit 2004-10-08
  • 打赏
  • 举报
回复
insmod会检查模块编译时的编本号和当前运行内核的版本号,如果不一致,就有上述警告。因为新的内核在某些函数接口,例如参数上发生了变化,由于模块编译环境不一致,这就无法在编译时报错,运行就可能造成严重后果。-f则忽略了这些情况,但比较危险。最好是将MODVERSION编入你的内核,这样编译好的符号会带一个校验和,后者综合了参数个数和类型信息,如果接口未发生任何变化,则校验和一致,即使版本号不一致也没关系
hiairfly 2004-10-08
  • 打赏
  • 举报
回复
你知道为什么吗? 难道就没有其他到方法吗? with warnings 让人很不放心啊!

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧