转载至原文

最近做一个底层源码版本管理的工作:本地调试OK的内核源码,驱动源码,文件系统等,作为一个工程上传至SVN服务器,以便同事们可以方便共享同步代码;
原文

问题

本地编译的一整套底层代码down到设备跑都正常,但是由这套代码上传SVN服务器而后checkout出来的代码编译的文件,则出现驱动文件加载不上的情况(驱动以模块方式加载),打印如下

log: version magic '3.3.0 preempt mod_unload ARMv5 ’ should be '3.3.0-svn87 preempt mod_unload ARMv5 ’

分析

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


if (!modmagic) {err = try_to_force_load(mod, "bad vermagic");if (err)return err;} else if (!same_magic(modmagic, vermagic, info->index.vers)) {pr_err("%s: version magic '%s' should be '%s'\n",info->name, modmagic, vermagic);return -ENOEXEC;}

然后

static const char vermagic[] = VERMAGIC_STRING;

可知打印语句实际由宏VERMAGIC_STRING定义,

接着看include/linux/vermagic.h

#define VERMAGIC_STRING                         \UTS_RELEASE " "                            \MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT             \MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS    \MODULE_ARCH_VERMAGIC

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

(echo \#define UTS_RELEASE \"$(KERNELRELEASE)\";)
再搜KERNELRELEASE
Read KERNELRELEASE from include/config/kernel.release (if it exists)
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)

可见 KERNELRELEASEinclude/config/kernel.release文件读取获得

cat include/config/kernel.release
3.3.0-svn87

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

再回到Makefile,搜kernel.release

Store (new) KERNELRELASE string in include/config/kernel.release
include/config/kernel.release: include/config/auto.conf FORCE
$(Q)rm -f $@
$(Q)echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))" > $@

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

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

解决

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

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

修改如下,

include/config/kernel.release: include/config/auto.conf FORCE
rm -f $@
echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))" > $@
echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree))" > $@

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

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

内核与驱动文件的version magic匹配问题相关推荐

  1. 目标版插入模块驱动时出现version magic 与 驱动模块插入成功但是不能卸载的解决办法

    PC机上编译好驱动模块 例如test.ko,在嵌入式板上insmod test.ko 时出现以下错误 [ 9809.344824] test: version magic '3.10.14 preem ...

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

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

  3. 移植驱动完毕后加载时的version magic报错原因以及解决办法

    History:2012-02-17 Author:yingru 移植rt3070的AP驱动到装有fedora14的PC机上时,模块编译完毕后,加载时提示invalid module format. ...

  4. X64驱动:内核中的文件回调

    无论在用户层还是内核层,操作文件的流程基本一致,除了在API函数上的区别(用户层调用用户层API,内核层调用内核API)以外其他基本一致,先讲解一下文件系统执行的流程. 以NTFS文件系统为例:假设我 ...

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

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

  6. 【Android 逆向】Android 系统文件分析 ( /proc/ 目录文件分析 | 记录系统和进程信息 | version 内核版本信息文件 )

    文章目录 一.proc 目录简介 二.version 内核版本信息文件 一.proc 目录简介 进入 /proc/ 目录 , 查看该目录下的文件 , 该目录中的文件的作用 , 主要是记录系统和进程的信 ...

  7. KSZ9031芯片升级KSZ9131,内核驱动文件

    1.平台 板卡黑金xilinx zynqmp 07EV 内核kernel 4.19 网口驱动芯片KSZ9031 KSZ9131 驱动文件./drivers/net/phy/micrel.c 2.现象 ...

  8. 移植linux内核-映像文件,移植Linux内核-映像文件

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://tigerwang202.blogbus.com/logs/43927976.html 首先从Blackfin uCli ...

  9. 【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】

    目录 1.Linux内核输入子系统概念导入 1.1 输入设备工作机制 1.2 运行框架 1.3 分层思想 2.驱动开发步骤 2.1 在init()或probe()函数中 2.2 在exit()或rem ...

最新文章

  1. Dubbo-Admin管理平台和Zookeeper注册中心的搭建(转)
  2. C语言 | 输出1~1000以内能被3整除,且个位是1的整数(源代码)
  3. keras从入门到放弃(九) 处理过拟合
  4. 对状态代码使用JAX-RS异常
  5. WCF配置报错 在 ServiceModel 客户端配置部分中,找不到名称 和协定
  6. 【hortonworks/registry 】type为对象An exception was thrown while processing request with message: [null]
  7. LeetCode(922)——按奇偶排序数组 II(JavaScript)
  8. 跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享
  9. 打开运行PS、AI等软件时卡在启动窗口的解决办
  10. ubuntu openStack icehouse dashboard theme自定义
  11. Python 学习笔记---爬取海贼王动漫
  12. 插槽样式_小程序,自定义组件之间的引用,使用插槽扩展组件
  13. vscode+TexLive+SumatraPDF
  14. 安徽省滁州市谷歌卫星地图下载
  15. 第一次参加本校大学生创新创业训练项目答辩的反思与总结
  16. 寒霜朋克计算机丢失,寒霜朋克无法启动运行解决方法 寒霜朋克不能运行怎么办?...
  17. 第一章 : JVM与体系结构
  18. HP-UX 基本命令学习
  19. cdn服务器pnk_cdn服务器是什么
  20. Flutter 圆形(头像)图片的 4种实现

热门文章

  1. html5 画布绘制时钟
  2. 为什么说C++太复杂(复杂到哪了?)
  3. 使用Aspose.Pdf修改PDF文件中的表格字段
  4. 2023湖南农业大学计算机考研信息汇总
  5. 嵌入式面试总结(持续更新)
  6. 主题 02:如何设计系统预案(Preplan)?
  7. 京东商城iOS客户端安装包瘦身实践
  8. Silvaco TCAD——二维工艺仿真
  9. 编程为什么那么难:从储值卡扣款说起
  10. 应用与系统稳定性第五篇---Watchdog原理和问题分析