Linux插入内核模块报错
问题
1 | sudo insmod simple.ko |
输出 insmod: ERROR: could not insert module simple.ko: Invalid module format。
可能原因
根据chatgpt的回复,可能的原因有:
- 内核版本不匹配:该模块是在另一个内核版本中编译的,与当前运行的内核版本不兼容。检查一下该模块所支持的内核版本,确保它与当前运行的内核版本相匹配。
- 架构不匹配:该模块是为另一个 CPU 架构编译的,与当前 CPU 架构不兼容。例如,在 x86 平台上编译的模块无法在 ARM 平台上加载。检查一下该模块所支持的 CPU 架构,确保它与当前的 CPU 架构相匹配。
- 编译错误:该模块编译时出现了错误,可能是由于编译器版本不兼容或编译选项不正确等原因导致。检查一下该模块的编译日志,查找任何编译错误或警告。
查询内核版本
首先查询当前Linux的运行的内核版本:
1 | uname -r |
得到 5.15.0-69-generic。然后查询.ko文件所支持的内核版本
1 | modinfo simple.ko |
得到
1 | filename: /home/zxz/final-src-osc10e/ch2/simple.ko |
说明内核版本没有问题。
查询CPU架构
首先查询模块文件的对应架构
1 | file simple.ko |
得到 simple.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=b56d8837eacb05001d12de71890131fa97b8902f, with debug_info, not stripped
然后再查询内核对应的CPU架构
1 | uname -m |
然后得到 x86_64。说明架构一致。
编译情况
再次运行
1 | sudo make |
得到输出
1 | make -C /lib/modules/5.15.0-69-generic/build M=/home/zxz/final-src-osc10e/ch2 modules |
可以看出编译过程正常。
问题解决
参考了stackoverflow中的一个回答。需要运行如下指令:
1 | sudo apt update # 更新系统的软件包列表 |
然而之前的操作似乎删除了 linux-source,因此我又重新装了一遍。
1 | sudo apt-get install linux-source |
之后再运行
1 | sudo make |
就没有再出现问题。
疑惑
尽管最后成功了,但还是很奇怪,因为现在的 linux-source 模块和 uname -r 输出的当前运行模块是不相符的。
评论
