在linux开发板上加载.ko驱动文件时,出现“insmod: ERROR: could not insert module led.ko: Invalid module format”错误的原因及解决方法
本文档仅用于本人在学习过程中的记录,方便日后查找问题。
问题描述:
在ubuntu虚拟机编译出的xxx.ko文件,发送到linux开发板上,执行insmod xxx.ko时,出现“insmod: ERROR: could not insert module led.ko: Invalid module format”错误。
原因查找:
1)在linux开发板上,使用uname -r查看linux内核版本为:4.1.15-2.0.0+gb63f3f5
2)在linux开发板上,使用modinfo xxx.ko查看.ko文件的vermagic为:4.1.15 SMP preempt mod_unload modversions ARMv6 p2v8
3)在linux开发板上,使用dmesg查看错误日志信息,可以找到:version magic '4.1.15 SMP preempt mod_unload modversions ARMv6 p2v8' should be '4.1.15-2.0.0+gb63f3f5 SMP preempt mod_unload modversions ARMv7 p2v8'。
根据上述信息,可以确定是由于内核版本不一致,以及ARM架构不一致导致的问题。
(由于ubuntu虚拟机上用于编译.ko的内核源码与开发板上的linux版本不一致导致的,如果使用与linux开发板一致的内核源码进行.ko的编译便不会出现此问题)
问题解决:
如果能够确认linux开发板上的内核版本与编译版本差异不大,可以用下述方法解决。
1)在ubuntu虚拟机上的内核源码根目录下,修改Makefile文件,增加EXTRAVERSION = -2.0.0+gb63f3f5,如下所示:
VERSION = 4
PATCHLEVEL = 1
SUBLEVEL = 15
EXTRAVERSION = -2.0.0+gb63f3f5
NAME = Series 4800
2)然后在内核源码根目录下执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig,在System Type->Multiple platform selectio下将ARMv6 based platforms (ARM11)选项去掉,只留下ARMv7 based platforms (Cortex-A, PJ4, Scorpion, Krait),保存配置,然后重新编译内核。
3)内核重新编译完成后,在include/generated/utsrelease.h中,会生成#define UTS_RELEASE "4.1.15-2.0.0+gb63f3f5"
4)最后我们再重新编译xxx.ko文件,编译完成后使用modinfo xxx.ko的模块的vermagic为:4.1.15-2.0.0+gb63f3f5 SMP preempt mod_unload modversions ARMv7 p2v8,与linux开发板上的内核版本一致。
5)发送到linux开发板,并进行insmod xxx.ko,即可成功加载驱动。
6)在linux开发板上,使用lsmod可以查看到驱动加载成功。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具