質問: linuxでは割り込みはどのように処理されますか? interruptがhardware signal assertionはプロセッサピンで発生しました。しかし、linux osがそれをどのように処理するかを知りたいのです。 割り込みが発生したときに何が起こるのですか?
回答: gillesはすでに 説明 割り込みの一般的なケースです。以下は、特にintelアーキテクチャ上のlinux 2.6に適用されます(これの一部もintelの仕様に基づいています)。割り込みは、プロセッサによって実行される命令のシーケンスを変更するイベントです。 2種類の割り込みがあります。 cpuが命令の処理中に生成する同期割り込み(例外) 他のハードウェアデバイスによって発行された非同期割り込み(interrupt) 例外はプログラミングエラー(fedivide error、page fault、overflow)カーネルで処理する必要があります。彼はプログラムにシグナルを送り、エラーからの回復を試みます。次の2つの例外が分類されます。 異常な状態を検出している間にcpuによって生成されたプロセッサ検出例外; 3つのグループに分けられます:障害は一般に修正できます、トラップは実行を報告します、中止重大なエラーです。 プログラマーによって要求されたプログラムされた例外、トラップのように処理されます。 割り込みは、i/oデバイス(キーボード、ネットワークアダプターなど)、インターバルタイマー、および(マルチプロセッサシステムでは)他のcpuから発行できます。割り込みが発生すると、cpuは現在の命令を停止し、新しく到着した割り込みを実行する必要があります。彼は、割り込みが処理された後に(おそらく)再開するために、古い割り込みプロセス状態を保存する必要があります。割り込みの処理は重要なタスクです。 割り込みはいつでも発生する可能性があり、カーネルはできるだけ早くそれを邪魔にならないようにします 割り込みは別の割り込みによって割り込まれることができます カーネルにはまったく中断してはならない領域があります 2つの異なる割り込みレベルが定義されています。 i/oデバイスによって発行されたマスク可能な割り込み;マスクまたは非マスクの2つの状態があります。マスクされていない割り込みのみが処理されます。 マスクできない割り込み;重大な誤動作(ハードウェア障害など)。常にcpuによって処理されます。 すべてのハードウェアデバイスには、独自の割り込み要求(irq)ラインがあります。 irqには0から始まる番号が付けられています。すべてのirqラインは、プログラマブル割り込みコントローラー(pic)に接続されています。 picはirqをリッスンし、それらをcpuに割り当てます。特定のirqラインを無効にすることもできます。 最新のマルチプロセッシングlinuxシステムには、通常、新しいadvanced pic(apic)が含まれており、cpu間でirq要求を均等に分散します。割り込みまたは例外とその処理の間の中間ステップは、割り込み記述子テーブル(idt)です。このテーブルは、各割り込みまたは例外ベクトル(数値)を指定されたハンドラーに関連付けます(つまり、divide errorは関数divide_error()によって処理されます)。カーネルはidtを介して、発生した割り込みまたは例外の処理方法を正確に把握しています。では、割り込みが発生するとカーネルは何をするのでしょうか? cpuは、各命令の後に(a)picからのirqがあるかどうかをチェックします その場合、idtに問い合わせて、受信したベクトルを関数にマッピングします。 許可されたソースによって割り込みが発行されたかどうかを確認します 中断されたプロセスのレジスタを保存します 割り込みを処理するために対応する関数を呼び出します 中断されたプロセスの最近保存されたレジスタをロードし、再開を試みます