遗留问题:


内核已经支持nfs,实现了开发板和pc虚拟机的共享,但是当把“虚拟机下编译好的内核”拷贝到“nfs共享的文件系统下时”,在开发板端进行insomd时,结果不能动态加载内核模块,提示的错误如下:


    


# cd tmp/

# ls

param.ko   

# insmod param.ko 

insmod: cannot insert 'param.ko': invalid module format

 // 在服务器上,把驱动模块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、结果如下


 


 


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