一般分为2中情况:
一、依赖文件没有被加载,modinfo agile_nic.ko 查看需要的依赖module,先加载依赖model,再加载驱动 agile_nic.ko
二、驱动的 vermagic 和系统当前的 vermagic 不匹配。
查看驱动的 vermagic:
$ modinfo agile_nic.ko
filename: /root/agile_net/agile_nic.ko
version: 0.0.1
description: Agile PCI Net Driver
author: Li yandong
license: GPL v2
srcversion: CE2B5DEF0BBF2A1FCB0387E
alias: pci:v00001957d00001000sv*sd*bc*sc*i*
depends: virtio,virtio_ring
retpoline: Y
name: agile_nic
vermagic: 5.3.8-BonusCloud+ SMP mod_unload modversions
最后一行为驱动 agile_nic 对应的 vermagic: 5.3.8-BonusCloud+
查看已经启动的内核的 vermagic:
$ uname -r
5.3.8-BonusCloud+
如果这2个magic不一样,则 insmod agile_nic.ko 会提示:
“could not insert module agile_nic.ko: Invalid module format”
解决方法:
1. 用当前系统已经跑的内核的源码 来编译 agile_nic model。编译完后就可以insmod agile_nic.ko
2. 改变host的linux内核版本,让host跑我们编译 agile_nic model 版本的内核版本的系统。参考:
3. 临时应付事: 修改 Makefile 中的版本号,例如:
1. 修改顶层目录 Makefile 中的版本
eg:
VERSION = 5
PATCHLEVEL = 3
SUBLEVEL = 8
EXTRAVERSION =
2. make menuconfig 修改: .config
//General setup --> [ ] Automatically append version information to the version string
# CONFIG_LOCALVERSION_AUTO is not set
//General setup --> (-BonusCloud) Local version - append to kernel release
CONFIG_LOCALVERSION="-BonusCloud"
//还需要测试
CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y
一般的内核默认已经使能了 "Enable loadable module support",不需要手动修改:
make menuconfig
[*] Enable loadable module support --->
--- Enable loadable module support
[ ] Forced module loading //打开可加载模块支持,如果打开它则必须通过”make modules_install”把内核模块安装在/lib/modules/中
[*] Module unloading //允许卸载已经加载的模块
[ ] Forced module unloading //允许模块强制加载
[*] Module versioning support //允许使用为其他内核版本编译的模块,可会造成系统崩溃.这同样是个坏主意!建议关闭.
[*] Source checksum for all modules //为所有的模块校验源码
[ ] Module signature verification //模块签名认证
[ ] Compress modules on installation //在安装时压缩模块
[ ] Trim unused exported kernel symbols
host 中的 vermagic 生成文件在:
/usr/src/kernels/`uname -r`/include/linux/vermagic.h 中,eg:
/lib/modules/5.3.8-1.el7.elrepo.x86_64/build/include/linux/vermagic.h 最后,是由各个宏定义组成的:
#define VERMAGIC_STRING \
UTS_RELEASE " " \
MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT \
MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \
MODULE_ARCH_VERMAGIC \
MODULE_RANDSTRUCT_PLUGIN