# cd tmp/
# ls
param.ko
# insmod param.ko
insmod: cannot insert 'param.ko': invalid module format
# ls // 在服务器上,把驱动模块hello.ko拷贝到文件系统目录下,开发板子就能够实现动态共享了(查询一下,可以看到hello.ko文件)
param.ko hello.ko
#
1.1是不是当时移植的busybox没有支持insmod命令呢?
然后在开发板子端输入insmod命令试试,看看是否支持该命令,结果如下:
# uname-/bin/sh: uname: not found# insmodBusyBox v1.13.3 (2013-05-09 22:34:53 CST) multi-call binaryUsage: insmod [-knqrsv] MODULE [symbol=value...]Options:-n Dry run-q Quiet-r Remove module (stacks) or do autoclean-s Report via syslog instead of stderr-v Verbose结果: 发现开发板子移植的busybox支持insmod命令,但是没有支持uname命令,所以就不是insmod命令没有的问题
1.2结果只能百度一下,看看人家是否遇到此类问题,得到的信息如下
“insmod: error inserting 'hello.ko': -1 Invalid module format”问题一些不那么神秘的信息被纪录在文件/var/log/messages中;Jun 4 22:07:54 localhost kernel: hello: version magic '2.6.5-1.358custom 686REGPARM 4KSTACKS gcc-3.3' should be '2.6.5-1.358 686 REGPARM 4KSTACKS gcc-3.3'
换句话说,内核拒绝加载你的模块因为记载版本号的字符串不符(更确切的说是版本印戳)。版本印戳作为一个静态的字符串存在于内核模块中,以 vermagic:。 版本信息是在连接阶段从文件init/vermagic.o中获得的。查看版本印戳和其它在模块中的一些字符信息,可以使用下面的命令 modinfo module.ko:[root@pcsenonsrv 02-HelloWorld]# modinfo hello-4.ko
license: GPL
author: Peter Jay Salzman < [email protected] >
descrīption: A sample driver
vermagic: 2.6.5-1.358 686 REGPARM 4KSTACKS gcc-3.3
depends:来源: <http://blog.chinaunix.net/uid-20561320-id-2853307.html>所以,当时自己的虚拟机安装的rehat红帽系统,内核版本是“linux-2.6.18”,编译开发板子的内核是linux-2.6.29,编译内核模块是在系统内核linux-2.6.18下编译的,所以内核版本不一样,按照这样子的思路去证实一下自己的内核模块。
1、用modinfo查看一下hello.ko的内核编译信息,显示结果果然是“linux-2.6.18”内核版本下编译的,所以得换到“linux-2.6.29”内核版本下,恰好之前制作了linux-2.6.29系统,重新reboot一下,进入linux-2.6.29内核版本系统,重新make一下hello.c内核模块,但是问题由来啦:如下提示如下:在/lib/modules/2.6.29/build:没有这个目录,这就让人郁闷啦,明明有这个目录啊,为什么会有这样子的提示呢??赶紧查看一下/lib/modules/2.6.29/build下面有什么东西呢??
原来在/lib/modules/2.6.29 和 /lib/modules/2.6.18-53.el5 下面都有两个 “build 和 source”符号链接文件,难道是这些符号链接指向的路径不对,导致在2.6.29内核找不到编译所需要的文件啦??
原来还真的是如此,之前制作的内核模块,指向了/home/Denny/kernel/linux-2.6.29的路径了,后面在删除了Denny用户后,把内核linux-2.6.29移动到了新的/home/qinyuanyi/work/kernel/linux-2.6.29新的路径下面了,导致了build 和 source两个符号链接找不到内核,所以提示了上面的错误。但是问题又来了,能够修改 build 和 source 两个的符号链接吗???修改了符号链接以后,还能够用吗??那么怎样修改符号链接呢???百度一下,没有找到能够修改 符号链接的指向新的地址的方法,然后自己用:rm build source 两个符号链接直接删除掉,重新创建build 和 source两个的符号链接。创建符号链接的语法:ln -s 指向的链接路径或文件 符号链接名在创建号以后,重新编译一下hello.c模块
到这,说明已经成功了!!!!!!!!!!!!!!!!!!!!!!!!!
开发板端,已经能够成功加载内核模块了~~~~~~~~