linux内核--关于无法加载外部模块的原因总结(加载模块失败)

insmod一个外部模块时会经过两个检查,可以在/kernel/modules.c内看到,分别是check_version()和check_modinfo()。下面我们简称为检查一和检查二。检查一和检查二不通过insmod都会报错为:Invalid module format。

检查一:
众所周知,在menuconfig中,有如下选项:
[ * ] Enable loadable module support
—>[ * ] Module versioning support
此选项为是否支持不同版本的模块,选中此选项也就会开启检查一,检测版本及相关。此时modinfo查看,可发现打开选项后编译出的模块信息中vermagic项中会多出modversions字样。
检查一的报错在日志中查看为:
模块名:disagrees about version of symbol module_layout

检查二:
检查二在检查一通过后才进行(不通过不进行),此时检查的是模块信息的整个vermagic的内容。vermagic的内容是在include/linux/vermagic.h中构成的。并且可以手动修改,修改方法网上很多,不赘述。
如果和当前内核的不一致,加载就会报错如:
模块名: version magic 'XXX ’ should be 'XXX '

使用命令强制加载方法(跳过上两个检查):
使用modprobe强制加载模块,需先将ko移动到/lib/modules/'uname -r’下,然后执行modprobe -f 模块名(模块名不加.ko),eg:modprobe -f hello
加-f的方法为同时跳过两个检查,直接加载,当然也可加其他参数跳过某单次检查。需要注意的是,强制加载会有不同程度的风险!
如:modprobe --force-vermagic hello 或 modprobe --force-modversion hello

总结:大致的出错原因如上,在这里不做详细的源码分析,简单来说在源码里,会先经过check_version()若不通过就可能出现检查一的相关报错,并且会直接return,不进行检查二check_modinfo(),若进入检查二check_modinfo()内部,则首先就会判断模块vermagic和当前内核的是否一致,vermagic的字符串只要有一项不一致都不可以。欲深入了解可以去内核里看一看,就会有个更具体的认识!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值