Linuxでは割り込みはどのように処理されますか?


35

私はそれInterrupthardware signal assertionプロセッサのピンに原因があることを知っています。しかし、Linux OSがそれをどのように処理するかを知りたいです。
割り込みが発生すると何が起こりますか?


tldp.org/LDP/tlk/dd/interrupts.htmlは、あなたが尋ねた質問に関するすべてを説明しています
ジョン

回答:


40

低レベル処理の高レベルのビューを次に示します。単純な典型的なアーキテクチャを説明していますが、実際のアーキテクチャは、このレベルの詳細では問題にならないほど複雑になるか、異なる場合があります。

ときに割り込みが発生した割り込みがマスクされている場合、プロセッサが見えます。それらがマスクされている場合、マスクが解除されるまで何も起こりません。割り込みがマスク解除されると、保留中の割り込みがある場合、プロセッサはそれを選択します。

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

割り込みハンドラーは、通常、割り込みをトリガーした周辺機器と通信してデータを送受信することにより、必要な処理を行います。タイマーによって割り込みが発生した場合、ハンドラーはOSスケジューラーをトリガーして、別のスレッドに切り替えます。ハンドラーの実行が終了すると、特別な割り込みからの復帰命令が実行され、保存されたレジスターが復元され、割り込みのマスクが解除されます。

割り込みハンドラーは、他の割り込みの実行を妨げているため、迅速に実行する必要があります。Linuxカーネルでは、割り込み処理は2つの部分に分かれています。

  • 「上半分」は割り込みハンドラです。最低限必要なことを行い、通常はハードウェアと通信し、カーネルメモリのどこかにフラグを設定します。
  • 「下半分」は、プロセスメモリへのデータのコピー、カーネルデータ構造の更新など、他の必要な処理を行います。割り込みが有効になっているため、時間がかかり、システムの他の部分をブロックすることさえできます。

このトピックに関する通常の詳細については、Linuxデバイスドライバーを参照してください第10章は割り込みについてです。


22

ジルはすでに割り込みの一般的なケースについて説明しましたが、以下はIntelアーキテクチャ上のLinux 2.6に特に当てはまります(この一部はIntelの仕様にも基づいています)。

割り込みは、プロセッサによって実行される命令のシーケンスを変更するイベントです。
割り込みには2つの異なる種類があります。

  • 命令の処理中にCPUによって生成される同期割り込み(例外)
  • 他のハードウェアデバイスによって発行された非同期割り込み(割り込み)

例外は、カーネルで処理する必要があるプログラミングエラー(分割エラーページ違反オーバーフロー)によって発生します。彼はプログラムに信号を送り、エラーからの回復を試みます。

次の2つの例外が分類されます。

  • 異常状態の検出中にCPUによって生成されたプロセッサ検出例外。3つのグループに分け:障害は、一般的に修正することができ、トラップが実行を報告し、アボートは重大なエラーです。
  • プログラマーによって要求されたプログラムされた例外。トラップのように処理されます。

割り込みは、I / Oデバイス(キーボード、ネットワークアダプタなど)、インターバルタイマー、および(マルチプロセッサシステム上で)他のCPUによって発行できます。割り込みが発生すると、CPUは現在の命令を停止し、新しく到着した割り込みを実行する必要があります。彼は、割り込みが処理された後に(おそらく)再開するために、中断された古いプロセス状態を保存する必要があります。

割り込みの処理は重要なタスクです。

  • 割り込みはいつでも発生する可能性があり、カーネルはできるだけ早く割り込みを回避しようとします
  • 割り込みは別の割り込みによって割り込まれる可能性があります
  • カーネルには、まったく中断してはならない領域があります

2つの異なる割り込みレベルが定義されています。

  • I / Oデバイスによって発行されたマスク可能な割り込み。マスクされた状態とマスクされていない状態の2種類があります。マスクされていない割り込みのみが処理されます。
  • マスク不能割り込み。重大な誤動作(ハードウェア障害)。常にCPUによって処理されます。

すべてのハードウェアデバイスには、独自の割り込み要求(IRQ)行があります。IRQには0から始まる番号が付けられています。すべてのIRQラインはプログラマブル割り込みコントローラ(PIC)に接続されています。PICはIRQをリッスンし、それらをCPUに割り当てます。特定のIRQ行を無効にすることもできます。
最近のマルチプロセッシングLinuxシステムには一般に、IRQリクエストをCPU間で均等に分散する新しいAdvanced PIC(APIC)が含まれています。

割り込みまたは例外とその処理の中間段階は、割り込み記述子テーブル(IDT)です。このテーブルは、各割り込みまたは例外ベクトル(番号)を指定されたハンドラーに関連付けます(関数Divideエラーが処理されますdivide_error())。

カーネルはIDTを介して、発生した割り込みまたは例外の処理方法を正確に認識しています。


では、割り込みが発生するとカーネルは何をしますか?

  • CPUは、(A)PICからIRQがあるかどうかを各命令の後にチェックします
  • その場合、IDTに問い合わせて、受信したベクトルを関数にマッピングします
  • 割り込みが許可されたソースによって発行されたかどうかを確認します
  • 中断されたプロセスのレジスタを保存します
  • 対応する関数を呼び出して割り込みを処理します
  • 中断されたプロセスの最近保存されたレジスタをロードし、再開を試みます

