博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法
阅读量:4056 次
发布时间:2019-05-25

本文共 1717 字,大约阅读时间需要 5 分钟。

问 题: 可以正常编译我写的驱动模块,但是加载(insmod)的时候提示错误: insmod: error inserting 'xxx.ko': -1 Invalid module format;用# dmesg | tail 看到如下信息:xxx: version magic '2.6.23.1 SMP mod_unload 686 4KSTACKS ' should be '2.6.23.1-42.fc8 SMP mod_unload 686 4KSTACKS '; 这一行的意思就是说,当前插入的模块xxx.ko的版本信息(version magic)与正运行的kernel的版本信息不一致!应该是
2.6.23.1-42.fc8 SMP mod_unload 686 4KSTACKS,而实际上xxx.ko的版本信息却是:2.6.23.1 SMP mod_unload 686 4KSTACKS; 显然它们之间差别是很小的。实际上,根据上面安装的kernel源码来看,它们应该是没有什么差别的。 所以,下面采用了一种比较极端的方式,强制xxx.ko的版本信息与运行的kernel保持一致。

解决:
     修改/usr/src/kernels/2.6.23.1-42.fc8-i686/include/linux/utsrelease.h文件中的宏定义

     #define UTS_RELEASE "2.6.23.1"

     为

     #define UTS_RELEASE "2.6.23.1-42.fc8"

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

    

     为什么是修改上面的宏定义呢?来看看/usr/src/kernels/2.6.23.1-42.fc8-i686/include/linux/vermagic.h文件的内容吧!

     
#include <linux/utsrelease.h>
#include <linux/module.h>

/* Simply sanity version stamp for modules. */
#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
#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_ARCH_VERMAGIC

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



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

转自

转载地址:http://tkqci.baihongyu.com/

你可能感兴趣的文章
WPF中PATH使用AI导出SVG的方法
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
course_2_assessment_6
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
linux安装usb wifi接收器
查看>>
多线程使用随机函数需要注意的一点
查看>>