首页 > 解决方案 > Linux 不会自动加载内核模块

问题描述

我创建了一个基本内核模块,我计划最终将其用于时序分析。我正在运行 v4.14.149 主线内核,并使用在 i.MX6 目标上运行的 Yocto Zeus 构建它。我似乎无法让它自动启动。

一切都编译得很好,我看到我的testmodule.ko出现在目标的/lib/modules/4.14.149/extras/中。我可以很好地加载和卸载它insmodrmmod所以我很确定模块没问题。我还在 /etc/modules-load.d/ 中看到一个包含模块名称(testmodule)的testmodule.conf文件,但是当我启动并执行时,我看不到它已加载。我也没有看到任何表明它已加载的输出。lsmodjournalctl

我已经查看并尝试了Yocto:向映像添加内核模块配方,但它不会在启动时加载,并且Yocto 加载内核模块并已添加KERNEL_MODULE_AUTOLOAD += "testmodule"到我的机器配置中,我也在模块配方中尝试过,但无济于事。我通过IMAGE_INSTALL_appendas kernel-module-test将模块包含在我的图像配方中。

这是我的模块的配方:

SUMMARY = "Test kernel module"
LICENSE = "CLOSED"

inherit module

SRC_URI = "file://Makefile \ 
           file://testmodule.c"

S = "${WORKDIR}"

KERNEL_MODULE_AUTOLOAD += "testmodule"

RPROVIDES_${PN} += "kernel-module-test"

目前的模块代码只是打印一条消息(它是我拥有的 Yocto 书中的一个示例),就是这样:

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
 
/*
** Module Init function
*/
static int hello_world_init(void)
{
    printk("Markem Kernel Module Inserted Successfully...\n");
    return 0;
}
/*
** Module Exit function
*/
static void hello_world_exit(void)
{
    printk("Markem Kernel Module Removed Successfully...\n");
}

module_init(hello_world_init);
module_exit(hello_world_exit);

MODULE_LICENSE("Proprietary");

/*
MODULE_VERSION("0.1");
MODULE_DESCRIPTION("A test module.");
MODULE_AUTHOR("Markem-Imaje Corporation");
*/

最后是Makefile,它也基于 Yocto Book 示例

obj-m := testmodule.o

SRC := $(shell pwd)

all:
    $(MAKE) -C $(KERNEL_SRC) M=$(SRC)

modules_install:
    $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install

clean:
    rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
    rm -f Module.markers Module.symvers modules.order
    rm -rf .tmp_versions Modules.symvers

如果您需要我的内核或我的机器 conf 或任何东西的配方,我可以得到这些。我读过的所有内容都表明将文件放在/etc/modules-load.d/ 中表明它应该自动加载。我可能缺少内核配置吗?

标签: embedded-linuxyoctokernel-module

解决方案


推荐阅读