「(A)PICからIRQがある場合、CPUは各命令の後にチェックします」を明確にできますか。それはどのように正確に起こりますか?それVIPはフラグレジスタの-flagに関係していますか?事前に感謝
red0ct

7

割り込み処理に関与するすべての参加者の最初は、周辺ハードウェアデバイス、割り込みコントローラー、CPU、オペレーティングシステムカーネル、およびドライバーです。周辺ハードウェアデバイスは、割り込みの生成を担当します。オペレーティングシステムカーネルからの注意が必要な場合、割り込み要求行をアサートします。これらの信号は、割り込み信号の収集を担当する割り込みコントローラーによって多重化されます。また、割り込み信号がCPUに渡される順序を決定します。割り込みコントローラーは、特定の割り込み要求行(IRQL)を一時的に無効にし、再度有効にする(IRQLマスキング)ことができます。割り込みコントローラは、収集した割り込み要求をCPUに順番に渡します。CPUは、各命令の実行が完了した後、CPUが割り込みコントローラーからの割り込み要求の待機をチェックします。CPUが待機中の要求があることを検出し、内部CPU制御レジスタに割り込み有効化フラグが設定されている場合、CPUは割り込み処理を開始します。ご覧のとおり、CPUの割り込みフラグを操作し、割り込みコントローラーと通信することで、Linuxカーネルは割り込みの受け入れを制御できます。たとえば、Linuxは特定のデバイスからの割り込みの受け入れを無効にしたり、割り込みの受け入れをまったく無効にしたりできます。Linuxカーネルは、割り込みの受け入れを制御できます。たとえば、Linuxは特定のデバイスからの割り込みの受け入れを無効にしたり、割り込みの受け入れをまったく無効にしたりできます。Linuxカーネルは、割り込みの受け入れを制御できます。たとえば、Linuxは特定のデバイスからの割り込みの受け入れを無効にしたり、割り込みの受け入れをまったく無効にしたりできます。

プロセッサが割り込み要求を受信するとどうなりますか?まず、CPUは割り込みフラグをリセットすることにより、割り込みを自動的に無効にします。割り込み処理が終了すると、それらは再び有効になります。同時に、CPUは、中断されたコードの実行を再開できるように、CPUをユーザーモードからカーネルモードに切り替えるために必要な最小限の作業を行います。CPUは、Linuxカーネルで満たされた特別なCPU制御構造と相談して、制御が渡されるコードのアドレスを見つけます。このアドレスは、Linuxカーネルの一部である割り込みハンドラーの最初の命令のアドレスです。

割り込み処理の最初のステップとして、カーネルは受信した割り込みのベクトルを識別し、システムで発生したイベントの種類を識別します。割り込みベクトルは、Linuxがそれを処理するために実行するアクションを定義します。2番目のステップとして、Linuxは残りのCPUレジスタ(CPUによって自動的に保存されなかった)を保存し、中断されたプログラムで使用できる可能性があります。これは非常に重要なアクションです。なぜなら、Linuxは割り込みプログラムを透過的に考慮して割り込みを処理できるからです。3番目のステップとして、Linuxは、カーネル環境を設定し、それに必要なCPU状態を設定することにより、カーネルモードへの切り替えを完了します。最後に、ベクトル依存の割り込みハンドラーが呼び出されます。(arch \ x86 \ kernel \ entry_32のBUILD_INTERRUPT3マクロを確認できます。S(x86アーキテクチャ関連の追加の詳細を取得する例)周辺機器の場合、これはdo_IRQ()ルーチンです。(arch \ x86 \ kernel \ irq.cを見てください)

通常、irq_enter()およびirq_exit()の呼び出しによってラップされたベクトル依存割り込みハンドラー。これらの関数のペアに囲まれたコード領域は、他のそのような領域に関してアトミックであり、cli / stiのペアに関してもアトミックです。Irq_enter()およびirq_exit()は、割り込み処理に関連するいくつかの統計もキャプチャします。最後に、カーネルはvector_irqテーブルを調べて、受信した割り込みのベクトルに割り当てられたirq番号を見つけ、handle_irq()を(arch \ x86 \ kernel \ irq_32.cから)呼び出します。

この時点で、カーネルはirq記述子の一部としてデバイスドライバーによってインストールされたデバイス依存の割り込みハンドラールーチンを見て、それを呼び出すため、Linuxの割り込み処理の一般的な部分は終了します。このようなハンドラーがドライバーによってインストールされていない場合、カーネルは割り込みコントローラーで割り込みを確認し、一般的な割り込みハンドラーを終了します。

割り込み処理カーネルの終了後、以前に中断されたプログラムの状態が復元され、このプログラムの実行が再開されます。


CPU consults with special CPU control structures filled by Linux kernel to find an address of code to which control will be passed.はい!これらの特別な制御構造はどうなっているのだろう
...-オートマトン

3

理論的な観点から、ほとんどすべてが説明されています。ただし、カーネル割り込み処理コードフレームワークの説明を探している場合は、次のリンクを参照してください。 カーネル割り込み処理内のコードウォーク

割り込みと割り込みハンドラーに関する理論をまだ検討している場合は、これを読むことをお勧めします:割り込みと割り込みハンドラーについて

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.