web-dev-qa-db-ja.com

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

lsmodcat /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です。

$ 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

すでにビルトインです。カーネルのワークキューの動作に影響を与えるパラメーターの名前空間を提供するためかもしれません。

2
sourcejedi