1

debian wheezy 7.5 で最初のロード可能なカーネル モジュールを作成しようとしています。Web 上のさまざまなチュートリアルのサンプル コードをいくつか試してみましたが、思ったほどうまくいきません。

これが私のコードです:

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

void cleanup_module(void)
{
    printk(KERN_INFO "exit LKM...");
}

int init_module(void)
{
    printk(KERN_INFO "loading LKM...");
    return 0;
}

そして、私はこのようなMakefileでそれをコンパイルしています

obj-m += lkm.o
all:
    sudo make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

したがって、問題なくコンパイルされますが、「$ sudo insmod lkm.ko」でLKMをロードしてからログメッセージを調べると、「exit LKM ...」が返されるため、insmodがcleanup_moduleシステムコールを呼び出すようですinit_module の代わりに。"$ sudo rmmod lkm"を使用すると、ログ メッセージに"loading LKM.."が返されます。だから私はこれがなぜなのか本当に分かりません。私がウェブで見つけたのは、insmodがinit_module()などを介してLKMをロードすることだけです...

何がうまくいかなかったのか本当にわからないので、そのための助けや説明をいただければ幸いです。

ありがとう

4

1 に答える 1

1

\nprintk 文字列の最後に改行別名を入れます。

表示されている問題は、印刷の遅延が原因です。insmod を初めて実行したときは、出力がまったく表示されなかったに違いありません。次に、他のことをいくつか行ってから、モジュールをアンロードしました。その時点で、バッファーは前のメッセージをフラッシュし、アンロード中に init メッセージを出力したかのように見えます。

実際に起こっていたのは、カーネルが改行を見つけたら完全な行を出力するために行を保存していたことです。その改行は後で到着しました。

于 2014-06-14T02:26:45.823 に答える