gpt4 book ai didi

c++ - 将 PAGE_GUARD 保护设置为大页面

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:51 26 4
gpt4 key购买 nike

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

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

提前致谢。

最佳答案

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

The memory is always read/write and nonpageable (always resident in physical memory).

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

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

关于c++ - 将 PAGE_GUARD 保护设置为大页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13967332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com