私が知る限り、Linuxには「高速割り込み」があります。つまり、SA_INTERRUPTフラグで要求された高速割り込みは、現在のCPUで他のすべての割り込みが無効になっている状態で実行されます。しかし、一般的な割り込みハンドラの動作とどのように(そしてどこで)違いますか?
答え1
今日から基本的にflagについては忘れてもいいですSA_INTERRUPT
。
〜サイ2.6.182.6.24新しいフラグへの移行アシスタントですIRQF_DISABLED
。
2.6.24 すべてのSA_*
フラグを削除し、次に置き換えました。IRQF_*
バナー。
2.6.35 この「new」フラグを次のように表示します。廃止。
2.6.18以前のカーネルを使用している場合は、おそらく使用しないでしょう(Justinの答えを参照)。
IRQF_DISABLE
今日では、さまざまなアーキテクチャが異なって使用されています。 x86は依然として時間が重要な機能(time.c
、hpet.c
)、およびいくつかの操作にのみ使用しますxen
。
違いは、通常の割り込みは他の割り込み(プリエンプション)によって中断される可能性がありますが、「高速」割り込みは不可能であることです。
答え2
良い記事があります。ここ:
以前のバージョンのLinuxカーネルでは、「高速」割り込みと「遅い」割り込みを区別するのが困難になりました。高速割り込みは非常に迅速に処理できますが、遅い割り込みは処理に時間がかかります。遅い割り込みはプロセッサに非常に負担がかかる可能性があるため、割り込みを処理するときに割り込みを再度有効にすることをお勧めします。そうしないと、迅速な集中を必要とする作業が長く遅すぎる可能性があります。
最新のカーネルでは、高速割り込みと遅い割り込みの違いはほとんどなくなりました。 1つのケースだけが残ります。高速割り込み(SA_INTERRUPTフラグを使用して要求された割り込み)は、現在のプロセッサで他のすべての割り込みが無効になっている状態で実行されます。両方のプロセッサが同時に同じIRQを処理しているのを見ることはできませんが、他のプロセッサはまだ割り込みを処理できます。
もしそうなら、ドライバはどのタイプの割り込みを使うべきですか?最新のシステムでは、SA_INTERRUPT はタイマー割り込みなど、いくつかの特定の場合にのみ機能します。 SA_INTERRUPTは、他の割り込みが無効になっている間に割り込みハンドラを実行する理由がない限り使用しないでください。
したがって、唯一の違いは言及されています。高速割り込みハンドラは、パフォーマンスを向上させるために他のすべての割り込みハンドラが無効になっている状態で実行されます。
答え3
ARM Cortex A57を見ています。 ARMアーキテクチャでは、高速割り込みには8つの専用レジスタがあるため、割り込みが入ってくるとコンテキスト切り替え時間が最小限に抑えられます。私たちのSOCベンダーが提供するLinuxに統合されるのか、それともどのように統合されるのかはまだわかりません(最終的にそうすると仮定)。