《windows核心編程》告訴我們,對於每個應用程序的4G虛擬空間可以分為4個大塊:
0x0000 0000 ~ 0x0000 ffff:空指針賦值分區
0x0001 0000 ~ 0x7ffe ffff:用戶模式分區
0x7fff 0000 ~ 0x7fff ffff:64K禁入分區
0x8000 0000 ~ 0xffff ffff:內核模式分區
但是再要具體點就需要自己研究了。
咱就來看看一個應用程序是怎麼使用這4G的空間的 。先寫段代碼查詢一下這4G空間中內存塊的大致分類:
SYSTEM_INFO info;
MEMORY_BASIC_INFORMATION mi;
HANDLE hProcess;
DWORD dwAddr;
MEMORY_BASIC_INFORMATION miBlock[1000];
int nCount = 0;
hProcess = GetCurrentProcess();
GetSystemInfo(&info);
dwAddr = (DWORD) info.lpMinimumApplicationAddress;
do
{
VirtualQueryEx(hProcess, (LPCVOID) dwAddr, &mi, sizeof(mi));
memcpy(&miBlock[nCount++], &mi, sizeof(mi));
dwAddr += mi.RegionSize;
} while(dwAddr < (DWORD) info.lpMaximumApplicationAddress);
print_block_table(miBlock, nCount);
……
在這種方式下,將可以得到249個內存塊,如下表所示(所有值均為 十六進制):