将PAGE_GUARD保护设置为大页面

时间:2012-12-20 07:39:08

标签: c++ winapi

我正在使用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保护时,一切正常。

大页面是否支持防护?如果是这样,我的代码出了什么问题?

提前致谢。

1 个答案:

答案 0 :(得分:6)

大页面不支持防护。它没有明确记录,但可以推断出来。引用MSDN Large-Page Support

  

内存始终是读/写且不可分页(始终驻留在物理内存中)。

PAGE_GUARD通过在内部设置PAGE_NOACCESS,然后在读取或写入页面后将页面重置为所需的保护级别(作为NOACCESS,它将引发Windows内部处理的异常)。由于大页 必须 是可读/写的,因此系统无法按要求实现保护行为。

说实话,我不确定这是Windows本身的限制还是由于我们底层x86硬件的遗留限制。我认为如果是硬件限制,它可能是早期x86 / 32架构的限制。我很肯定它不再适用于任何现代x64架构。 (例如,较新的Linux内核可以透明地使用大页面而无需编程必须发出明确的请求)