linux驱动模块加载时出现与内核不匹配的问题

60 篇文章 11 订阅
31 篇文章 0 订阅

参考:https://blog.csdn.net/hbcbgcx/article/details/88194321

安装模块时出现:[root@FriendlyARM nfs]# insmod key2.ko

key2: version magic '2.6.32.2 mod_unload modversions ARMv4 ' should be '2.6.32.2-FriendlyARM mod_unload ARMv4 '

这一行的意思就是说,当前插入的模块xxx.ko的版本信息(version magic)与正运行的kernel的版本信息不一致!应该是'2.6.32.2-FriendlyARM mod_unload ARMv4 ',而实际上xxx.ko的版本信息却是:'2.6.32.2 mod_unload modversions ARMv4 '; 显然它们之间差别是很小的。实际上,根据上面安装的kernel源码来看,它们应该是没有什么差别的。 所以,下面采用了一种比较极端的方式,强制xxx.ko的版本信息与运行的kernel保持一致。

修改/home/haiyang/linux-2.6.32.2/include/linux/tsrelease.h文件中的宏定义

     #define UTS_RELEASE "2.6.32.2

     为

     #define UTS_RELEASE "2.6.32.2-FriendlyARM”

     然后重新编译xxx.ko模块,这时候,它与内核的版本信息应该就是一致的了!试验下来确实如此,xxx.ko已经可以正常工作了!

但是可能会再次出现:

key2: version magic '2.6.32.2 mod_unload modversions ARMv4 ' should be '2.6.32.2-FriendlyARM mod_unload ARMv4 '这是因为arm公司在linux版本中加了自己的标志

此时需要修改:/home/haiyang/linux-2.6.32.2/include/linux/vermagic.h

[root@localhost linux]# vi vermagic.h

#include <linux/utsrelease.h>

#include <linux/module.h>

 

 

#ifdef CONFIG_SMP

#define MODULE_VERMAGIC_SMP "SMP "

#else

#define MODULE_VERMAGIC_SMP ""

#endif

#ifdef CONFIG_PREEMPT

#define MODULE_VERMAGIC_PREEMPT "preempt "

#else

#define MODULE_VERMAGIC_PREEMPT ""

#endif

#ifdef CONFIG_MODULE_UNLOAD

#define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "

#else

#define MODULE_VERMAGIC_MODULE_UNLOAD ""

#endif

#ifdef CONFIG_MODVERSIONS

#define MODULE_VERMAGIC_MODVERSIONS "modversions "

#else

#define MODULE_VERMAGIC_MODVERSIONS ""

#endif

#ifndef MODULE_ARCH_VERMAGIC

#define MODULE_ARCH_VERMAGIC ""

#endif

 

#define VERMAGIC_STRING                                                

        UTS_RELEASE " "                                                

        MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT                    

        MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS      

        MODULE_ARCH_VERMAGIC

 

"vermagic.h" 34L, 837C

 

其中,VERMAGIC_STRING就是内核的版本信息,每个kernel module的版本信息就是从源代码树中的该宏定义获取的。所以,编译模块的时候一定要和实际使用该模块的内核的源代码树保持一致!不要张冠李戴,否则就会在加载模块的时候出现上述问题!

 

我的修改是#define MODULE_VERMAGIC_MODVERSIONS "modversions "

#define MODULE_VERMAGIC_MODVERSIONS ""

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值