在下也是从网上搜索到的这样的解决的方法。

遇到这样的情况后,通过dmesg看一下内核日志。

假设发现有例如以下日志。那就好办了。

hello: version magic '2.6.33.3 ' should be '2.6.33.3-85.fc13.i686.PAE SMP mod_unload 686 '

改动内核源代码文件include/linux/vermagic.h

把例如以下VERMAGIC_STRING宏的定义删掉

#define VERMAGIC_STRING
\ 

UTS_RELEASE " "\ 

MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT
\ 

MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS\ 

MODULE_ARCH_VERMAGIC

然后,从新定义一个VERMAGIC_STRING宏

#define VERMAGIC_STRING  "should be '2.6.33.3-85.fc13.i686.PAE SMP mod_unload 686 "

注意,双引號中的内容,要与dmesg输出的日志中should be后面的单引號中的内容,全然同样。别漏掉了那个空格哦。

好了,如今又一次编译一下你的模块,再载入一次吧。

基本上应该会OK啦。

须要指出的是,这样的方法非常不正规。

假设你仅仅是急于开发验证模块,不想又一次编译安装新内核,能够暂时使用一下。

并且,用的时候,也要注意一下,模块编译所用的内核版本号与实际执行的内核版本号。

大体上也要比較接近才行。否则可能会出问题的。

假设是正式的产品。请务必保证。模块是基于实际执行的内核编译出来的。

好了。问题攻克了。以下再闲说几句模块的载入。

实际上。Linux下模块的载入。是通过系统调用sys_init_module完毕的。

对于2.6的内核。sys_init_module的代码在kernel/module.c中

sys_init_module调用load_module,load_module则检查模块的vermagic是否与内核的一样。

modmagic = get_modinfo(sechdrs, infoindex, "vermagic");

/* This is allowed: modprobe --force will invalidate it. */

if (!modmagic) {

tainted |= TAINT_FORCED_MODULE;

printk(KERN_WARNING "%s: no version magic, tainting kernel.\n",

      mod->name);

} else if (!same_magic(modmagic,vermagic)) {

printk(KERN_ERR "%s: version magic '%s' should be '%s'\n",

      mod->name, modmagic, vermagic);

err = -ENOEXEC;

goto free_hdr;

}

vermagic是内核中保存的magic。其定义例如以下。可见他的值也就来自于我们上面定义的宏。

static const char vermagic[] = VERMAGIC_STRING;

除了检查vermagic。load_module还会检查模块的许可证的兼容性,

详细调用链是:load_module->set_license->license_is_gpl_compatible

从以下license_is_gpl_compatible的代码,能够看出内核支持的许可证类型。

static inline int license_is_gpl_compatible(const char *license)

{

        return (strcmp(license, "GPL") == 0

                || strcmp(license, "GPL v2") == 0

                || strcmp(license, "GPL and additional rights") == 0

                || strcmp(license, "Dual BSD/GPL") == 0

                || strcmp(license, "Dual MIT/GPL") == 0

                || strcmp(license, "Dual MPL/GPL") == 0);

}

因此,我们的模块代码中MODULE_LICENSE("Dual MIT/GPL")这一项,也要注意符合license_is_gpl_compatible中的要求才行。否则的话。载入模块时。可能又要看到例如以下的告警了
:)

hello: module license  'xxx'  taints kernel.

