2010-12-06 8 views
0

カスタマイズされたプリントオンスクリーンシステムを使用するカーネルモジュールを作成しています。基本的にprintが関わるたびに、文字列がリンクリストに挿入されます。 X秒ごとリストを処理してから、文字列を印刷してから印刷する必要があります。フィルタの一方の端部にそれ自体を再起動カーネルスレッドとタイマー

1)タイマ()

X秒間スリープ

2)カーネルスレッド

は、基本的に私は、このようなフィルタを実装するための2つの選択肢があり他のものはリンクされたリストを使用することはできません。もちろん、フィルタ関数が待機する文字列を挿入しています。

AFAIKタイマーは割り込みコンテキストで動作するためスリープできませんが、カーネルスレッドはどうですか?彼らは眠れますか?はいの場合は、私のプロジェクトでそれらを使用しない理由がありますか?他にどのような解決方法が使えますか?

は、要約すると:私のフィルタ機能は、わずか3要件を持っている:

1)までブロックしなければならないリストにアクセスしようとしている他のリストのすべてを使用する場合printk

2)することができなければなりませんフィルタ機能はprint私たびに)実行

3を終了し、すべてのX秒(ないリアルタイムの要件を実行する必要があります)

答えて

2

kthreadsがスリープ状態に許可されているあなたのプリントオンスクリーンシステム上で何かをすることができますになるだろう、すべてを捨ててしまいます。 (しかし、すべてのクライアントに黙想的な実行を提供するわけではありません。たとえば、softirqdはそうではありません。) もう一度、スピンロック(およびその関連コスト)を使用して余分なスレッドなしで行うこともできますspinlock_bhを使用します)。それは本当にトレードオフです。

1

文字列がリンクリストに挿入されています

printまたはprintkを意味するかどうかはわかりません。しかし、あなたがprintk()について話しているのであれば、メモリを割り当てる必要があり、printk()がアトミックなコンテキストで呼び出される可能性があるため、問題があります。これにより、循環バッファを使用するオプションが残ります(したがって、すべての文字列を保存するのに十分なメモリがないため、一部の文字列を削除する必要があります)。

すべてのX秒リストを処理して、文字列を印刷してから印刷する必要があります。

この場合、私はカーネルスレッドを実行しません。それほど高価でない場合はprint()で処理します。

そうでなければ、私は新しいシステムコール作成します。

  • sys_get_strings()か何か、ユーザー空間の中に全体のリンクリストをダンプ(コピーされたときに、リストからエントリを削除する)でしょう。

このようにして、すべての動作がユーザー空間によって制御されます。 X秒ごとにシステムコールを呼び出すデーモンを作成することができます。あなたはまた、すべての高価な処理をユーザー空間で行うことができます。

ます。また、新しいデバイスを作成することができ/dev/print-on-screen言います:

  • dev_openメモリを割り当てるだろう、とprint()は、もはや何の-OPなりませんが、デバイス事前に割り当てられたメモリにデータを送ります(中ケースprint()は、すべての原子コンテキストで使用されます)。
  • dev_release
  • dev_readが文字列
  • dev_write
+0

+1私にユーザー空間のソリューションを使用する考えを与える – Emiliano

関連する問題