jjryu 2009. 2. 10. 21:30
MmMapLockedPages() // ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL) or ASSERT(KeGetCurrentIrql() <= APC_LEVEL)
MmUnmapLockedPages() // ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL) or ASSERT(KeGetCurrentIrql() <= APC_LEVEL)

IoAllocateMdl() // ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL)
MmBuildMdlForNonPagedPool() // ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL)
IoFreeMdl() // ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL)

MmGetSystemAddressForMdl() // ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL)

MmMapIoSpace() // ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL)
MmUnmapIoSpace() // ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL)

==

가상 메모리
VirtualAlloc() // 페이지 단위 malloc()?
    MEM_COMMIT

    PAGE_READWRITE
VirtualFree()
    MEM_RELEASE
VirtualLock()
VirtualUnlock(()


Windows Heap
프로세스의 디폴트 힙으로의 접근은 직렬화된다.

추가의 힙을 사용
    성능
    할당의 효율
    디버깅 목적으로 데이터 컴포넌트를 격리

하나의 힙으로 충분한 경우라면 C라이브러리 메모리 관리 함수들(malloc, free, calloc, realloc)을 사용하면 된다.
프로세스 힙을 파괴해서는 안된다.

HeapCreate()
HEAP_NO_SERIALIZE
HEAP_GENERATE_EXCEPTIONS
HeapDestroy()
C++ 객체 인스턴스들의 소멸자가 호출되지 않는다.
HeapLock() // 동기화
HeapUnlock()
HeapAlloc()    // malloc() - <stdlib.h>
HEAP_ZERO_MEMORY
HEAP_GENERATE_EXCEPTIONS
HeapRealloc()    // realloc()
HEAP_ZERO_MEMORY
HEAP_GENERATE_EXCEPTIONS
HeapFree()    // free
GetProcessHeap()
GetProcessHeaps()
HeapSize()
HeapCompact()
HeapValidate()
HeapWalk()

GlobalAlloc()
GMEM_MOVEABLE
GMEM_FIXED
GMEM_ZEROINIT

GHND
GPTR
GlobalFree()
LocalAlloc()
GlobalLock()
GlobalUnlock()
메모리 맵드 파일(memory-mapped file)
파일 매핑 객체
CreateFileMapping()
OpenFileMapping()
MapViewOfFile()
MapViewOfFileEx()
UnMapViewOfFile()
FlushViewOfFile()

TLS
TlsAlloc()
TlsFree()
TlsSetValue()
TlsGetValue()


참조 사이트: