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

该问题表示:内核模块编译的环境与现在insmod想要运行的环境不一致
这个可能是我们编译了模块之后,重启了电脑,然后内核版本被更改了,例如我这个kthread.ko是在linux-3.10下编译的,但是我现在重启电脑之后是在linux-3.13内核版本下。所以在linux-3.13内核版本下无法运行linux-3.10编译的模块,即模块没有跨内核版本的特性。
查看内核版本命令:
uname -r

解决方案主要有两个:
1、切换回原来编译的内核版本
如果模块是对应着内核代码的,比如我在3.10内核版本代码添加了自己的内容,现在这个模块必须要使用这个内容才行,那么就需要我切换回原来编译的内核版本。或者需要在特定的内核版本做测验时,需要将内核版本切换回去。
2、在当前内核环境下重新编译模块
如果模块对于内核版本没有要求,随便在什么版本内核下都可以完成自己想要做的任务,那么就可以直接在该版本内核下重新编译模块。

如上所示直接使用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,不是空格!
在这种情况下,重新编译之后,再插入模块即可:

由上可以看到插入模块成功,可以进行相应的测试了。
本文探讨了内核模块在不同内核版本间运行时遇到的问题,主要原因是编译环境与运行环境的内核版本不一致。提供了两种解决方案:一是切换回原编译版本的内核;二是直接在当前内核环境下重新编译模块。
1万+

被折叠的 条评论
为什么被折叠?



