カーネルローダブルモジュールでprintkを使用して、システムコールのパラメーターをログに記録しています。システムコールごとに、いくつかのprintkを使用して、区切り文字として「\t」が付いた変数ホエーを出力します。カーネルログバッファ内のデータをシステム/var/ log / messages以外の別のファイルにリダイレクトするには、「klogd-f」を使用してsyslogインターフェイスをバイパスします。取得されるログデータは、システムコールごとに1行です。しかし、データを分析したところ、2つの問題があることがわかりました。
問題1:データが失われる可能性があります。
問題2:あるシステムコールのデータが別のシステムコールに属するデータと混合されている(おそらく途中で)。
質問1:データの損失は、バッファ内の最も古いログを上書きするカーネルログバッファオーバーフローが原因ですか?もしそうなら、それを克服する方法は?カーネルログバッファのサイズを増やす予定です。あなたはそれが適切で、どのサイズが最適だと思いますか?
質問2:システムコールは別のシステムコールをプリエンプトできますか?または、状況によっては、あるシステムコールが別のシステムコールを呼び出し、呼び出されたシステムコールが終了しない限り終了できない場合がありますか?これがデータが混ざり合う理由ですか?
質問3:printkはアトミックですか?そうでない場合、printkをアトミックにする方法は?中断できないようにロックを追加しますか?