error inserting 'hello.ko',-1 Invalid module format
======================================================================*/#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_INFO " Hello World enter\n"); return 0; } static void hello_exit(void) { printk(KERN_INFO " Hello World exit\n "); } module_init(hello_init); module_exit(hello_exit); /* MODULE_AUTHOR("Song Baohua"); MODULE_DESCRIPTION("A simple Hello World Module"); MODULE_ALIAS("a simplest module"); */
#KERNELDIR = /usr/src/kernels/2.6.18-164.el5-i686 #PWD := ($shell pwd) #INSTALLDIR = $(PWD) #CC=gcc obj-m := hello.o
还有我用的是红帽企业版5.4,原始内核是2.6.18,用这个内核启动的话,运行insmod -C /usr/src/kernels/2.6.18-164.el5-i686 后再insmod可以正常加载。
后来我下载了2.6.34.13的源码(源码目录 /usr/src/linux-2.6.34.13),以前编译过一次。但用这个内核启动时,运行insmod -C /usr/src/linux-2.6.34.13后用insmod就会出现上图中的情况。网上说出现这种问题一般是内核版本号跟要加载的内核模块版本号不一致,但我这里貌似是一致的吧?怎么回事?毕业论文
看看Makefile中的内核模块源码的目录,是不是在你机器上可以找到。
三个内核,都试了,只需改下内核源码路径就OK了!!!(我新编译的那个2.6.34也比我之前的版本高)
ifneq ($(KERNELRELEASE),) obj-m :=hello.o elseKDIR:= /lib/modules/2.6.34.12/build all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers endif
这是内核源码的目录结构
[Og@localhost ~]$ ls /lib/modules/
2.6.32-279.9.1.el6.x86_64 2.6.32-279.el6.x86_64 2.6.34.12
[Og@localhost ~]$ ls /lib/modules/2.6.34.12/
build modules.ccwmap modules.isapnpmap modules.symbols
kernel modules.dep modules.ofmap modules.symbols.bin
modules.alias modules.dep.bin modules.order modules.usbmap
modules.alias.bin modules.ieee1394map modules.pcimap source
modules.builtin modules.inputmap modules.seriomap
[Og@localhost ~]$ ls /lib/modules/2.6.34.12/build
arch firmware kernel Module.symvers sound
block fs lib net System.map
COPYING include MAINTAINERS README tools
CREDITS init Makefile REPORTING-BUGS usr
crypto initrd-2.6.34.12 mm samples virt
Documentation ipc modules.builtin scripts vmlinux
drivers Kbuild modules.order security vmlinux.o
[Og@localhost ~]$
你还是看一下你的编译完的内核源码路径吧!
出现这个错误一般是没找到内核源码
1,如果要在x86上练习模块,两种选择要么直接用当前系统内核源代码编译模块,我的RHEL6.3上是带有当前用的内核版本的内核代码的
2,用你想用的代码版本,自己下载的,(可能和你的PC机的内核一个版本也要照下边做),编译内核,编译内核模块,安装内核模块,制作initrd,修改grub,用你现在的内核启动,然后就可以用自己下载的内核版本来编译内核模块了
版本一样,但是一个是系统带的,一个是下载的是很有可能失败的,我试了一下用modinfo打印出版本信息一样也出错。