カーネルモジュールの開発を学ぶために、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です。
$ 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
すでにビルトインです。カーネルのワークキューの動作に影響を与えるパラメーターの名前空間を提供するためかもしれません。