x86 で一般保護違反 (GP#13) の ISR を作成しようとしています。例外の原因となっている障害のあるアドレスを見つける方法について、インテルのドキュメントからはわかりません。ページ フォールト例外 (GP#14) の場合、cr2 レジスタがフォールト アドレスを保持していることを知っています。どんな助けでも大歓迎です。
1 に答える
ここでの参照はすべてAMD64 Architecture Programmer's Manual Volume 2: System Programmingからのもので、従来の保護モード (x86) の動作についても説明しています。
240 ページの図 8-8 は、同じ特権レベルへの割り込み後のスタック レイアウト (つまり、ISR に入ったときのスタック レイアウト) を示しています。
#GP
セクション 8.2.14 では、 がエラー コードを提供していることがわかります。また、次の点も重要です。
プログラムの再起動。
#GP
障害タイプの例外です。ほとんどの場合、保存された命令ポインターは、エラーの原因となった命令を指してい#GP
ます。タスク切り替え中にこの例外が発生した場合の結果については、230 ページの「タスク切り替え中の例外」を参照してください。
参照されているセクションでは、次のことが言及されています。
セグメント セレクターのロード中のタスク切り替え中に例外が発生する可能性があります。ページ フォールトは、TSS へのアクセス時にも発生する可能性があります。このような場合、ハードウェア タスク切り替えメカニズムは、TSS からの新しいタスク状態の読み込みを完了し、適切な例外メカニズムをトリガーします。他のチェックは実行されません。これが発生すると、保存された命令ポインタは新しいタスクの最初の命令を指します。
そのため、ハードウェア タスクの切り替えを使用していない限り、保存された命令ポインターは常に障害のある命令を指します。
障害のある命令のアドレスを取得するには、ISR のスタックから保存された値EIP
と値を取得するだけです。CS
(フラット メモリ モデルを使用していて、すべてのセグメントが 4GB 全体をカバーしているCS
場合、もちろん、保存されたものは重要ではありません)。
movl 4(%esp), %eax
movw 8(%esp), %ebx
現在、保存されたと保存さEAX
れた が含まれています。EIP
EBX
CS
編集:もちろん、コメントでアレックスが指摘したように、メモリアクセスが原因でアクセスされたメモリのアドレスが必要な場合は、障害のある命令をデコードする必要があります。#GP