【发布时间】:2011-11-28 19:47:55
【问题描述】:
我需要分配具有大对齐(也可能在兆字节范围内)的大内存区域(兆字节)。 VirtualAlloc 系列函数似乎没有提供执行此操作的选项。
我在 Linux 上所做的就是映射一个更大的区域 - 足够大以保证其中包含一个具有所需对齐的足够大的区域 - 然后 munmap 开头和结尾的区域不需要的大区域。
例如,假设我需要 4 兆字节,在 1 兆字节边界上对齐(即区域的开头在最低 20 位中具有零)。我会映射 5 兆字节。假设我得到区域 0x44ff000-0x49ff000。在该区域内包含区域 0x4500000-0x4900000,它在 1 兆字节边界上对齐。然后我会 munmap 0x44ff000-0x4500000 和 0x4900000-0x49ff000。
我可以在 Win32 上做类似的事情吗?如果我将 VirtualProtect 与 PAGE_NOACCESS 一起使用,内存会被释放吗?有没有更好的解决方案?
【问题讨论】:
-
对虚拟内存有对齐要求是很奇怪的,这只对物理内存很重要。 Anyhoo,在 Windows 上是不行的。但这没关系,因为您只需要reserve 分配。提交是一个单独的步骤。也可以请求分配特定的快乐地址。使用 VirtualAlloc()。
标签: winapi memory-management virtual-memory memory-alignment