在linux开发板上加载.ko驱动文件时,出现“insmod: ERROR: could not insert module led.ko: Invalid module format”错误的原因及解决方法

发布时间 2023-07-05 15:32:36作者: 倾听雪落

本文档仅用于本人在学习过程中的记录,方便日后查找问题。

问题描述:

在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可以查看到驱动加载成功。