3

在今天的 x86-64 处理器中,可用地址空间为 48 位长,并被分成两半。一种是从 00000000`00000000 到 00007fff`ffffffff,另一种是从 ffff8000`00000000 到 ffffffff`ffffffff。

现在我正在编写一个程序来捕获内存访问冲突。这是我的代码。

UINT64 *Test1 = (UINT64 *) 0x0000000000000000;
UINT64 Test2;
AddVectoredExceptionHandler(TRUE,(PVECTORED_EXCEPTION_HANDLER)ExceptionHandler);
Test2 = *Test1;

ExceptionHandler是一个VEH 异常处理程序。我可以在ExceptionInfo -> ExceptionRecord ->ExceptionInformation[1] 中获取无法访问的地址(第二个数组元素指定了无法访问的数据的虚拟地址。(此处))。在这种情况下,它是 0,与 Test1 相同。

如果您尝试访问 00007fff`ffffffff 和 ffff8000`00000000 之间的任何地址,则 ExceptionInfo->ExceptionRecord->ExceptionInformation[1] 将为 -1。这并不出乎我的意料。但有趣的是,当我在 Test1 中输入 0x00007fffffffffff 时,我也得到了 -1。没多久我发现从00007fff`fffffff8到00007fff`ffffffff也返回-1,应该是系统中的合法地址。

有人可以向我解释一下吗?

4

0 回答 0