我内核版本跟内核模块一致,但仍然insmod:error inserting 'hello.ko',-1 Invalid module format

NewThinker_wei 2012-10-05 01:13:06
如图:

版本号都是2.6.34.13
但仍然无法insmod。
下面是源码:
hello.c

/*======================================================================
A simple kernel module: "hello world"

The initial developer of the original code is Baohua Song
<author@linuxdriver.cn>. All Rights Reserved.
======================================================================*/
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_INFO " Hello World enter\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_INFO " Hello World exit\n ");
}

module_init(hello_init);
module_exit(hello_exit);

/*
MODULE_AUTHOR("Song Baohua");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");
*/


//Makefile

#KERNELDIR = /usr/src/kernels/2.6.18-164.el5-i686
#PWD := ($shell pwd)
#INSTALLDIR = $(PWD)
#CC=gcc
obj-m := hello.o




还有我用的是红帽企业版5.4,原始内核是2.6.18,用这个内核启动的话,运行insmod -C /usr/src/kernels/2.6.18-164.el5-i686 后再insmod可以正常加载。
后来我下载了2.6.34.13的源码(源码目录 /usr/src/linux-2.6.34.13),以前编译过一次。但用这个内核启动时,运行insmod -C /usr/src/linux-2.6.34.13后用insmod就会出现上图中的情况。网上说出现这种问题一般是内核版本号跟要加载的内核模块版本号不一致,但我这里貌似是一致的吧?怎么回事?
...全文
1787 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
那片星空 2014-09-05
  • 打赏
  • 举报
回复
在系统的/lib/modules下面有系统自带的内核module,也会有用户自己安装的内核; 我本系统ubuntu内核是3.11.0-15-generic, 安装的是: 3.2.62; 在编译hello.c时,建议使用ubuntu系统自带的内核来编译; 使用下面的命令: make -C /lib/modules/3.11.0-15-generic/build M=`pwd` modules 就能顺利编译通过; 后续使用insmod hello.ko时就不会因为版本的问题报错。
ljw443680017 2014-05-11
  • 打赏
  • 举报
回复
呵呵,一年多了,楼主怎么样了,我碰到和你一样的的问题了,简直和楼主当年问题一模一样, 问题所在,应该是:我们被欺骗了。想必楼主一定没有查看过/usr/src/路径下,kernel的Makefile中的版本号吧,当你打开时,你就明白问题所在了,果然是版本号不一样。 造成这个问题的原因应该是我们更新过内核,但是内核升级过程中,只是简单的把目录名称更新了,其中的源代码还是以前的,算发行版的偷懒吧。
袁保康 2013-02-21
  • 打赏
  • 举报
回复
我都好了,再来看这个问题,这哥们遇到的真是难题。我把我的总结一下吧: 1,如果要在x86上练习模块,两种选择要么直接用当前系统内核源代码编译模块,我的RHEL6.3上是带有当前用的内核版本的内核代码的 2,用你想用的代码版本,自己下载的,(可能和你的PC机的内核一个版本也要照下边做),编译内核,编译内核模块,安装内核模块,制作initrd,修改grub,用你现在的内核启动,然后就可以用自己下载的内核版本来编译内核模块了 版本一样,但是一个是系统带的,一个是下载的是很有可能失败的,我试了一下用modinfo打印出版本信息一样也出错。
__阿飞__ 2012-12-06
  • 打赏
  • 举报
回复
你这个问题解决了没呢?我昨晚也遇到了,弄了一晚上也没搞定.
引用 8 楼 NewThinker_wei 的回复:
谢谢二位了,这个问题我还是暂时放一放吧,不能为这个耽误太多时间,反正也不怎么影响往后学。
NewThinker_wei 2012-10-10
  • 打赏
  • 举报
回复
谢谢二位了,这个问题我还是暂时放一放吧,不能为这个耽误太多时间,反正也不怎么影响往后学。
0xAC 2012-10-08
  • 打赏
  • 举报
回复
一个系统两个内核A、B。
当前内核A下写Makefile,路径是内核B的源码路径,那make是没有问题的;
但是最后加载模块时是要加载到内核A上的,所以insmod就会出现Invalid module format;
这跟你查的是一样,就是源码跟内核不兼容,对不上号!

如果你现在确定内核模块的路径是没有问题的
可能根本就是内核编译时出的问题。导致现在加载模块失败!

