アドレス 0xdf3251 で命令を実行しようとしたが、その場所は読み取り可能で実行可能なメモリ ページ (おそらく完全にマップされていない) によってバックアップされていなかったと思います。
その場合、例外 (実際にはページ フォールト) はその命令から発生し、例外ハンドラーはスタック上にそのアドレスを持っています (例外が何らかの形で解決され、エラーが発生した命令が再開された場合に戻る場所)。ハンドラが返されます)。そして、それはあなたが見ている最初の住所です。
ページ フォールト ハンドラーが読み取るレジスタ( CR2
2 番目に表示されているアドレス) にも同じアドレスが含まれています。
- マッピングの完全な欠如 (マッピングされたページはまったくありません)
- 書き込み権限の欠如 (ページは読み取り専用です)
- 実行権限がない (ページに非実行ビットが設定されている) または
- カーネル特権の欠如 (ページはカーネルでのみアクセス可能としてマークされています)
データアクセス中か命令のフェッチ中かは関係ありません (後者が今回のケースです)。
これが、命令とメモリアクセスアドレスを等しくする方法です。
ほとんどの場合、コードにバグがあり、メモリが破損し、一部のポインタ (またはスタックの戻りアドレス) が、アクセスできないメモリ位置を指す偽の値で上書きされました。そして、何らかの方法で CPU がそこで実行を継続するように指示されました (ほとんどの場合、これらの命令のいずれかを使用します: jmp
、call
、ret
)。どこかで競合状態になる可能性もあります。