在Win32中的虚拟内存管理为每个进程提供2 GB的虚拟内存,物理内存不够的时候会使用虚拟内存文件。
内存地址的状态
1)保留的地址:只记录要使用内存的范围(防止分配重复),无物理内存页被提交。
例:lpBase = VirtualAlloc (NULL, 10485760, MEM_RESERVE, PAGE_NOACCESS); /* 保留 10 MB 的地址空间 */
2)提交的地址:可使用以保留的地址,物理内存或磁盘上的页文件被分配。
例:lpPage3 = VirtualAlloc (lpBase + (2 * 4096),4096,MEM_COMMIT,PAGE_READWRITE);/* 为第3页地址提交内存。 */
3)释放地址:一旦地址被以保留的或者已提交的形式分配,VirtualFree是唯一可以释放它们的方法。
VirtualFree (lpBase + (2 * 4096),4096,MEM_DECOMMIT,PAGE_NOACCESS); /* 对第3页地址解除提交内存。 */
4)改变虚拟内存页的保护
一个应用程序可以按PAGE_READWRITE来提交一个页的地址,并且立即将数据填写到该页中。然后,该页的保护将被改变为PAGE_READONLY,
这样可以有效地保护数据不被该进程中的任何线程重写。使用下列函数,可以使一个不能被访问的页可用。
VirtualProtect (lpStack + 4096,4096,PAGE_READWRITE,lpdwOldProt); /*将页保护改变成可读/写。*/
5)查询一个进程的虚拟内存的状态:查询内存提交,保留,保护,或未使用
VirtualQueryEx (hChildProcess,lpMem,lpList,sizeof (MEMORY_BASIC_INFORMATION));