我正在使用Windows 7,64位应用程序。
成功进行大页面分配后,我正在尝试使用VirtualProtect将PAGE_GUARD保护标志设置为第一个大页面。 这是我正在使用的代码:
unsigned long long memSize = 1024*1024*1024;
char* data = (char*)VirtualAlloc(NULL, memSize, MEM_RESERVE|MEM_COMMIT|MEM_LARGE_PAGES, PAGE_READWRITE);
//make the first large page in the allocated buffer be a guard page
DWORD oldProtect;
SIZE_T pageSize = GetLargePageMinimum();
LPVOID startPtr = data;
bool res = VirtualProtect(startPtr, pageSize, PAGE_READWRITE | PAGE_GUARD, &oldProtect);
永久性地我收到以下错误: GetLastError()返回错误487 - “尝试访问无效地址。”
在为常规页面(4KB)分配和设置PAGE_GUARD保护时,一切正常。
大页面是否支持防护?如果是这样,我的代码出了什么问题?
提前致谢。
答案 0 :(得分:6)
大页面不支持防护。它没有明确记录,但可以推断出来。引用MSDN Large-Page Support:
内存始终是读/写且不可分页(始终驻留在物理内存中)。
PAGE_GUARD
通过在内部设置PAGE_NOACCESS,然后在读取或写入页面后将页面重置为所需的保护级别(作为NOACCESS,它将引发Windows内部处理的异常)。由于大页 必须 是可读/写的,因此系统无法按要求实现保护行为。
说实话,我不确定这是Windows本身的限制还是由于我们底层x86硬件的遗留限制。我认为如果是硬件限制,它可能是早期x86 / 32架构的限制。我很肯定它不再适用于任何现代x64架构。 (例如,较新的Linux内核可以透明地使用大页面而无需编程必须发出明确的请求)