即使 lsmod 不包含该模块,insmod 如何会因内核模块已加载而失败?

即使 lsmod 不包含该模块,insmod 如何会因内核模块已加载而失败?

我正在使用 buildroot 制作一个最小的 Linux 发行版来学习内核模块开发。

如果我调用一个最小模块hello.ko(或我尝试过的几乎任何其他名称),一切都会正常工作。

但是,如果我使用完全相同的代码,但调用模块workqueue.ko失败insmod workqueue.ko,dmesg 包含:

workqueue: module is already loaded

insmod输出到 stderr:

insmod: can't insert 'workqueue.ko': invalid argument

lsmod都是cat /proc/modules空的。

这是确切的回购协议这产生了问题。

作为参考,模块代码为:

#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");

int init_module(void)
{
    printk(KERN_INFO "hello init\n");
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "hello cleanup\n");
}

内核版本(buildroot 暗示的默认版本)是 4.9。

答案1

$ uname -a
Linux alan-laptop 4.10.14-200.fc25.x86_64 #1 SMP Wed May 3 22:52:30 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ ls /sys/module/workqueue/
parameters  uevent
$ ls /sys/module/workqueue/parameters/
debug_force_rr_cpu  disable_numa  power_efficient

它已经是内置的了。也许为影响内核工作队列行为的参数提供一个命名空间。

相关内容