在MSDN中,我找到以下代碼:#MEMORY_BASIC_INFORMATION結構中的BaseAddress和AllocationBase有什麼區別?
BaseAddress - 指向頁面區域基址的指針。
AllocationBase - 指向由VirtualAlloc函數分配的一系列頁面的基地址的指針。 BaseAddress成員指向的頁面包含在此分配範圍內。
但我真的不明白什麼是差異。誰能告訴我區別? (不像在MSDN中:))
在MSDN中,我找到以下代碼:#MEMORY_BASIC_INFORMATION結構中的BaseAddress和AllocationBase有什麼區別?
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。