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

遇到这样的情况后,通过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. spy++ 句柄消息详解

    使用spy++捕获到的消息详解 主要是今天正好自己用到. 原来也有用过SPY++查看消息,然后自己SendMessage或者PostMessage 直接发送消息给目标程序.但是原来一用就有效果,今天要 ...

  2. python-sqlite3事务

    sqlite3事务总结: 在connect()中不传入 isolation_level 事务处理: 使用connection.commit() #!/usr/bin/env python # -*- ...

  3. linux编译安装gdb7.10.1

    1.下载GDB7.10.1安装包 #wget http://ftp.gnu.org/gnu/gdb/gdb-7.10.1.tar.gz 2.解压 #.tar.gz 3.创建安装目录 #/ #cd /u ...

  4. BZOJ 4403 2982 Lucas定理模板

    思路: Lucas定理的模板题.. 4403 //By SiriusRen #include <cstdio> using namespace std; ; #define int lon ...

  5. ManualResetEvent和AutoResetEvent的区别,分享来的

    在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...

  6. Unity3d Time

    using UnityEngine; using System.Collections; public class test1 : MonoBehaviour { public float angle ...

  7. oracle11g安装与拆卸

    Oracle 11g安装 1.解压下载的包,然后进入包内,点击setup.exe开始安装 . 2.出现如下:一般把那个小对勾取消,点击下一步进行, 弹出下图这个后点'是' 3.下图后,选择创建和配置数 ...

  8. ubuntu+win10双系统,调整分区大小后进入了emergency mode

    问题背景: 装了Ubuntu+win10双系统,在Ubuntu下面挂载了Windows的D盘.后来因为D空间不够,进入Windows压缩C盘分区,扩大了D盘.重启后无法启动Ubuntu,进入了emer ...

  9. Java代码运用及算法思路养成——用*号输出形状

    简单的了解了一些循环算法后,尝试用循环算法,输出形状图形 例1矩形与平行四边形的比较(可以看做矩形的每一行在输出前都输出了矩形长度数量-1的空格数量并且依次递减) 例2三角形(三角形可看做半个矩形,考 ...

  10. HttpServletRequest二三事

    缘由 在项目中,闲来无聊写了个bug LOGGER.info("前端请求,request:{}",JSON.toJSONString(request)); 好像还好是吧,来我告诉你 ...