MEMORY_BASIC_INFORMATION结构中的BaseAddress和AllocationBase有什么区别?

在MSDN我find以下`

BaseAddress – 指向页面区域的基地址的指针。

AllocationBase – 指向由VirtualAlloc函数分配的一系列页面的基地址的指针。 BaseAddress成员指向的页面包含在此分配范围内。

但我不明白什么是真正的差异。 谁能告诉我的区别? (不喜欢在MSDN :))

Windows上的虚拟内存分配的粒度为64千字节,即SYSTEM_INFO.dwAllocationGranularity的值。 但虚拟内存页面是4096个字节,即SYSTEM_INFO.dwPageSize的值。

当您使用VirtualAlloc分配虚拟内存时,您总是会得到一个其BaseAddress等于AllocationBase的块。 但是,如果您随后更改此块中的一个或多个页面的页面保护,则可以观察到使用不同的BaseAddress进行细分的块。 最好用一个示例程序显示,在MSVC ++上运行:

#include "stdafx.h" #include <Windows.h> #include <stdio.h> #include <conio.h> void showmem(void* mem) { MEMORY_BASIC_INFORMATION info = {}; VirtualQuery(mem, &info, sizeof info); printf("Alloc = %p, base = %p, size = %d, protect = %d\n", info.AllocationBase, info.BaseAddress, info.RegionSize, info.Protect); } int main() { BYTE* mem = (BYTE*)VirtualAlloc(0, 65536, MEM_COMMIT, PAGE_READWRITE); printf("%s", "Initial allocation:\n"); showmem(mem); DWORD oldprotect; BOOL ok = VirtualProtect(mem + 4096, 4096, PAGE_NOACCESS, &oldprotect); printf("%s", "\nAfter protection changes:\n"); showmem(mem); showmem(mem + 4096); showmem(mem + 4096 + 4096); _getch(); return 0; } 

该程序的示例输出:

 Initial allocation: Alloc = 00ED0000, base = 00ED0000, size = 65536, protect = 4 After protection changes: Alloc = 00ED0000, base = 00ED0000, size = 4096, protect = 4 Alloc = 00ED0000, base = 00ED1000, size = 4096, protect = 1 Alloc = 00ED0000, base = 00ED2000, size = 57344, protect = 4 

并注意VirtualProtect()调用是如何将原始块分割成3个区域的,这些区域使用不同的BaseAddress,但使用相同的AllocationBase。