1

割り込みにより、CPU は EFLAGS、CS、および IP レジスタを「スタック」に保存し、iret 命令はそれらをスタックからポップします。このスタックはどこにありますか? CPUはそれをどのように認識していますか(どこかにレジスタがあると思います)?汚いディテールが欲しい。Unix ベースのシステムを見ています。Linux と言います。

4

3 に答える 3

3

まず、Intel のマニュアルで詳細を確認してください: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

あなたの質問について:

スタックはどこにありますか?

割り込み時に、x86 コアはタスク状態セグメント (TSS) からスタック ポインターを読み込みます。IDT は、タスク セレクター フィールドを介して使用する TSS を指定します。32 ビット モードでは、TSS は保護レベルごとに 1 つずつ、合計 4 つのスタック ポインターを提供します。保護レベルは通常 0 または 3 であるため、関連するスタックは 2 つだけです。64 ビット モードでは、割り込み記述子エントリは、指定された 64 ビット TSS 内で使用するスタック ポインターのインデックス 0 ~ 7 をオプションで指定できます。ただし、再入可能性の問題により、この 64 ビット スタック選択メカニズムはほとんど壊れており、OS はソフトウェア スイッチングに頼っています。x86 Programmer Reference Volume 3 の Figure 7-2 を参照してください。

割り込みがコアを高い特権レベル (数値的に低い CPL) に移動する場合、コアは割り込みスタック フレームを、中断されたプロセスの現在のスタックではなく、この新しいスタックにプッシュします。特権レベルが同じままである場合、コアは割り込みスタック フレームを現在のスタックにプッシュします。

CPUはそれをどのように認識していますか?

割り込み記述子テーブル (IDT) は、各割り込みベクトル (0 ~ 255) ごとに記述子を提供します。ディスクリプタ エントリは、どの TSS (つまりスタック) を使用するか、ユーザー モードがベクタを介して呼び出すことができるかどうか、ISR エントリで割り込みを無効にするかどうかなどをコアに通知します。PRM 第 3 巻の第 6 章を参照してください。したがって、すべての割り込み処理は実際にはIDT の情報によって固定されます。

于 2012-10-23T05:07:17.667 に答える
2

割り込みによってOSがEFLAGS、CS、およびIPを保存することはありません。CPUは、OSなしでこれを実行します。

最初のスタックは、リセット後にCPUで実行される最初のコードによってセットアップされます。通常、最初に実行するのはROMBIOSコードです。SSレジスタとSPレジスタを設定して、スタックの場所を示します。次に、スタックはブートローダーによって変更/移動され、通常はカーネルによって再度移動される可能性があります。

前述のコードがスタックを見つけたい場合は、十分なサイズの読み取りおよび書き込み可能なメモリがあれば、どこでも実行できます。

于 2012-10-22T17:52:49.270 に答える
1

SS:(E)SP - SS(スタック セグメント) SS は CPU 内部で使用可能な 16 ビット レジスタで、(E)SP は 16 (リアル モード)、32、64 ビット サイズ (プロテクト モード) です。

  1. 最初の BIOS POST で、有効な SS:(E)SP が BIOS によって設定されます。
  2. また、BIOS が MBR に制御を渡すと、MBR ブートローダー コードで、有効な SS:(E)SP 値をリセットおよび設定できます。
  3. プロテクト モードでは、セグメント CS、DS、SS を追加するために有効な GDT 値を設定する必要があります。その後、適切な値をセグメントにロードするのは CPU の責任であり、この OS は調整する必要があります。
于 2013-04-05T08:28:32.657 に答える