現在の x86-64 プロセッサでは、使用可能なアドレス空間は 48 ビット長で、2 つの半分に分かれています。1 つは 00000000`00000000 から 00007fff`ffffffff まで、もう 1 つは ffff8000`00000000 から ffffffff`ffffffff までです。
現在、メモリアクセス違反をキャッチするプログラムを書いています。これが私のコードです。
UINT64 *Test1 = (UINT64 *) 0x0000000000000000;
UINT64 Test2;
AddVectoredExceptionHandler(TRUE,(PVECTORED_EXCEPTION_HANDLER)ExceptionHandler);
Test2 = *Test1;
ExceptionHandler
VEH 例外ハンドラです。ExceptionInfo -> ExceptionRecord ->ExceptionInformation[1] でアクセスできないアドレスを取得できます (2番目の配列要素は、アクセスできないデータの仮想アドレスを指定します。(ここ) )。この場合、Test1 と同じ 0 です。
00007fff`ffffffff から ffff8000`00000000 までのアドレスにアクセスしようとすると、ExceptionInfo->ExceptionRecord->ExceptionInformation[1] が -1 になります。これは私の予想外ではありません。しかし興味深いのは、Test1 に 0x00007ffffffffff を入力すると、-1 も得られたことです。00007fff`ffffffff8 から 00007fff`ffffffff までが -1 を返すことを見つけるのにそれほど時間はかかりませんでした。これは、システム内の正当なアドレスであるはずです。
誰かが私にこれを説明してもらえますか?