Linuxデバイスドライバの割り込みソフト

現在、唯一の2つのサブシステム(ネットワークおよびSCSI)を直接ソフト割り込みを使用して;ソフト割り込みは、下半分のタイムクリティカルかつ最も重要な使用のシステム用に予約されているほかに、カーネルのタイマーとソフト割り込みタスクレットが基づいています ;ソフト割り込みを使用する前に、タスクレットを使用することはできませんなぜ、我々が最初に決定する必要があり、タスクレットを動的に生成することができ、かつ性能も良いですが、また非常に使いやすいです、ロックを要求しません。もちろん、時間と厳格な要件を効率的に自分自身を完了することができますロックの仕事は、ソフト割り込みは正しい選択です。

割り当てインデックス

コンパイル時に、宣言ソフト割り込みに静的には<linux / interrupt.h>に列挙型を定義することにより、カーネルは、ソフト割り込みインデックスの多数の前に行わ小さなソフト割り込みの優先度を表すために、これらのインデックスを使用します;

ソフト割り込みの新しいタイプの設立は、この列挙は新しい項目を追加する必要があり、加盟時に、ない他の場所と同様に、簡単な項目の最後には、リストに追加され、逆に、参加することを決定するために彼女の願いに応じて優先順位を与えられなければなりません位置、新しいアイテムがBLOCK_SOFTIRQとTASKLET_IRQの間に挿入することができ、通常は最初のが、最後のものとしてRCU_SOFTIRQとして慣用、HI_SOFTIRQ。

1つの 列挙
2  {
 3      = HI_SOFTIRQ 0 4      TIMER_SOFTIRQ、
 5      NET_TX_SOFTIRQ、
 6      NET_RX_SOFTIRQ、
 7      BLOCK_SOFTIRQ、
 8      IRQ_POLL_SOFTIRQ、
 9      TASKLET_SOFTIRQ、
 10      SCHED_SOFTIRQ、
 11      HRTIMER_SOFTIRQ、/ * 未使用、しかしツールが依存として保存
 12                  ナンバリング。はぁ!* / 
13      RCU_SOFTIRQ、     / * 好ましくRCUは、常に最後のsoftirqなければならない* / 
14  
15     NR_SOFTIRQS
 16 }。
登録されたハンドラ

実行時に、ソフト割り込みハンドラを登録する)(open_softirq呼び出すことで、この関数は2つのパラメータを取ります:インデックス番号とソフト割り込みハンドラを。

1  無効 open_softirq(int型の NR、無効(*アクション)(構造体 softirq_action *));

次のように登録されたネットワークサブシステムが中断しました:

1  open_softirq(NET_TX_SOFTIRQ、net_tx_action)。
2 open_softirq(NET_RX_SOFTIRQ、net_rx_action)。
1  open_softirq(NET_TX_SOFTIRQ、net_tx_action)。
2 open_softirq(NET_RX_SOFTIRQ、net_rx_action)。

ハンドラはハンドル割り込みが無効になっている上、現在のソフトウェアを実行している場合;しかし、他のプロセッサにさらに他のソフト割り込みを行うことができます。同じ場合はソフト割り込みハンドラが実行されると、確認応答が有効になっているが、彼は眠ることができなかった割り込みますこれは、任意の共有データは、厳格なロック保護が必要であることを意味し;これは、タスクレットがより好まれる理由です。ほとんどのソフト、それが再度トリガが実行されると同時に、その後、他の1つのプロセッサが同時にそのハンドラを実行することができ、割り込みソフトウェア割り込みハンドラは、より良好な性能を得る、単一のプロセッサまたは他の技術を使用して明示的なデータを回避するためにロックされています。

主な理由は、そのスケーラビリティをソフト割り込みの導入である。いや、それから、タスクレットを使用するには良い選択である場合は、複数のプロセッサに拡張し、また、本質的にタスクレットソフト割り込みが、同じハンドラの複数のインスタンスにすることはできません複数のプロセッサ上で実行します。

ソフト割り込みトリガ

)列挙型のリストに次の新しいアイテムを追加し、そして(open_softirq呼び出しによって登録された、新しいソフト割り込みハンドラが実行できるようになります。raise_softirq()関数は、そう、ソフト割り込み保留状態に設定することができます操作に入れ、次のコールdo_softirq()関数です。

その後、最初のraise_softirq()関数の前に解禁とソフト割り込みを起動して、トリガ後に元の状態を復元する。禁止されていたであろう、中断場合、あなたは(raise_softirq_irqoffを呼び出すことができます)関数は、いくつかの最適化の結果をもたらすでしょう。

1  ボイド raise_softirq_irqoff(符号なしint型NR);
2  ボイド raise_softirq(符号なしint型 NR);

 

直ちに、割り込みハンドラを実行した後、コア、ソフト割り込みは、最も一般的な形態であり、この場合には、割込みハンドラは、ハードウェアデバイスに関連する操作を実行し、対応するソフト割り込みをトリガし、そして最終的に終了し、割り込みハンドラ内でトリガされそれはdo_softirq()関数を呼び出します。そのソフト割り込みは、割り込みハンドラの実行を開始し、残りのタスクを完了するためにそれを残しました。

 

おすすめ

転載: www.cnblogs.com/wanpengcoder/p/11761772.html