2

割り込み処理について読んだ(そして勉強した)。
私がいつも理解していないのは、割り込みハンドラーから(PC / IP)に戻る場所をどのように知るかです。
私が理解しているように:

  1. 割り込みはデバイス(キーボードなど)によって引き起こされます
  2. 関連するハンドラーは、実行中のプロセスの下で呼び出されます。つまり、OSへのコンテキストスイッチは実行されません。
  3. 割り込みハンドラーが終了し、実行中のアプリケーションに制御を戻します。

上記のプロセスは、割り込み処理についての私の理解であり、現在実行中のプロセスのコンテキスト内で実行されます。つまり、コンテキストスイッチではなく、メソッド呼び出しに似ています。
ただし、実際には割り込みハンドラーに対してCALLを実行しなかったため、現在のIPをスタックにプッシュする機会がありませんでした。
では、割り込みからジャンプして戻る場所をどのようにして知ることができますか。よくわかりません。

この質問に具体的に対処する優れたpdf/pptを単に指し示すワンライナーを含め、説明をいただければ幸いです。
[私は一般的にLinuxとCコードの下で上記のプロセスを参照していますが、すべての良い答えを歓迎します]

4

3 に答える 3

2

それはかなりアーキテクチャに依存しています。

Intelプロセッサでは、割り込みが発生すると、割り込みリターンアドレスがスタックにプッシュされます。命令を使用しiretて、割り込みコンテキストから戻ります。

ARMでは、割り込みによってプロセッサモードが(たとえば、、、、またはモードに)変更されINT、現在のCPSR(現在のプログラムステータスレジスタ)がSPSR(保存されたプログラムステータスレジスタ)に保存され、現在の実行アドレスが新しいモードのLR(リンクレジスタ)、そして適切な割り込みベクトルにジャンプします。したがって、割り込みからの復帰は、SPSRをCPSRに移動してから、LRに保存されているアドレスにジャンプすることによって行われます。通常は、または命令を使用して1つのステップで実行されます。FIQSVCsubsmovs

movs pc, lr
于 2012-02-27T22:55:47.863 に答える
1

割り込みがトリガーされると、CPUは、割り込みの前に実行されていたコードの命令ポインター(EIP)を含む、いくつかのレジスターをスタックにプッシュします。ISRの最後を入力してiretこれらの値をポップし、EIP(およびCS、EFLAGS、SS、ESP)を復元できます。

ちなみに、割り込みは必ずしもデバイスによってトリガーされるとは限りません。LinuxおよびDOSでは、ユーザースペースプログラムは(を介してint)割り込みを使用してシステムコールを実行します。一部のカーネルコードは割り込みを使用します。たとえば、シャットダウンを強制するために意図的にトリプルフォールトします。

于 2012-02-27T22:55:34.237 に答える
0

CPUの割り込みトリガーメカニズムは、(とりわけ)スタック上のリターンアドレスをプッシュします。

于 2012-02-27T22:52:27.613 に答える