windows記憶體管理和API函式

whatday發表於2013-04-08

windows記憶體管理知識:
1.分段或分頁記憶體管理
2.實體地址和虛擬地址,虛擬地址空間.
3.虛擬記憶體佈局,記憶體分工,堆,棧.
4.記憶體存取許可權.
5.標準C記憶體管理函式與windows記憶體管理API的關係.

記憶體保護屬性和存取許可權
屬性常量       意義
PAGE_EXECUTE      可執行
PAGE_EXECUTE_READ    可讀,可執行
PAGE_EXECUTE_READWRITE 可讀,可寫,可執行
PAGE_EXECUTE_WRITECOPY 可讀,可寫,可執行,以Read-on-write和copy-on-write方式共享
PAGE_NOACCESS           不可訪問
PAGE_READONLY           只讀
PAGE_READWRITE          可讀,可寫
PAGE_WRITECOPY          copy-on-write保護機制
PAGE_GUARD              保護,如果訪問則異常(不能單獨使用)
PAGE_NOCACHE            不進行CPU快取(不能單獨使用)
PAGE_WRITECOMBINE       write-combined優化(不能單獨使用)

堆管理API
HeapCreate   為程式建立一個堆,返回一個堆控制程式碼
GetProcessHeap 獲取當前程式中的一個堆
HeapAlloc   從指定堆上分配記憶體塊
HeapReAlloc     重新分配記憶體,改變已經分配好的堆記憶體塊大小
GetSystemInfo 獲取系統資訊
HeapSize     獲取指定堆大小,以位元組為單位返回堆大小資訊
HeapFree   釋放HeapAlloc和HeapReAlloc所分配的記憶體
HeapDestroy   銷燬由HeapCreate建立的堆

全域性和區域性記憶體管理API函式
GlobalAlloc   在預設堆上分配指定屬性的大小的記憶體
GlobalFree   釋放由GlobalAlloc分配的記憶體
GlobalReAlloc 重新分配記憶體,改變已經分配好的記憶體塊大小
GlobalLock   將GlobalAlloc及GlobalReAlloc分配屬性為GMEM_MOVEABLE記憶體塊設為固定
GlobalHandle 與GlobalLock相對
GlobalSize   獲取記憶體大小

虛擬記憶體管理API函式
VirtualAlloc "保留"或"提交"記憶體頁面,將"空閒的"記憶體頁面變為"保留的"或"已經提交的",保留的改為已提交的
VirtualAllocEx 類似VirtualAlloc功能,不過可以為其他程式分配記憶體
VirtualFree   將記憶體狀態從"已經提交的"變為"保留的"
VirtualFreeEx 釋放VirtualAllocEx分配的記憶體,功能,使用方法和VirtualFree類似
VirtualProtect 改變指定虛擬記憶體分頁的保護屬性

記憶體操作與記憶體資訊管理API函式
CopyMemory            複製記憶體,第一個引數為目的地址,第二個引數為源地址,第三個引數為複製資料大小
FillMemory            填充記憶體,將一段記憶體填充為同一個值
MoveMemory            功能和CopyMemory類似,不同的是源地址和目的地址可以相同
ZeroMemory            將指定記憶體區域清零
GlobalMemoryStatusEx   用於獲取系統當前記憶體使用情況
IsBadCodePtr     判斷呼叫程式是否擁有對指定地址記憶體的讀操作許可權
IsBadReadPtr     判斷呼叫程式是否有對指定地址段記憶體的讀操作許可權
ISBadStringPtr     判斷呼叫程式是否擁有對字串指標的讀取許可權
IsBadWritePtr          判斷呼叫程式是否擁有對指定地址段記憶體的寫操作許可權

HeapCreate:
The HeapCreate function creates a heap object that can be used by the calling process. The function reserves space in the virtual address space of the process and allocates physical storage for a specified initial portion of this block.

GlobalAlloc:
The GlobalAlloc function allocates the specified number of bytes from the heap. Win32 memory management does not provide a separate local heap and global heap.
This function is provided only for compatibility with 16-bit versions of Windows.

VirtualAlloc:
The VirtualAlloc function reserves or commits a region of pages in the virtual address space of the calling process. Memory allocated by this function is automatically initialized to zero, unless the MEM_RESET flag is set.     
    
所以說,HeapCreate和GlobalAlloc無本質的區別,只是GlobalAlloc是為了相容16位程式而存在的。
而VirtualAlloc是比較底層的記憶體操作了,請注意函式返回的是LPVOID,從某種意義上來說,使用Virtual系列的函式,您可以實現程式自己的記憶體管理模式了。

相關文章