我刚刚做了我的第一个驱动程序模块,是遵循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"
有人知道这是什么意思吗?我在构建的内核配置文件中没有看到它。
insmod
中的错误表明该模块被插入到与其编译时不同的内核中。确保您启动的是与您一直在编译的完全相同的内核... - dragoshtmake -C /usr/src/linux-headers-$(uname -r ) M=
pwdmodules
请注意,该命令旨在在当前目录下编译模块,并需要适当的Linux头文件。 - Rusty