0

私はlinuxのipsecのモジュールで作業します。私のモジュールのコードが実行される2つの異なる状況を見てください。モジュールの実行コンテキスト

アプリケーションは、ネットワークを介して送信するトラフィックを生成するためにいくつかのトラフィックを生成する必要があります。アプリケーションは、データを転送するためにシステムコールを呼び出し、カーネルスペースとパケットをLinuxカーネルのネットワークサブシステムに渡します。すべてがネットワークカードにタスクを提供した後に終了しました。プロセスコンテキストと任意の瞬間スケジューラから実行されるこれらのすべてのステップは、プロセスを切り替えることができます。プロセスコンテキストから私のモジュールを使用するのは、次のような場合です。

softirqコンテキストから実行:ネットワークカードがパケットを受信すると、適切なsoftirqが実行されるようにハードウェア割り込みを生成します。そしてパケットはあるアプリケーションがそれを得るまでlinux(私のモジュールを含む)のネットワークサブシステムを通過します。これらのステップはsoftirqコンテキストから実行され、ハードウェア割り込みのみで中断される可能性がありますが、スケジューラ作業では中断されません。

質問は次のとおりです。コンテキストモジュールが実行されているモジュールでプログラムで決定する方法を教えてください。それはstruct task_structの何らかの要素でもよいし、いくつかのsyscallや他の何らかの要素でもよい。私は自分でそれを見つけることができませんでした。

答えて

0

割り込みのコンテキストで実行されているかどうかによって、関数の制御フローを依存するかどうかは、悪い習慣とみなされます。 Linuxカーネルの開発者(アンドリュー・モートン)から

Citation

我々はカーネルで使用一貫したパターンは、彼らは意志、発信者が必要に応じて、彼らは、スケジュールのコンテキストで実行されているとされているかどうかを追跡することですそれについてcalleesに知らせる。火事はそれ自体では機能しません。


しかし、現在のスケジューリングコンテキスト検出のためのlinux/preempt.hで定義されたいくつかの機能(マクロ)があります。in_atomic()in_interrupt()、。しかし、その使用法についてはthat LWN articleを参照してください。

+0

私が求めていることは、ありがとうございます。そして私のドライバでこのような機能が必要な理由:私は同期メカニズムに基づいてCryptoApiのドライバを書いています。ドライバがクエリを受け取ると、ワークキューメカニズムを使用してワークを作成し、「進行中のデータ処理」を意味する呼び出し先に特殊コードを返します。 Calleesはもちろん、データの暗号化/復号化が完了したときに行くコールバック関数を登録します。上記の作業は、データ処理のためのハードウェアへの割り当てを与える。私はプロセスがプロセスから来ている場合にコールコール関数の前にシステムにまだプロセスが存在するかどうかを知る必要があります。 – yankovic

+0

しかし、問い合わせがsoftirqから来たのであれば、私は存在チェックをスキップするか、まったく仕事をしない(CryptoApiの非同期メカニズムを使わないで)。 – yankovic

関連する問題