zoukankan      html  css  js  c++  java
  • 内核与驱动文件的version magic匹配问题

    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' ",
    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))" > $@

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

  • 相关阅读:
    leetcode
    leetcode: Path Sum II 迭代法
    leetcode : valid binary search tree
    地域划分 编程题
    n个整数中,找出尽可能多的数使他们组成一个等差数列,求最长等差数列的长度
    Nodejs 调试方法
    精心收集的48个JavaScript代码片段,仅需30秒就可理解
    React Native ref高级用法&&setNativeProps使用
    Git工作流指南:Gitflow工作流
    Git工作流指南:Pull Request工作流
  • 原文地址:https://www.cnblogs.com/DXGG-Bond/p/11978219.html
Copyright © 2011-2022 走看看