2

次の x86 命令は、トリプル フォールト例外 (CPU リセット) を引き起こしています。理由はありますか?

0042F94B  F20F100520E44300  movsd xmm0,qword [dword 0x43e420]

次のコードは、その命令の直前に挿入され、0x43e420 のメモリにアクセスできる (アクセスできる) ことを確認します。

0042F945  8B0520E44300      mov eax,[dword 0x43e420]

X86 は保護モードです。GDT は適切にセットアップされ、セグメント レジスタは 0x8 である cs を除いてすべて 0x10 です。どちらの GDT エントリもフラットで、32 ビット メモリ空間全体を使い果たします。eflags のアライメント チェック (AC) が設定されていません。

0x43e420 のメモリは次のとおりです。

0x43e420: 00 00 00 00 00 00 00 40

その命令が実行されると、Bochs エミュレーターは次のメッセージを出力します。

interrupt(): gate.type(9) != {5,6,7,14,15}    
interrupt(): gate descriptor is not valid sys seg (vector=0x0d)
interrupt(): gate descriptor is not valid sys seg (vector=0x08)

これは OS ブート コードの一部です。オペレーティング システムのアプリケーションではありません。

4

2 に答える 2

6

提供された情報から、お使いのプロセッサで SSE 命令が有効になっていないと思われます。有効にしないと、それらを使用すると例外が発生します (ベクター 19 だと思います)。さらに、このベクトルが適切に初期化されていない場合は、確実にトリプル フォールトが発生することがわかります。

プロセッサ SSE 命令を有効にする方法の詳細については、64-ia-32-architectures ソフトウェア開発マニュアルの第 3 巻、第 13 章を参照してください。

お役に立てれば。

于 2013-08-23T00:21:33.053 に答える
2

アドレスが整列されており、ブート コードを使用していることを考えると、最初の例外の最も可能性の高い説明は、ブートのその時点でまだ SSE が有効になっていないことです。なぜその例外がトリプル フォールトにつながるのかは微妙な問題ですが、おそらくそれを処理するためのベクトルを設定していません。

于 2013-08-23T00:20:11.857 に答える