我是一个新手建设我的第一个Linux内核模块。所以问题是我在Ubuntu 22上构建了一个raspberry内核64位版本5.4,并使用make创建了一个helloworld_rpi4.ko文件。helloworld_rpi4.ko文件成功创建,然后我将其scp到我在QEMU-6.2上使用的raspberrypi OS(rpi 3-b-plus,64 bit-aarch 64)。当我在raspberry OS上尝试sudo insmod
时,它给了我这个错误:
`insmod: ERROR: could not insert module helloworld_rpi4.ko: Invalid module format
`
字符串
我的Makefile:
obj-m += helloworld_rpi4.o
KERNEL_DIR ?= $(HOME)/linux
all:
make -C $(KERNEL_DIR) \
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \
M=$(PWD) modules
clean:
make -C $(KERNEL_DIR) \
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \
M=$(PWD) clean
deploy:
scp -P 5555 *.ko pi@localhost:/home/pi/.
型
我的源代码:
#include <linux/module.h>
static int __init hello_init(void)
{
pr_info("Hello world init\n");
return 0;
}
static void __exit hello_exit(void)
{
pr_info("Hello world exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Alberto Liberal <aliberal@arroweurope.com>");
MODULE_DESCRIPTION("This is a print out Hello World module");
型
我使用以下代码安装cross_compile:sudo apt install crossbuild-essential-arm64
个
我试图在树莓操作系统上运行uname -r
,其内核版本是:**5.4.51-v8+**.
然后我modinfo
hellowolrd_rpi4.ko和vermagic
:5.4.83-v8+ SMP preempt mod_unload modversions aarch64。所以我构建的内核和raspberry上的内核是相同的,但我不知道为什么它仍然给我上面的错误。任何帮助你将不胜感激!
1条答案
按热度按时间e5nqia271#
当用于生成模块的内核版本与目标系统上运行的内核版本不匹配时,通常会发生“模块格式无效”错误。在您的例子中,内核版本似乎不同。
您提到您使用5.4版本在Ubuntu 22上构建了内核,但Raspberry Pi的内核版本是5.4.51-v8+。这两个内核版本之间的补丁级别或配置似乎不匹配。您可以按如下方式修改模块代码:
字符串
重新编译模块并尝试在Raspberry Pi上再次加载。