所以,换个代码再试试,如果都是这样那就不是代码的问题,你还是重新编译一个内核吧!
wowocpp 2012-10-06
  • 打赏
  • 举报
回复
dmesg看看还有其他的信息不
NewThinker_wei 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
dmesg看看还有其他的信息不
[/Quote]

我的新截图里最后部分就是dmesg的最新5行信息,但貌似没有什么有用的内容,纠结
NewThinker_wei 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
这个……

我三个内核,都试了,只需改下内核源码路径就OK了!!!(我新编译的那个2.6.34也比我之前的版本高)

这是我的Makefile

……

[/Quote]



路径有问题的话应该在make那一步都通不过吧,我的make成功了,只是加载时才出问题。这次重贴张详细点截图。

//hello.c没有改动,下面是我用的新Makefile


ifneq ($(KERNELRELEASE),)
obj-m :=hello.o
else
KDIR_NEW:=/lib/modules/2.6.34.13/build
KDIR_OLD:=/lib/modules/2.6.18-164.el5/build
new:
make -C $(KDIR_NEW) M=$(PWD) modules
old:
make -C $(KDIR_OLD) M=$(PWD) modules
endif

clean:
rm -f *.o *.mod.o *.mod.c *.symvers Mo* mo*
cleanall:
make clean
rm -f *.ko
insmod:
insmod hello.ko
rmmod:
rmmod hello



截图:


所以你也看到了,路径貌似没有问题吧。在2.6.18内核下运行make old加make insmod没有异常,但在2.6.34.13内核下运行make new加make insmod就出现那个问题。我遇到的问题还真奇葩。

0xAC 2012-10-05
  • 打赏
  • 举报
回复 2
这个……

我三个内核,都试了,只需改下内核源码路径就OK了!!!(我新编译的那个2.6.34也比我之前的版本高)

这是我的Makefile


ifneq ($(KERNELRELEASE),)

obj-m :=hello.o

else
KDIR:= /lib/modules/2.6.34.12/build

all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif



这是内核源码的目录结构
[Og@localhost ~]$ ls /lib/modules/
2.6.32-279.9.1.el6.x86_64 2.6.32-279.el6.x86_64 2.6.34.12
[Og@localhost ~]$ ls /lib/modules/2.6.34.12/
build modules.ccwmap modules.isapnpmap modules.symbols
kernel modules.dep modules.ofmap modules.symbols.bin
modules.alias modules.dep.bin modules.order modules.usbmap
modules.alias.bin modules.ieee1394map modules.pcimap source
modules.builtin modules.inputmap modules.seriomap
[Og@localhost ~]$ ls /lib/modules/2.6.34.12/build
arch firmware kernel Module.symvers sound
block fs lib net System.map
COPYING include MAINTAINERS README tools
CREDITS init Makefile REPORTING-BUGS usr
crypto initrd-2.6.34.12 mm samples virt
Documentation ipc modules.builtin scripts vmlinux
drivers Kbuild modules.order security vmlinux.o
[Og@localhost ~]$

你还是看一下你的编译完的内核源码路径吧!
出现这个错误一般是没找到内核源码
NewThinker_wei 2012-10-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你看看Makefile中的内核模块源码的目录,是不是在你机器上可以找到。
可以 cat /proc/version,查看内核当前内核版本号;然后更改Makefile中的源码目录,即/lib/modules/内核版本号/build
[/Quote]


呃,内核模块源码的目录我是在命令行里指定的,make -C /usr/src/linux-2.6.34.13 M=$(pwd) modules,源码目录就是/usr/src/linux-2.6.34.13这个应该木问题。版本号我用uname -r查看了,是2.6.34.13,modinfo查看hello.ko也是2.6.34.13,这些我的截图里都有显示。
后来我试了试 make -C /lib/modules/2.6.34.13/build M=$(pwd) modules,这样也会出现Invalid module format。


可是如果我用红帽企业版原装内核启动的话,make -C /usr/src/kernels/2.6.18-164.el5-i686 M=(pwd) modules,是没有问题的。这时内核和我的hello.ko内核模块都是2.6.18-164.el5这个版本。


为什么用更新过的高版本内核就会出问题?

0xAC 2012-10-05
  • 打赏
  • 举报
回复
你看看Makefile中的内核模块源码的目录,是不是在你机器上可以找到。
可以 cat /proc/version,查看内核当前内核版本号;然后更改Makefile中的源码目录,即/lib/modules/内核版本号/build

4,436

社区成员

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

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