这篇是网上一个哥们的总结, 个人觉得挺好, 原文地址:Windows内存管理的API函数
数据所在的内存地址,内存最小存储单元是字节,在32位系统上使用32位数来表示内存地址.
一共可以表示2^32次
地址空间:
32位可以使用4GB内存,那么地址空间就是0x00000000~0xFFFFFFFF
物理内存:
硬件系统中真实存在的存储空间称为物理内存.
虚拟地址空间:
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 将指定内存区域清零
GlobalMemoryStatu*** 用于获取系统当前内存使用情况
IsBadCodePtr 判断调用进程是否拥有对指定地址内存的读操作权限
IsBadReadPtr 判断调用进程是否有对指定地址段内存的读操作权限
ISBadStringPtr 判断调用进程是否拥有对字符串指针的读取权限
IsBadWritePtr 判断调用进程是否拥有对指定地址段内存的写操作权限