传奇世界私服 传世私服
网站首页 Linux博客  Linux网址导航  Linux下载  Linux群集  Linux搜索  网站地图
 


发新话题
打印

一个简单的2.6内核模块也出问题

一个简单的2.6内核模块也出问题

各位高手请指点,刚学习linux,从书上抄了一个简单的内核模块,好不容易编译通过,insmod的时候,提示
insmod: error inserting './hello.ko': -1 Invalid module format
查看insmod: error inserting './hello.ko': -1 Invalid module format
提示如下信息:
Apr  6 15:30:52 localhost kernel: hello: version magic '2.6.23.1-4 SMP mod_unload 586MMX ' should be '2.6.23.1-4 SMP mod_unload 686 '
请各位指教,小弟先谢谢了

TOP

回复 1楼 的帖子

从网上找了几天资料,这个问题算是暂时解决,下面是别人的帖子,我直接考过来的

insmod: error inserting 'hello.ko': -1 Invalid module format
      
一些不那么神秘的信息被纪录在文件/var/log/messages中;

Jun  4 22:07:54 localhost kernel: hello: version magic '2.6.5-1.358custom 686
REGPARM 4KSTACKS gcc-3.3' should be '2.6.5-1.358 686 REGPARM 4KSTACKS gcc-3.3'
      
换句话说,内核拒绝加载你的模块因为记载版本号的字符串不符(更确切的说是版本印戳)。版本印戳作为一个静态的字符串存在于内核模块中,以 vermagic:。版本信息是在连接阶段从文件init/vermagic.o中获得的。查看版本印戳和其它在模块中的一些字符信息,可以使用下面的命令 modinfo module.ko:

[root@pcsenonsrv 02-HelloWorld]# modinfo hello-4.ko
license:        GPL
author:         Peter Jay Salzman <p@dirac.org>
descrīption:    A sample driver
vermagic:       2.6.5-1.358 686 REGPARM 4KSTACKS gcc-3.3
depends:      
      
我们可以借助选项--force-vermagic解决该问题,但这种方法有潜在的危险,所以在成熟的模块中也是不可接受的。

首先,准备同你目前的内核版本完全一致的内核代码树。然后,找到你的当前内核的编译配置文件。通常它可以在路径 /boot下找到,使用像config-2.6.x的文件名。你可以直接将它拷贝到内核代码树的路径下: cp /boot/config-`uname -r` /usr/src/linux-`uname -r`/.config。

即使使用完全相同的配置文件,版本印戳还是有细小的差异的,但这足以导致模块加载的失败。这其中的差异就是在模块中出现却不在内核中出现的custom字符串,是由某些发行版提供的修改过的 makefile导致的。检查/usr/src/linux/Makefile,确保下面这些特定的版本信息同你使用的内核完全一致:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 5
EXTRAVERSION = -1.358custom
...
不必完全编译一遍内核,只得到需要的文件即可:
root@pcsenonsrv linux-2.6.x]# make
CHK     include/linux/version.h
UPD     include/linux/version.h
SYMLINK include/asm -> include/asm-i386
SPLIT   include/linux/autoconf.h -> include/config/*
HOSTCC  scrīpts/basic/fixdep
HOSTCC  scrīpts/basic/split-include
HOSTCC  scrīpts/basic/docproc
HOSTCC  scrīpts/conmakehash
HOSTCC  scrīpts/kallsyms
CC      scrīpts/empty.o
...
     
如果你不是确实想编译一个内核,你可以在SPLIT后通过按下CTRL-C中止编译过程。因为此时你需要的文件 已经就绪了。现在你可以返回你的模块目录然后编译加载它:此时模块将完全针对你的当前内核编译,加载时也不会由任何错误提示。

TOP

回复 1楼 的帖子

我没有另建内核树,就是用的系统自带的内核书
刚开始的时候,编译好的模块,用/sbin/insmod hello.ko出现错误[
nsmod: error inserting './hello.ko': -1 Invalid module format
用dmesg | tail,显示
hello: version magic '2.6.23.1-4 SMP mod_unload 586MMX ' should be '2.6.23.1-4 SMP mod_unload 686 '
用命令/sbin/modinfo hello.ko显示
[root@localhost work-3.31]# modinfo hello.ko
filename:       hello.ko
license:        Dual BSD/GPL
srcversion:     C89B85BCE41A6F50C9E67F3
depends:
vermagic:       2.6.23.1-4 SMP mod_unload 586MMX
vermagic与内核版本不一致,用了2楼的方法,出现如下错误
root@localhost 2.6.23.1-4-i686]# make
  CHK     include/linux/version.h
  CHK     include/linux/utsrelease.h
make[1]: *** 没有规则可以创建目标“missing-syscalls”。 停止。
make: *** [prepare0] 错误 2
没编译成功,但再用modinfo,发现
filename:       hello.ko
license:        Dual BSD/GPL
srcversion:     C89B85BCE41A6F50C9E67F3
depends:
vermagic:       2.6.23.1-4 SMP mod_unload 686
也可以加载了,莫名其妙的好了,清高手指教,我没有编译成功怎么就好了呢

TOP

发新话题
本功能由奇虎问答实现

相关主题

标题 作者 最后发表
防火墙新技术:状态检测技术 dzhrs36 2008-08-20
红旗5.0 网卡安装问题 chenimperial 2008-05-07
RE.ER 2008年热门课程---嵌入式系统高级开发班 xwmlz 2008-04-08
点击阅读更多关于的相关帖子  更多相关主题