内核移植,nfs--解决了开发板子不能动态加载驱动的问题

来源:互联网 发布:55寸电视 知乎 2017 编辑:程序博客网 时间:2024/06/18 14:20
遗留问题:
    开发板子已经进行内核移植后,核已经支持nfs,实现了开发板和pc虚拟机的共享,但是当把“虚拟机下编译好的内核”拷贝到“nfs共享的文件系统下时”,在开发板端进行insomd时,结果不能动态加载内核模块,提示的错误如下:
    

# 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.1是不是当时移植的busybox没有支持insmod命令呢?

        然后在开发板子端输入insmod命令试试,看看是否支持该命令,结果如下:

 
# uname
-/bin/sh: uname: not found
# insmod
BusyBox v1.13.3 (2013-05-09 22:34:53 CST) multi-call binary
 
Usage: 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 686
REGPARM 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 <
p@dirac.org>
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下编译的,所以内核版本不一样,按照这样子的思路去证实一下自己的内核模块
 

2、证实

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模块
 
 
 
到这,说明已经成功了!!!!!!!!!!!!!!!!!!!!!!!!!
 
 

3、结果如下

 
 
 
开发板端,已经能够成功加载内核模块了~~~~~~~~