当前位置:  开发笔记 > 运维 > 正文

insmod错误:插入'./hello.ko': - 无效的模块格式"

如何解决《insmod错误:插入'./hello.ko':-无效的模块格式"》经验,为你挑选了1个好方法。

我刚刚制作了我的第一个驱动模块,跟随LDD3的hello world模块.但遗憾的是遇到了这个错误:

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

我在Ubuntu 11.04和我的环境中这样做:

$ uname -r
2.6.38-8-generic

我得到这样的内核源代码:

sudo apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-2.6.38 - Linux kernel source for version 2.6.38 with Ubuntu patches
$sudo apt-get install linux-source-2.6.38

我的/ usr/src:

$ls /usr/src/
linux-headers-2.6.38-8          linux-source-2.6.38          vboxguest-5.0.10
linux-headers-2.6.38-8-generic  linux-source-2.6.38.tar.bz2

然后我编译内核

$sudo cp /boot/config-2.6.38-8-generic ./.config
$sudo make menuconfig -- load the .config file
$make
$make modules

然后我编译我的内核模块

$make -C /usr/src/linux-source-2.6.38/linux-source-2.6.38 M=`pwd` modules

使用Makefile:

obj-m := hello.o

然后最后当我插入模块时:

$sudo insmod hello_world.ko
insmod: error inserting 'hello_world.ko': -1 Invalid module format

我在dmesg中发现了什么:

hello: disagrees about version of symbol module_layout

所以有什么问题?

我也注意到linux-header is -2.26.38-generic和源代码版本是-2.26.38,这是问题吗?但我真的没有linux-source-2.26.38-generic在网上找到一个包.

状态更新:我发现文件/ lib/moduels/$(name -r)/ build/Makefile表示我正在运行的内核版本:

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 38
EXTRAVERSION = .2

所以我下载linux-2.6.38.2并编译,但仍然是同样的错误.

我还发现/ boot/config中有一行 - $(uname -r):

CONFIG_VERSION_SIGNATURE="Ubuntu 2.6.38-8.42-generic 2.6.38.2"

有人知道这是什么意思吗?我没有在我正在构建的内核的配置文件中看到它.



1> Punit Vara..:

构建内核模块以及插入模块的内核应该是相同的版本.如果您不想处理这件事,可以使用以下Makefile.

obj?m += hello?world.o

all:
 make ?C /lib/modules/$(shell uname ?r)/build M=$(PWD) modules
clean:
 make ?C /lib/modules/$(shell uname ?r)/build M=$(PWD) clean

现在您可以构建并尝试插入模块.

我建议你在这一行之前成为root用户

$ sudo cp /boot/config-2.6.38-8-generic ./.config

$su
#cp /boot/config-2.6.38-8-generic ./.config
#insmod hello_world.ko

或者,您也可以使用以下make文件

TARGET  := hello-world
WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
INCLUDE := -isystem /lib/modules/`uname -r`/build/include
CFLAGS  := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
CC      := gcc-3.0

${TARGET}.o: ${TARGET}.c

.PHONY: clean

clean:
    rm -rf ${TARGET}.o


检查modinfo hello-world.ko,它将显示您从中构建内核的模块版本。检查您的内核版本。您的内核模块版本和您的实际内核版本是否相同?
推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有