Winapi 大对齐的Win32内存分配

Winapi 大对齐的Win32内存分配,winapi,memory-management,virtual-memory,memory-alignment,Winapi,Memory Management,Virtual Memory,Memory Alignment,我需要分配具有大对齐的大内存区域(兆字节)(也可能在兆字节范围内)。VirtualAlloc函数系列似乎没有提供这样做的选项 为了实现这一点,我在Linux上所做的是mmap一个更大的区域-足够大以保证其中包含一个具有所需对齐的足够大的区域-然后在大区域的开始和结束处对不需要的区域进行munmap 例如,假设我需要4兆字节,在1兆字节的边界上对齐(即,区域的开始在最低的20位中有零)。我要mmap 5兆字节。假设我得到区域0x44ff000-0x49ff000。该区域内包含区域0x4500000

我需要分配具有大对齐的大内存区域(兆字节)(也可能在兆字节范围内)。VirtualAlloc函数系列似乎没有提供这样做的选项

为了实现这一点,我在Linux上所做的是mmap一个更大的区域-足够大以保证其中包含一个具有所需对齐的足够大的区域-然后在大区域的开始和结束处对不需要的区域进行munmap

例如,假设我需要4兆字节,在1兆字节的边界上对齐(即,区域的开始在最低的20位中有零)。我要mmap 5兆字节。假设我得到区域0x44ff000-0x49ff000。该区域内包含区域0x4500000-0x4900000,该区域在1MB边界上对齐。然后我将映射0x44ff000-0x4500000和0x4900000-0x49ff000


我可以在Win32上执行类似的操作吗?如果我在PAGE_NOACCESS中使用VirtualProtect,内存会被释放吗?有更好的解决方案吗?

是的,您可以使用相同的技术
VirtualAlloc
作为
MEM\u RESERVE
的一个大范围。找到适当对齐的子范围,并使用
MEM\u COMMIT
在子范围上再次调用
VirtualAlloc
,查看windows/MSVC crt中
\u aligned\u malloc
的源代码,使用相同的方法对齐虚拟内存非常简单,我甚至会说,只需替换其内部的
malloc
调用(与
\u aligned\u free
相同),这只允许使用单个系统调用进行分配


然而,为什么需要如此大规模的对齐?您是否试图滥用快速内存块板的地址位模式?

对虚拟内存有对齐要求是非常奇怪的,这只会影响物理内存。不管怎样,在Windows上没有办法。但这并不重要,因为你只需要保留分配。提交是一个单独的步骤。也可以请求分配特定的快乐地址。使用VirtualAlloc()。