https://blog.csdn.net/yubing_615/article/details/52183185

1.问题:本地编译的一整套底层代码down到设备跑都正常,但是由这套代码上传SVN服务器而后checkout出来的代码编译的文件,则出现驱动文件加载不上的情况(驱动以模块方式加载),打印如下
emotor_drv: version magic '3.4.39-lhx SMP preempt mod_unload ARMv7 p2v8 ' should be '3.4.39-9tripod SMP preempt mod_unload ARMv7 p2v8 '

2.分析:初步由打印log信息看,是由version magic不匹配造成,找到信息打印点,kernel/module.c

点击(此处)折叠或打开

  1. printk(KERN_ERR
    "%s: version magic '%s' should be '%s'\n",
  2. mod->name, modmagic, vermagic);

然后

点击(此处)折叠或打开

  1. static const char vermagic[]
    = VERMAGIC_STRING;

可知打印语句实际由宏VERMAGIC_STRING定义,接着看include/linux/vermagic.h

点击(此处)折叠或打开

  1. #define VERMAGIC_STRING                         \
  2. UTS_RELEASE " "                            \
  3. MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT             \
  4. MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS    \
  5. MODULE_ARCH_VERMAGIC

打印信息的不同点“'3.3.0”和“3.3.0-svn87”是由宏UTS_RELEASE生成,那么重点关注UTS_RELEASE
由名字推测是编译内核时版本号给打上了svn相关标记,但是在内核源码中没看到任何地方定义UTS_RELEASE,再到Makefile找,搜到这句

  1. (echo
    \#define UTS_RELEASE
    \"$(KERNELRELEASE)\";)

再搜KERNELRELEASE

  1. # Read KERNELRELEASE from include/config/kernel.release
    (if it exists)
  2. 382 KERNELRELEASE = $(shell cat include/config/kernel.release 2>
    /dev/null)
  3. 383 KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if
    $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)

可见KERNELRELEASE由include/config/kernel.release文件读取获得,但是内核源码中并无此文件(为查找差异之前将内核make
distclean掉了),

再重新编译

一次,果然生成了include/config/kernel.release文件,查看内容

  1. cat include/config/kernel.release
  2. 3.3.0-svn87

找到了加载驱动时打印log里的“3.3.0-svn87”

再回到Makefile,搜kernel.release

  1. # Store (new) KERNELRELASE
    string in include/config/kernel.release
  2. 951 include/config/kernel.release: include/config/auto.conf
    FORCE
  3. 952 $(Q)rm
    -f $@
  4. 953 $(Q)echo
    "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
    > $@

kernel.release就是在这里生成的,前面版面号忽略,“-svn87”实际上是执行setlocalversion得到svn版本号加上去的;

查看得知setlocalversion是一个脚本文件,支持自动获取svn,git等源码管理工具的版本号;

3.没有驱动源码的解决方案:

 只需要使version magic一致,驱动就可以顺利加载;由于厂商提供的部分驱动文件没提供源码,并且本地内核也会不断升级(svn版本号会变),所

以最简单的方法是将

附加的-svnXX去掉,这样现存的驱动和后续编译的驱动和内核就都可以保持一致了:

修改如下,

vi   kernel/Makefile 更该为如下代码。

  1. include/config/kernel.release: include/config/auto.conf
    FORCE
  2. 952 $(Q)rm
    -f $@
  3. 953
    #     $(Q)echo
    "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
    > $@
  4. 954       $(Q)echo
    "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree))"
    > $@

重新编译后,驱动可以正常加载工作了。

PS:当然,version magic是一个很好的功能,如果所有驱动都有源码,对于发布产品的版本,加上svn版本号标记可以有效保证内核驱动版本一致性。

 

4.不改变uImage的解决方案:

vi    kernel/Makefile 更该为如下代码。

950 include/config/kernel.release: include/config/auto.conf FORCE
951         $(Q)rm -f $@
952         $(Q)echo "3.4.39-9tripod" > $@
953         #$(Q)echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/set     localversion $(srctree))" > $@

之后重新编译编译内核,再重新编译驱动就可以了。

