前言
在linux嵌入式开发中,会遇到需要编译某个驱动模块放到开发板上使用的情况,但是编译出来的.ko文件放到内核中运行的时候却报错驱动的版本与内核本本不一样,并告诉你应该是什么版本的,如下:
说明
使用的内核: 友善之臂适配mini2440开发板的linux-kernel_2.6.32.2
编译的驱动: RTL8821CU.ko
解决方法
-
进入内核代码目录,这里一定注意,用来编译驱动的代码要与开发板上运行的内核同版本,运行编译菜单命令。
进入上图位置,检查"Module versioning support"是否被勾选,此处不要勾选。 -
再进入以下位置,一般问题出在此处:
选中上图中红色箭头的选项栏,回车进入得到如下图所示编辑界面:
该处的信息会被直接加入内核版本号后,形成新的内核版本名(vermagic),用上图中的名字编译出的驱动版本号为:(可用modinfo来查看.ko文件的信息)
若将其删除,编译得到的驱动版本号为:
将这里改为insmod驱动时要求的格式,保存退出,先编译一遍内核,编译完内核后,再用该源码来编译驱动。
这样,得到的驱动版本号就与内核一样了。
原因解说
我们先看内核源码目录的以下文件:
得到:
如果在编译菜单中添加:
重新编译内核:
再看该文件内容变为:
注意
一般出问题是上面说明的那个地方,而整个vermagic号的组成在以下文件中:
可以看到,最后的vermagic是由宏定义组合而来的,而 UTS_RELEASE在utsrelease.h中定义,也是我们在编译菜单中可以任意修改的部分。