web-dev-qa-db-ja.com

CPUがOS理論で割り込みの原因を見つける方法を誰かが私に説明できますか?

私は現在、オペレーティングシステム理論のモジュールを行っていますが、理解できない概念がいくつかあります。これは、質問をするのに適切な場所でしょうか。

私の主な質問は割り込みについてです。 CPUが割り込みが発生したことを検出すると、この割り込みがどこで発生したかを知る必要があることを理解しています。私の理解は次のとおりですが、これが正しいかどうか誰かに教えてもらえますか、そして私の知識のいくつかのギャップを説明できますか?

CPUが割り込みの発生場所を検出するために、すべてのオブジェクトにクエリを実行してソースを特定できますが、これらのI/Oベースの質問には長い時間がかかります。代わりに、割り込みサイクルを使用し、データバス上の割り込み識別子を期待します。 8ビットデータバスの場合、256の割り込みレベル(つまり2 ^ 8)があります。 (これはなぜですか?)

したがって、割り込みサービスルーチン(ISR)は、考えられるすべての割り込みレベルに対して書き込まれ、プロセッサによって標準化された固定位置(割り込みベクトル)のテーブルに格納されます。私のメモには、「住所を取得する前に場所を知っている必要があります」と書かれています(これはどういう意味ですか?)

割り込みサイクルの一部として受信された割り込みレベル識別子は、割り込みベクトルへのインデックスとして使用されます(誰かがこれを少し分解できますか?)。私の理解では、値、つまり割り込みレベル識別子がCPUに渡され、割り込みベクトルを指すために使用されます。

また、割り込みが「処理された」と言われるとはどういう意味ですか?

どうもありがとうございました、そして長い段落をお詫び申し上げます、私はこれの多くの側面に少し混乱しています!

5
user54094

割り込みが「処理された」と言われるとはどういう意味ですか?

割り込みを要求するものが処理されるとき、それは「サービス済み」と呼ばれます。これは、キーボードから次の文字を読み取るか、イーサネットカードから次のデータパケットを送信するのと同じくらい簡単です。一部の割り込みは他の割り込みよりも重要であるため、それらに優先順位を付ける機能があります。

役立つ記事が見つかります ここ

割り込みサイクルの一部として受信した割り込みレベル識別子は、割り込みベクトルへのインデックスとして使用されます

おっしゃるように、割り込みが発生すると、CPUは基本的に「誰がやったの?」と尋ねました。割り込みデバイスは、その割り込み識別子をデータバスに配置します。次に、CPUはこの番号を取得し、ISRのテーブルを調べて、実行をハンドラーに転送します。

割り込みは、現在のプログラムを一時停止し、割り込みサービスルーチン(ISR)と呼ばれる新しいプログラムに制御を移すというプロセッサの要求です。最大速度用に設計された特別なハードウェアメカニズムにより、転送が強制されます。 ISRは、割り込みの原因を特定し、適切なアクションを実行してから、中断されていた元のプロセスに制御を戻します。

4
Tangurena

代わりに、割り込みサイクルを使用し、データバス上の割り込み識別子を期待します。 8ビットデータバスの場合、256の割り込みレベル(つまり2 ^ 8)があります。 (どうしてこれなの?)

これを行う代わりに、サポートするIRQタイプまたはレベルごとにCPUにピンを設定することもできます。 68000はこれを行い、IRQレベル0(NMI)から7までを表現できる3つの割り込みピンを備えていました。IntelCPUには1つのIRQピンしかなく、バス上のアドレス(PICと呼ばれる中間デバイスによって提供される)がタイプ(Intelでは、この「アドレス」、実際にはインデックスはレジスタに直接入ります。一部のPICは、実際にCPUに直接行くアドレスを指示できます)。

それらには別個のNMIピンがあると思います(SMI、IPIなどの独自のピンを持つ他の割り込みがあり、リセットは一種の割り込みです)。

したがって、割り込みサービスルーチン(ISR)は、考えられるすべての割り込みレベルに対して書き込まれ、プロセッサによって標準化された固定位置(割り込みベクトル)のテーブルに格納されます。

256個のISRを作成する必要はありません。事実上無視して、単に「割り込みから戻る」「スタブ」を作成できます。

私のメモには、「住所を取得する前に場所を知っている必要があります」と書かれています(これはどういう意味ですか?)

少しあいまいです。ベクトルテーブルのベースアドレスを知る必要があるのか​​、関係するIRQ番号がわからない場合はISRのアドレスがわからないと言っているだけなのかわかりません。

割り込みサイクルの一部として受信された割り込みレベル識別子は、割り込みベクトルへのインデックスとして使用されます(誰かがこれを少し分解できますか?)。

PICはデバイスからIRQを受信します。このデバイスは、IRQ#3をトリガーするように設定されています。 CPUは、PICからIRQを受信すると、バス上の3を確認し、ローカルIRQベクトルテーブルのインデックス3のアドレスにジャンプします。

私の理解では、値、つまり割り込みレベル識別子がCPUに渡され、割り込みベクトルを指すために使用されます。

正しい。

また、割り込みが「処理された」と言われるとはどういう意味ですか?

通常、CPUが割り込みを処理している間はCPUに割り込みをかけたくないでしょう。 CPUとCPU + PICの組み合わせは、IRQの受信後に割り込みを無効にするためにさまざまなことを行います。したがって、処理が完了したら「発表」する必要があります。 Intelでは、システムの割り込みイネーブルビットを再度有効にして、IRQのサービスが完了したことをPICに通知する必要があります。 PICは、CPUが完了したことを通知するまで、さらにIRQを「保留」します。

簡単にするために、また上記のいずれかを研究してから長い時間が経過しているため、上記の詳細をいくつか省略しましたが、お役に立てば幸いです。

2
LawrenceC