私はプログラミング初心者ですLKM
。
私はコマンドライン引数を取得し、それを警告レベルに記録する単純な引数渡可能モジュールを作成しています。
printk
問題は、なぜ関数の2番目の関数を呼び出さないのか分からないことですhello_start
。たぶんそこでエラーが発生するかもしれませんが、驚くべきことにrmmod
unload()中に動作します。ログとコードは次のとおりです。
// insmod thetestmodule.ko yes_no=1
Dec 26 20:25:31 duckduck kernel: [ 995.877225] Hi darcy. I'm now alive!
// Expect the argument here.
// rmmod thetestmodule
Dec 26 20:26:11 duckduck kernel: [ 995.877230] This is the passed argument: 1
Dec 26 20:26:11 duckduck kernel: [ 1035.956640] Understood. Bye.
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
#define AUTHOR "Darcy"
MODULE_LICENSE("GPL");
MODULE_AUTHOR(AUTHOR);
MODULE_DESCRIPTION("OH. Kernel log, ALERT LEVEL O_o");
MODULE_VERSION("0.1");
static int short yes_no;
module_param(yes_no , short ,0);
MODULE_PARM_DESC(yes_no, "Enter 0 or 1 to say if you want the module be loaded in rescue mode.");
static int __init hello_start(void)
{
printk(KERN_ALERT "Hi darcy. I\'m now alive!\n");
printk(KERN_ALERT "This is the passed argument: %d" , yes_no);
return 0;
}
static void __exit hello_end(void)
{
printk(KERN_INFO "Understood. Bye.\n");
return NULL;
}
module_init(hello_start);
module_exit(hello_end);
助けてくれてありがとう!
答え1
2番目の端にはaはありませんが、1printk()
番目の端にはaがあります。\n
また、単語の後の括弧内の数字はkernel:
システムの稼働時間(秒単位)なので、2番目のメッセージが実際に最初のメッセージと同じ時間に生成されたように見えます。
私の最初の仮説は、行終端が欠けているため、より多くのテキストが到着した場合に備えてカーネルメッセージバッファを読み取るプロセスが待機し、メッセージの残りの部分は3番目のテキストの後に\n
のみユーザースペースログデーモンによって\n
処理されることです。行全体が受信されたことを示します。
カーネルメッセージバッファ(コマンドを参照dmesg
)では、括弧内の稼働時間は通常メッセージの最初の要素です。人間が読めるタイムスタンプ、ホスト名、kernel:
カーネルメッセージバッファを読み取ってカーネルに挿入するために使用される単語。ユーザー空間ログ・ストリームにメッセージを追加します。
\n
したがって、2番目のメッセージの最後に次のように追加してみてください。
printk(KERN_ALERT "This is the passed argument: %d\n" , yes_no);