在基于bf609开发驱动时,先做了最简单的字符型设备驱动尝试。编译环境是在PC
xp下运行的vmware ubuntu10.04。交叉编译环境为bfin-uclinux,linux
kernel为ADI网站提供的最新代码。
在驱动代码写好后,配置好konfig文件和makefile文件,设置为module。make menuconfig后,进行make
modules SUBDIRS=drivers/char。将module型的驱动生成.ko文件。
将.ko文件下载到板上后,进行insmod操作。发现反馈的信息为:
mydevice: version magic '3.3.0-ADI-2012R1-pre+ mod_unload
modversions ' should be '3.3.0-ADI-2012R1-pre-00619-gab55153-dirty
mod_unload '
insmod: can't insert 'mydevice.ko': invalid module format
在网上查了很多资料,知道是模块的编译工具版本和内核的编译工具版本不对所导致。但是之前没有做过驱动开发。很多知识不太清楚。不知道哪儿出错了。由于进
行blackfin开发时,软件开发环境根据官网提供的信息,可有两种情况。一种是通过官网提供的uClinux包来开发uClinux。一种是通过官网
提供的buildroot包来开发linux。由于ADI从bf60X开始,对于bf60X的开发支持只在buildroot上进行。因为我的开发包为
buildroot。针对刚才insmod的问题,经过仔细检查,发现在环境变量设置tools
chain时,出现了问题。板上下载好的uImage文件是buildroot编译所得,模块编译是在linux
kernel下编译所得,而环境变量设置时又出现了问题,导致了版本信息不同。
不过从给出的message来看,模块的vermagic信息为
3.3.0-ADI-2012R1-pre+ mod_unload modversions
。它是有kernel目录下的include/linux/vermagic.h文件决定的。其中具体的信息又由文件中vermagic
string决定。
另外在进行menuconfig时,进行module设置时,有以下几项:
再由打印出来的module vermagic:3.3.0-ADI-2012R1-pre+ mod_unload
modversions 可知。3.3.0-ADI-2012R1-pre+为kernel
version信息。至于后面的那个+号是没有显示kernel的补丁信息。mod_unload 为上图module
menuconfig时设置的,保证模块与内核此处一致就行,还有后面的modversions与此类似。但是非常重要的一点是,在vermagic
string里面的第一条UTS_RELEASE,规定了模块中kernel
version的信息,UTS_RELEASE在include/generated/UTSRELEASE.h中可以查看。但是该文件只有在menuconfig时,配置了
此项才会生成。这样编译生成的.ko文件vermagic信息才会对应kernel完整的version信息。
至此,insmod关于版本信息的问题解决了。
但是这个问题后,insmod时,又出现
Unknown symbol _mcount (err 0)的错误。
目前正在处理中。
![Linux字符设备驱动insmod <wbr>version错误备注 Linux字符设备驱动insmod <wbr>version错误备注](http://image72.360doc.com/DownloadImg/2014/05/0916/41458363_5.gif)