insmod: error inserting 'xxx.ko': -1 Invalid module format

乘着实验机器在编译内核,把以前遇到的一个问题也总结一下,本来之前运行得好好地模块,后来怎么突然不行了呢,具体问题如下:

该问题表示:内核模块编译的环境与现在insmod想要运行的环境不一致

这个可能是我们编译了模块之后,重启了电脑,然后内核版本被更改了,例如我这个kthread.ko是在linux-3.10下编译的,但是我现在重启电脑之后是在linux-3.13内核版本下。所以在linux-3.13内核版本下无法运行linux-3.10编译的模块,即模块没有跨内核版本的特性。

查看内核版本命令:

uname -r 

解决方案主要有两个:

1、切换回原来编译的内核版本

如果模块是对应着内核代码的,比如我在3.10内核版本代码添加了自己的内容,现在这个模块必须要使用这个内容才行,那么就需要我切换回原来编译的内核版本。或者需要在特定的内核版本做测验时,需要将内核版本切换回去。

2、在当前内核环境下重新编译模块

如果模块对于内核版本没有要求,随便在什么版本内核下都可以完成自己想要做的任务,那么就可以直接在该版本内核下重新编译模块。

insmod: error inserting 'xxx.ko': -1 Invalid module format_第1张图片

如上所示直接使用make进行重新编译,或者:

make clean 
make

这种情况需要在Makefile没有指定确定的内核路径才可以,例如我这里的Makefile文件内容为:

obj-m := kthread.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:

	make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
clean:  

	rm *.o *.ko *.mod.c *.order *.symvers
.PHONY:clean

Makefile文件一定要注意缩进,前面为tab,不是空格!

在这种情况下,重新编译之后,再插入模块即可:

insmod: error inserting 'xxx.ko': -1 Invalid module format_第2张图片

由上可以看到插入模块成功,可以进行相应的测试了。

你可能感兴趣的:(linux报错与解决)