我刚刚创建了我的第一个驱动程序模块,即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"
有人知道这是什么意思吗?我没有在我正在构建的内核的配置文件中看到它。
答案 0 :(得分:0)
尝试使用交叉编译。请查看下面的代码以获取make文件。请注意缩进,否则您可能会遇到错误,例如 missing separator. Stop
obj-m += hello_.o #
此名称应该是.c文件的名称。我只是用hello例如
我建议最好的方法是通过交叉编译
创建一个变量来保存linux内核目录所在的目录名称在我的示例中,更改值" PATH_TO_LINUX_KERNEL_DIRECTORY"到一个真实的路径值 示例〜/ linux 你真的需要这样做,以便make文件知道在哪里找到arm-linux-gnueabi-没有这个,你很可能遇到问题arm-linux-gnueabi -
KDIR := PATH_TO_LINUX_KERNEL_DIRECTORY
all:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -C $(KDIR) M=$(shell pwd) modules
clean:
make -C $(KDIR) M=$(shell pwd) clean