内核与驱动文件的version magic匹配问题
转载至原文
最近做一个底层源码版本管理的工作:本地调试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)
可见 KERNELRELEASE由include/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匹配问题相关推荐
- 目标版插入模块驱动时出现version magic 与 驱动模块插入成功但是不能卸载的解决办法
PC机上编译好驱动模块 例如test.ko,在嵌入式板上insmod test.ko 时出现以下错误 [ 9809.344824] test: version magic '3.10.14 preem ...
- 例说linux内核与应用数据通信(三):读写内核设备驱动文件
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 读写设备文件也就是调用系统调用read()和write(),系 ...
- 移植驱动完毕后加载时的version magic报错原因以及解决办法
History:2012-02-17 Author:yingru 移植rt3070的AP驱动到装有fedora14的PC机上时,模块编译完毕后,加载时提示invalid module format. ...
- X64驱动:内核中的文件回调
无论在用户层还是内核层,操作文件的流程基本一致,除了在API函数上的区别(用户层调用用户层API,内核层调用内核API)以外其他基本一致,先讲解一下文件系统执行的流程. 以NTFS文件系统为例:假设我 ...
- Win64 驱动内核编程-5.内核里操作文件
内核里操作文件 RING0 操作文件和 RING3 操作文件在流程上没什么大的区别,也是"获得文件句柄->读/写/删/改->关闭文件句柄"的模式.当然了,只能用内核 A ...
- 【Android 逆向】Android 系统文件分析 ( /proc/ 目录文件分析 | 记录系统和进程信息 | version 内核版本信息文件 )
文章目录 一.proc 目录简介 二.version 内核版本信息文件 一.proc 目录简介 进入 /proc/ 目录 , 查看该目录下的文件 , 该目录中的文件的作用 , 主要是记录系统和进程的信 ...
- KSZ9031芯片升级KSZ9131,内核驱动文件
1.平台 板卡黑金xilinx zynqmp 07EV 内核kernel 4.19 网口驱动芯片KSZ9031 KSZ9131 驱动文件./drivers/net/phy/micrel.c 2.现象 ...
- 移植linux内核-映像文件,移植Linux内核-映像文件
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://tigerwang202.blogbus.com/logs/43927976.html 首先从Blackfin uCli ...
- 【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】
目录 1.Linux内核输入子系统概念导入 1.1 输入设备工作机制 1.2 运行框架 1.3 分层思想 2.驱动开发步骤 2.1 在init()或probe()函数中 2.2 在exit()或rem ...
最新文章
- Dubbo-Admin管理平台和Zookeeper注册中心的搭建(转)
- C语言 | 输出1~1000以内能被3整除,且个位是1的整数(源代码)
- keras从入门到放弃(九) 处理过拟合
- 对状态代码使用JAX-RS异常
- WCF配置报错 在 ServiceModel 客户端配置部分中,找不到名称 和协定
- 【hortonworks/registry 】type为对象An exception was thrown while processing request with message: [null]
- LeetCode(922)——按奇偶排序数组 II(JavaScript)
- 跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享
- 打开运行PS、AI等软件时卡在启动窗口的解决办
- ubuntu openStack icehouse dashboard theme自定义
- Python 学习笔记---爬取海贼王动漫
- 插槽样式_小程序,自定义组件之间的引用,使用插槽扩展组件
- vscode+TexLive+SumatraPDF
- 安徽省滁州市谷歌卫星地图下载
- 第一次参加本校大学生创新创业训练项目答辩的反思与总结
- 寒霜朋克计算机丢失,寒霜朋克无法启动运行解决方法 寒霜朋克不能运行怎么办?...
- 第一章 : JVM与体系结构
- HP-UX 基本命令学习
- cdn服务器pnk_cdn服务器是什么
- Flutter 圆形(头像)图片的 4种实现