4

我正在开发 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 保护时一切正常。

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

提前致谢。

4

1 回答 1

6

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

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

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

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

于 2013-01-01T00:22:43.870 回答