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

mac2024-04-06  40

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的字符串只要有一项不一致都不可以。欲深入了解可以去内核里看一看,就会有个更具体的认识!

最新回复(0)