【发布时间】:2021-04-30 19:06:35
【问题描述】:
我正在尝试查看在 Windows 中可以分配内存的最大地址。我通过使用GetSystemInfo 获得最大地址,然后尝试分配一个 4KB 页面。我注意到一些我以前从未见过的行为,我想知道是否有人可以解释为什么会发生这种情况。所以首先,这是我的测试代码:
SYSTEM_INFO info;
GetSystemInfo(&info);
PVOID base = (PUCHAR)info.lpMaximumApplicationAddress - info.dwPageSize;
SIZE_T size = info.dwPageSize;
LPVOID mem = VirtualAlloc(base, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
这是我注意到的几件事。
- 分配的大小实际上大于一页的4KB,它是64KB。为什么?
- 分配的基地址是
0x7ffffffe0000。分配大小为 64KB 时,结束地址为7fffffff0000,仅比最高用户地址多一个字节。这不是越界了吗?
我在 x64 Windows 上执行此操作。
如果我能理解为什么会发生这种情况,那就太好了。
【问题讨论】:
标签: c windows winapi virtual-memory