在今天的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 exception handler。我可以在ExceptionInfo - > ExceptionRecord - > ExceptionInformation [1]中获取无法访问的地址(第二个数组元素指定无法访问的数据的虚拟地址。(Here ))。在这种情况下,它是0,与Test1相同。
如果您尝试访问00007fff`ffffffff和ffff8000`00000000之间的任何地址,ExceptionInfo-> ExceptionRecord-> ExceptionInformation [1]将为-1。这不符合我的期望。但有趣的是,当我在Test1中推出0x00007fffffffffff时,我也得到了-1。我花了很长时间才发现从00007fff`fffffff8到00007fff`ffffffff也返回-1,这应该是系统中的合法地址。
有人可以向我解释一下吗?