insmod hello.ko -1 Invalid module format最简单的解决的方法的更多相关文章

  1. 解决insmod: error inserting 'hello.ko': -1 Invalid module format

    编译自己的内核模块后,insmod出现error:error inserting 'hello.ko': -1 Invalid module format 出现这种情况的原因是因为Makefile种使 ...

  2. insmod: error inserting 'simp-blkdev.ko': -1 Invalid module format

    (一) 今天写了个块设备驱动例子,在虚拟机上加载模块insmod simp_blkdev.ko的时候,出现以下错误. insmod: error inserting 'simple-blk.ko': ...

  3. insmod: error inserting 'hello.ko': -1 Invalid module format

    在学习编写linux驱动程序的时候,一般都是从写一个helloworld的模块開始. 可是在编译完毕后,进行模块载入的时候,有时会出现例如以下错误: insmod: error inserting ' ...

  4. insmod: can't insert 'led.ko': invalid module format详细解释

    insmod: can't insert 'led.ko': invalid module format 之前在Imx257学习版固件编写的驱动想直接移植imx257核心板的开发板上.以为2个板子的源 ...

  5. 内核模块加载错误 “Invalid module format” 解决办法

    参考链接:  http://blog.chinaunix.net/uid-20448327-id-172345.html

  6. insmod: ERROR: could not insert module dm-snapshot.ko: Unknown symbol in module

    下面方法成功的前提是你的mod和你的操作系统版本是匹配的,也就是说你的mod之前成功过.说个多余的提示,mod在/lib/modules目录里面 insmod: ERROR: could not in ...

  7. jarsigner签名报错Invalid keystore format

    由于之前在魅族市场的APK包都不是自己上传的,而是魅族从其他安卓市场帮拉去过来了. 所以需要我们自己去认领APK包. 这个时候就需要按照魅族给的未签名测试包给重新签名然后提交审核了. 1:看完以下说明 ...

  8. [原] wmic: Invalid XSL format (or) file name错误解决方法

    之前运行wmic命令正确,今天在服务器上出现Invalid XSL format (or) file name的提示,搜索了一下,在这里找到了答案: http://www.ctkn.net/2011/ ...

  9. 配置tomcat连接器后,启动服务报错“No Certificate file specified or invalid file format"异常

    1:原来的配置是 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true&quo ...

随机推荐

  1. 初学struts2杂乱笔记

    1.在web.xml文件里定义struts2里的一个过滤类org.apache.struts2.dispatcher.FilterDispatcher 2.在src目录下创建struts.xml文件, ...

  2. Tomcatsession共享方案--memcached-session-manager

    https://github.com/magro/memcached-session-manager/wiki/SerializationStrategies     MSM的特性:    a.支持t ...

  3. P1284 三角形牧场

    题目描述 和所有人一样,奶牛喜欢变化.它们正在设想新造型的牧场.奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场.她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有 ...

  4. GEF入门笔记

    最近项目中需要用到Eclipse GEF框架进行画图,故将平时学习笔记更新到博客中,便于查阅 自己画的一个GEF基本结构     最基本流程 1.创建model(包括数据域.在界面中的布局.图片索引等 ...

  5. hadoop基础学习

    MR系类: ①hadoop生态 >MapReduce:分布式处理 >Hdfs:hadoop distribut file system >其他相关框架 ->unstructur ...

  6. swift 类型备份

    Swift语法3.03(类型Types) https://www.jianshu.com/p/839f9bc4b9a3 https://developer.apple.com/library/cont ...

  7. JdbcTemplate 增删查改

    准备工作:1,拷贝工具类JDBCUtils, 2,导入包commons-logging-1.2-javadoc.jar   spring-beans-5.0.0.RELEASE-javadoc.jar ...

  8. C语言break/continue/exit/return的功能区别

    break是跳出整个循环而执行循环体之外的下一条语句: continue只是跳出本次循环继续判断下一次循环条件是否满足. exit() 结束当前进程/当前程式/,在整个程式中,只要调用 exit ,就 ...

  9. MongoDB 学习笔记(六):备份与用户管理

    一.启动项 1.在启动数据库服务时可以在命令行输入mongod命令,然后直接带一些参数,比如“mongod --dbpath D:\Installations\MongoDB-2.4.6\MongoD ...

  10. day27-2 pandas模块

    目录 pandas Series(了解) DataFrame 内置方法 处理缺失值 合并数据 取值 把表格传入excel文件中 把表格从excel中取出来 高级(了解) pandas 处理表格等文件/ ...