2013-10-19 6 views
7

W witrynie MSDN znajduje się następująca `Jaka jest różnica między BaseAddress i AllocationBase w MEMORY_BASIC_INFORMATION struct?

BaseAddress - Wskaźnik adresu bazowego regionu stron.

AllocationBase - Wskaźnik do adresu bazowego zakresu stron przydzielonych przez funkcję VirtualAlloc. Strona wskazywana przez element BaseAddress jest zawarta w tym zakresie alokacji.

Ale nie rozumiem, czym naprawdę jest różnica. Czy ktoś może mi powiedzieć różnicę? (nie jak w MSDN :))

Odpowiedz

14

Alokacje pamięci wirtualnej w systemie Windows są wykonywane z ziarnistością 64 kilobajtów, o wartości SYSTEM_INFO.dwAllocationGranularity. Ale strony pamięci wirtualnej to 4096 bajtów, czyli wartość SYSTEM_INFO.dwPageSize.

Po przydzieleniu pamięci wirtualnej za pomocą VirtualAlloc, zawsze otrzymasz fragment, którego adres podstawowy jest równy Podstawy Allocation. Ale jeśli zmienisz ochronę strony na jednej lub więcej stron w tym kawałku, możesz zauważyć, że ten fragment jest podzielony na inny adres bazowy. Najlepiej pokazany przykładowy program, należy uruchomić to na 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; 
} 

Przykładowe wyjście tego programu:

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 

I pamiętać, w jaki sposób wymagany oryginalny kawałek przycisk() wezwanie VirtualProtect być podzielone na 3 regiony z innym adresem BaseAddress, ale z tą samą AllocationBase.

Powiązane problemy