内核与驱动文件的version magic匹配问题的更多相关文章

  1. 例说linux内核与应用数据通信(三):读写内核设备驱动文件

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流.请勿用于商业用途]         读写设备文件也就是调用系统调用read()和write(),系 ...

  2. Win64 驱动内核编程-5.内核里操作文件

    内核里操作文件 RING0 操作文件和 RING3 操作文件在流程上没什么大的区别,也是"获得文件句柄->读/写/删/改->关闭文件句柄"的模式.当然了,只能用内核 A ...

  3. Linux内核USB驱动【转】

    本文转载自:http://www.360doc.com/content/12/0321/14/8363527_196286673.shtml 注意,该文件是2.4的内核的驱动源文件,并不保证在2.6内 ...

  4. 【转】 Linux内核中读写文件数据的方法--不错

    原文网址:http://blog.csdn.net/tommy_wxie/article/details/8193954 Linux内核中读写文件数据的方法  有时候需要在Linuxkernel--大 ...

  5. 往android的内核添加驱动及 ueventd.rc 修改【转】

    本文转载自:http://blog.csdn.net/lkqboy2599/article/details/8350100 向android的内核添加驱动,其实就是向linux内核添加驱动.主要在两个 ...

  6. linux内核中的文件描述符(二)--socket和文件描述符

    http://blog.csdn.net/ce123_zhouwei/article/details/8459730 Linux内核中的文件描述符(二)--socket和文件描述符 Kernel ve ...

  7. rdev - 查询/设置内核映像文件的根设备,RAM 磁盘大小或视频模式

    总览 SYNOPSIS rdev [ -rvh ] [ -o offset ] [ image [ value [ offset ] ] ] rdev [ -o offset ] [ image [ ...

  8. 手机支持USB功能、驱动文件对应关系

    手机支持USB功能: 1.UMS(USB MASS Stronge) : 连接PC作为存储盘使用 2.ADB : 用于调试 3.MTP :连接PC作为存储盘使用(win XP需要安装WMP10 以上 ...

  9. 更新新网卡驱动,修复win7雷凌网卡Ralink RT3290在电脑睡眠时和启动网卡时出现蓝屏netr28x.sys驱动文件错误

    更新新网卡驱动,修复win7雷凌网卡Ralink RT3290在电脑睡眠时和启动网卡时出现蓝屏netr28x.sys驱动文件错误 我的本本是win7,雷凌网卡Ralink RT3290   802.1 ...

随机推荐

  1. React:List and key

    在React中,可以通过数组方法返回一组 组件元素,并将该数组作为render()的js插值. function NumberList(props) { const numbers = props.n ...

  2. 总结hashMap和hashtable

     在这里帮大家总结一下hashMap和hashtable方面的知识点吧: 1.  关于HashMap的一些说法:  a)  HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体.Ha ...

  3. WebApiClient性能参考

    1 文章目的 昨天写了走进WebApiClientCore的设计,介绍了WebApiClient的变化与设计之后,收到大家支持的.赞许的,还有好的建议和顾虑,比如WebApiClient性能怎么样,有 ...

  4. CDH6 高版本hbase+solr实现二级索引

    之前的环境是单独下载的CDH组件包搭建的集群,但是因为hadoop版本过低导致漏洞无法修复,重新搭建高版本集群环境. 新集群环境: 主要组件:hadoop,hbase,zookeeper,Key-Va ...

  5. poj2778 AC自动机

    以下内容均为转载,,只有代码是自己写的=-= http://blog.csdn.net/morgan_xww/article/details/7834801   转载地址 博主写的很好 ------- ...

  6. 项目中 SimpleDateFormat 的正确使用

    项目中 SimpleDateFormat 的正确使用 日常开发中,我们经常需要使用时间相关类,说到时间相关类,想必大家对 SimpleDateFormat 并不陌生.主要是用它进行时间的格式化输出和解 ...

  7. springmvc拦截器和概念,配置!!!

    用于拦截请求,过滤后再拦截 实现HandlerInterceptor接口 配置拦截器 package cn.zys.lanjieqi; import javax.servlet.http.HttpSe ...

  8. 01.Django-基础

    基础 1. 简介 Django是一个由Python写成的开放源代码的重量级Web应用框架. Django的目的是使常见的Web开发任务,快速和容易 2. 特点 MVC开发模式 内置进行快速web开发所 ...

  9. 使用VuePress搭建个人博客

    使用VuePress搭建个人博客 VuePress 是一个基于 Vue 的静态网站生成器.其中主要用到:Vue,VueRouter,Webpack. 类似的工具:hexo 基于 Markdown 语法 ...

  10. Java集合(八)哈希表及哈希函数的实现方式

    Java集合(八)哈希表及哈希函数的实现方式 一.哈希表 非哈希表的特点:关键字在表中的位置和它之间不存在一个确定的关系,查找的过程为给定值一次和各个关键字进行比较,查找的效率取决于和给定值进行比较的 ...