Linuxで割り込みを処理する方法は?

Linuxで割り込みを処理する方法は?

私が知っているすべては、それがプロセッサピンであるInterruptことだけです。hardware signal assertionしかし、Linuxオペレーティングシステムがこれをどのように処理するかを知りたいです。
中断が発生した場合はどうなりますか?

ベストアンサー1

これは、低レベルの処理のための高レベルのビューです。私は単純で一般的なアーキテクチャを説明しています。実際のアーキテクチャはより複雑であるか、いくつかの点で異なる場合がありますが、この程度の詳細レベルでは問題にはなりません。

いつ邪魔するこれが発生すると、プロセッサは割り込みがマスクされていることを確認します。もしそうなら、マスクが剥がれるまでは何も起こりません。割り込みがマスクされていない場合、プロセッサは保留中の割り込みがある場合は1つを選択します。

その後、プロセッサはメモリの特定のアドレスに分岐して割り込みを実行します。そのアドレスのコードは次のとおりです。割り込みハンドラ。プロセッサがそこから分岐すると、割り込みをマスクし(割り込みハンドラが排他制御を持つ)、いくつかのレジスタの内容をどこか(通常は他のレジスタ)に格納します。

割り込みハンドラは通常、データを送受信するために割り込みをトリガした周辺機器と通信して実行する必要があるタスクを実行します。タイマーによって割り込みが発生すると、ハンドラはオペレーティングシステムスケジューラを起動して他のスレッドに切り替えることができます。ハンドラは、実行が完了すると、保存されたレジスタを復元し、割り込みマスクを解放する特別な割り込み戻りコマンドを実行します。

割り込みハンドラは他の割り込みが実行されるのを防ぎ、すばやく実行する必要があります。 Linuxカーネルでは、割り込み処理は2つの部分に分けられます。

  • 「上半分」は割り込みハンドラです。これは通常、ハードウェアと通信し、カーネルメモリのどこかにフラグを設定するなど、必要な最小限の作業を実行します。
  • 「サブハーフ」は、プロセスメモリへのデータのコピー、カーネルデータ構造の更新などの他の必要な処理を実行する。割り込みが有効な状態で実行されているため、時間がかかる可能性があり、システムの他の部分を待つのが中断される可能性があります。

いつものように、このトピックの詳細については、以下をお読みください。Linuxデバイスドライバ;第10章中断についてです。

おすすめ記事