insmodプロセス中にロード可能なカーネルモジュールのロギングの問題

insmodプロセス中にロード可能なカーネルモジュールのロギングの問題

私はプログラミング初心者ですLKM

私はコマンドライン引数を取得し、それを警告レベルに記録する単純な引数渡可能モジュールを作成しています。

printk問題は、なぜ関数の2番目の関数を呼び出さないのか分からないことですhello_start。たぶんそこでエラーが発生するかもしれませんが、驚くべきことにrmmodunload()中に動作します。ログとコードは次のとおりです。

// 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); 

おすすめ記事