windows windows-7 process operating-system msdn

windows - ¿Cuál es la diferencia entre BaseAddress y AllocationBase en MEMORY_BASIC_INFORMATION struct?



windows-7 process (1)

Las asignaciones de memoria virtual en Windows se realizan con una granularidad de 64 kilobytes, el valor de SYSTEM_INFO.dwAllocationGranularity. Pero las páginas de memoria virtual tienen 4096 bytes, el valor de SYSTEM_INFO.dwPageSize.

Cuando asigna memoria virtual con VirtualAlloc, siempre obtendrá un trozo cuyo BaseAddress equivale a AllocationBase. Pero si luego modifica la protección de página de una o más de las páginas dentro de este fragmento, entonces puede observar que este fragmento está subdividido con una BaseAddress diferente. Se muestra mejor con un programa de ejemplo, ejecútelo en 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; }

Muestra de salida de este programa:

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

Y observe cómo la llamada VirtualProtect () requirió que el fragmento original se dividiera en 3 regiones con BaseAddress diferente pero con la misma AllocationBase.

En MSDN encuentro siguiente`

BaseAddress: un puntero a la dirección base de la región de páginas.

AllocationBase - Un puntero a la dirección base de un rango de páginas asignadas por la función VirtualAlloc. La página apuntada por el miembro BaseAddress está dentro de este rango de asignación.

Pero no entiendo qué es realmente la diferencia. ¿Alguien puede decirme la diferencia? (no como en MSDN :))