ドライバのprintk情報を印刷

2470 ワード

linuxカーネルのレベル制御付きprintkコンテンツを印刷するには、コマンドラインにdmesg-n 8を入力すると、すべてのレベルの情報が印刷されます.
 
Linuxコマンド:dmesg機能説明:起動情報を表示します.
構文:dmesg[-cn][-s<バッファサイズ>]
補足:kernelは、ring bufferに電源投入情報を格納します.電源を入れたときに情報を表示できない場合は、dmesgを使用して表示します.起動情報も/var/logディレクトリに保存され、名前がdmesgのファイルに保存されます.
パラメータ:
-c情報を表示したらring bufferの内容をクリアします.
-s<バッファサイズ>は、ring bufferのサイズに等しい8196に予め設定されています.
-n記録情報のレベルを設定します.
printk()は、カーネルがprintk()を介して出力されることを示す情報を用いてログレベルを有し、ログレベルはprintk()が出力する文字列の前に括弧付き整数を加えることによって制御される.例えばprintk(「<6>Hello,world!/n」).カーネルにはlinux/kernelで8つの異なるログレベルが用意されています.hには対応するマクロが対応する.
#define KERN_EMERG      "<0>"   /* system is unusable */    #define KERN_ALERT      "<1>"   /* action must be taken immediately */    #define KERN_CRIT       "<2>"   /* critical conditions */    #define KERN_ERR        "<3>"   /* error conditions */    #define KERN_WARNING    "<4>"   /* warning conditions */    #define KERN_NOTICE     "<5>"   /* normal but significant */    #define KERN_INFO       "<6>"   /* informational */    #define KERN_DEBUG      "<7>"   /* debug-level messages */ 
だからprintk()はprintk(KERN_INFO"Hello,world!/n");.
ログ・レベルが指定されていないprintk()のデフォルト・レベルはDEFAULT_です.MESSAGE_LOGLEVEL、このマクロはkernel/printk.cでは整数4、すなわち対応するKERN_と定義されるWARNING.
/proc/sys/kernel/printkには、現在のコンソール・ログ・レベル、ログ・レベルが明示的に指定されていないデフォルト・メッセージ・ログ・レベル、最小(最高)設定可能なコンソール・ログ・レベル、起動時のデフォルトのログ・レベル別の4つの数値が表示されます.printk()のメッセージ・ログ・レベルが現在のコンソール・ログ・レベルより小さい場合、printkの情報(必要に応じて/n文字)はコンソールに表示されます.ただし、現在のコンソールログレベルがどの値であるかにかかわらず、/proc/kmsg(またはdmesgを使用)で常に表示されます.またsyslogdまたはklogdが構成されて実行されている場合、コンソールに表示されていないprintkのメッセージも/var/log/messages.logに追加されます.
コンソールのログ・レベルを読み取り/書き込み/proc/sys/kernel/printkファイルで変更できます.このファイルを表示する方法は次のとおりです.
#cat /proc/sys/kernel/printk
6   4  1   7

上記の4つのデータは、コンソール・ログ・レベル、デフォルトのメッセージ・ログ・レベル、最下位のコンソール・ログ・レベル、およびデフォルトのコンソール・ログ・レベルに対応します.
次のコマンドを使用して、現在のログ・レベルを設定できます.
# echo 8 > /proc/sys/kernel/printk

またprintk()が瞬時に呼び出される回数が多すぎることを防止するためにprintk_ratelimit()は速度を制御します.printk_ratelimit()は、コンソールに送信されたメッセージの数を追跡することによって動作し、出力速度が臨界値を超えるとゼロを返します.printk_は、/proc/sys/kernel/{printk_ratelimit,printk_ratelimit_burst}を変更して調整できます.ratelimit()の計算.
printk_ratelimit()の典型的な使い方は、if(printk_ratelimit()printk(KERN_INFO"Hello,world!/n");