回答:
低レベル処理の高レベルのビューを次に示します。単純な典型的なアーキテクチャを説明していますが、実際のアーキテクチャは、このレベルの詳細では問題にならないほど複雑になるか、異なる場合があります。
ときに割り込みが発生した割り込みがマスクされている場合、プロセッサが見えます。それらがマスクされている場合、マスクが解除されるまで何も起こりません。割り込みがマスク解除されると、保留中の割り込みがある場合、プロセッサはそれを選択します。
次に、プロセッサはメモリ内の特定のアドレスに分岐して割り込みを実行します。そのアドレスのコードは、割り込みハンドラと呼ばれます。プロセッサがそこで分岐すると、割り込みをマスクし(したがって、割り込みハンドラが排他制御を持ちます)、いくつかのレジスタ(通常は他のレジスタ)の内容を保存します。
割り込みハンドラーは、通常、割り込みをトリガーした周辺機器と通信してデータを送受信することにより、必要な処理を行います。タイマーによって割り込みが発生した場合、ハンドラーはOSスケジューラーをトリガーして、別のスレッドに切り替えます。ハンドラーの実行が終了すると、特別な割り込みからの復帰命令が実行され、保存されたレジスターが復元され、割り込みのマスクが解除されます。
割り込みハンドラーは、他の割り込みの実行を妨げているため、迅速に実行する必要があります。Linuxカーネルでは、割り込み処理は2つの部分に分かれています。
このトピックに関する通常の詳細については、Linuxデバイスドライバーを参照してください。第10章は割り込みについてです。
ジルはすでに割り込みの一般的なケースについて説明しましたが、以下はIntelアーキテクチャ上のLinux 2.6に特に当てはまります(この一部はIntelの仕様にも基づいています)。
割り込みは、プロセッサによって実行される命令のシーケンスを変更するイベントです。
割り込みには2つの異なる種類があります。
例外は、カーネルで処理する必要があるプログラミングエラー(分割エラー、ページ違反、オーバーフロー)によって発生します。彼はプログラムに信号を送り、エラーからの回復を試みます。
次の2つの例外が分類されます。
割り込みは、I / Oデバイス(キーボード、ネットワークアダプタなど)、インターバルタイマー、および(マルチプロセッサシステム上で)他のCPUによって発行できます。割り込みが発生すると、CPUは現在の命令を停止し、新しく到着した割り込みを実行する必要があります。彼は、割り込みが処理された後に(おそらく)再開するために、中断された古いプロセス状態を保存する必要があります。
割り込みの処理は重要なタスクです。
2つの異なる割り込みレベルが定義されています。
すべてのハードウェアデバイスには、独自の割り込み要求(IRQ)行があります。IRQには0から始まる番号が付けられています。すべてのIRQラインはプログラマブル割り込みコントローラ(PIC)に接続されています。PICはIRQをリッスンし、それらをCPUに割り当てます。特定のIRQ行を無効にすることもできます。
最近のマルチプロセッシングLinuxシステムには一般に、IRQリクエストをCPU間で均等に分散する新しいAdvanced PIC(APIC)が含まれています。
割り込みまたは例外とその処理の中間段階は、割り込み記述子テーブル(IDT)です。このテーブルは、各割り込みまたは例外ベクトル(番号)を指定されたハンドラーに関連付けます(関数Divideエラーが処理されますdivide_error()
)。
カーネルはIDTを介して、発生した割り込みまたは例外の処理方法を正確に認識しています。
では、割り込みが発生するとカーネルは何をしますか?
VIP
はフラグレジスタの-flagに関係していますか?事前に感謝
割り込み処理に関与するすべての参加者の最初は、周辺ハードウェアデバイス、割り込みコントローラー、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.
はい!これらの特別な制御構造はどうなっているのだろう
理論的な観点から、ほとんどすべてが説明されています。ただし、カーネル割り込み処理コードフレームワークの説明を探している場合は、次のリンクを参照してください。 カーネル割り込み処理内のコードウォーク
割り込みと割り込みハンドラーに関する理論をまだ検討している場合は、これを読むことをお勧めします:割り込みと割り込みハンドラーについて