2

カーネルは常にリング 0 特権レベルで実行されると仮定します。スタック フォールト例外 (スタック オーバーフローまたは制限違反による) の場合、x86 IDT (割り込み記述子テーブル) のセットアップには、トラップ ゲート、割り込みゲート、およびタスク ゲートのうち、どのゲートを使用する必要がありますか?

X86 プロセッサでは、スタック フォールト例外ハンドラを呼び出す前に、スタックに eflags、CS、eip をプッシュするスタックが必要です。つまり、例外ハンドラを呼び出すために Stack スイッチが必要です。

スタック スイッチを実行する唯一の方法はタスク ゲートを使用することですか?

カーネル スタック フォールトのスタック フォールト ハンドラを作成する唯一の方法は、タスク ゲートを使用することですか?

インテルのマニュアルには次のように書かれています 。「新しい tss により、ハンドラーは例外または割り込みを処理するときに新しい特権レベル 0 スタックを使用できます。現在の特権レベル 0 スタックが破損しているときに例外または割り込みが発生した場合、タスク ゲートを介してハンドラーにアクセスすると、ハンドラーに新しい特権レベル 0 スタックを提供することで、システムのクラッシュを防ぎます。」

ご回答ありがとうございます。

4

1 に答える 1

1

私の知る限り、はい。それがどのように機能するか想像してみてください:

  1. スタックがオーバーフローします。
  2. GPF ハンドラーが呼び出されますが、R0 スタックが破損しているため、何もできません。
  3. プロセスは Double Fault ハンドラを呼び出そうとしますが、できません。
  4. プロセスはトリプルフォールトです。

TSS がある場合は、次の処理が行われます。

  1. スタックがオーバーフローします。
  2. プロセッサーが GPF ハンドラーを呼び出そうとすると、タスクスイッチが発生します。
  3. プロセッサはタスクを切り替え、新しいスタックを生成します。
  4. すべてが通常どおり続行されます。
于 2013-10-13T14:24:05.710 に答える