Chinaunix首页 | 论坛 | 博客
  • 博客访问: 386599
  • 博文数量: 85
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1707
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-27 11:18
个人简介

学无止境……

文章分类

全部博文(85)

分类: LINUX

2013-08-29 15:07:30

安装模块时出现:[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保持一致。

修改~/linux-2.6.32.2/include/linux/utsrelease.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


  1. [root@localhost linux]# vi vermagic.h
  2. #include <linux/utsrelease.h>
  3. #include <linux/module.h>
  4. #ifdef CONFIG_SMP
  5. #define MODULE_VERMAGIC_SMP "SMP "
  6. #else
  7. #define MODULE_VERMAGIC_SMP ""
  8. #endif
  9. #ifdef CONFIG_PREEMPT
  10. #define MODULE_VERMAGIC_PREEMPT "preempt "
  11. #else
  12. #define MODULE_VERMAGIC_PREEMPT ""
  13. #endif
  14. #ifdef CONFIG_MODULE_UNLOAD
  15. #define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "
  16. #else
  17. #define MODULE_VERMAGIC_MODULE_UNLOAD ""
  18. #endif
  19. #ifdef CONFIG_MODVERSIONS
  20. #define MODULE_VERMAGIC_MODVERSIONS "modversions "
  21. #else
  22. #define MODULE_VERMAGIC_MODVERSIONS ""
  23. #endif
  24. #ifndef MODULE_ARCH_VERMAGIC
  25. #define MODULE_ARCH_VERMAGIC ""
  26. #endif
  27. #define VERMAGIC_STRING
  28. UTS_RELEASE " "
  29. MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT
  30. MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS
  31. MODULE_ARCH_VERMAGIC

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



我的修改是#define MODULE_VERMAGIC_MODVERSIONS "modversions "

#define MODULE_VERMAGIC_MODVERSIONS " "


NOTES: 本方法并不是正规的解决办法,我是由于不想重新编译安装linux kernel,并且能够确保当前源码树中的kernel版本与系统运行的kernel版本是相同的情况下采用的权宜之计。如果不能保证这一点,最好不要采用这种方法。以免产生一些莫名其妙的问题!!

            转载:http://blog.sina.com.cn/s/blog_5d2a81780100mat6.html   作者:woshihaoren

阅读(2320) | 评论(0) | 转发(0) |
0

上一篇:GCC简介

下一篇:简单Makefile范本

给主人留下些什么吧!~~