Allocating Virtual Memory (分配虚拟内存)
虚拟内存函数用于操作内存页面。这些函数用当前机器上的页面的大小来实现描述内存的大小和地址的功能。
VirtualAlloc 函数执行以下的操作中的一个:
1、 预留一页或多页的自由页面。
2、 提交一页或多页预留页面。
3、 预留和提交一页或多页自由页面。
你可以指定你要预留或提交页面的起始地址,或者你也可以让系统来决定这个地址。函数将指定的地址调整到适当的页面边界。预留页面是不允许访问的,但已提交的页面可以被以页读/写、页只读、页访问禁止等访问规则进行分配。当页面被提交之后,在页面文件中就分配了存储区,但所有页面都只是在第一次试图读或写该页面的时候被调入物理内存。你可以用一般指针来访问用VirtualAlloc函数提交的内存。
Freeing Virtual Memory (释放虚拟内存)
VirtualFree函数执行以下操作中的一个:
1、 取消提交一个或更多的已提交页面,把页面状态切换到预留。取消提交的页面将释放于该页面相关联的物理存储区,使这片区域能够被任意进程重新使用。所有被提交的页面块都可以被取消提交。
2、 释放一片包含一个或多个预留页面的内存块,把页面状态切换到空闲。已释放的页面块能够被该进程重新使用。被预留页面只能够一次释放全部的之前使用VirtualAlloc函数预留的块。
3、 同时取消提交和释放一个包含一个或多个页面的块,将这些页面的状态切换为空闲。指定的块必须包含全部之前使用VirtualAlloc函数预留的块,而且通常所有这些页面已经被提交。
当一个内存块被释放或者取消提交之后,你就不能再引用它。所有之前在其中的信息都永远消失。试图在一个空闲页面上执行读写操作会导致一个访问违例。如果你还需要这些某些信息,那么请不要取消提交或者释放包含这些资料的内存。
如果想要说明某片内存区域的数据不再游泳,那么在调用VirtualAlloc时使用MEM_RESET参数。这样这些页面上的数据将不会在读取或写入页面文件。然而,这块内存仍可再次被使用。
Working With Pages (页面操作)
使用GetSystemInfo函数能够得到当前机器的页面大小。
VirtualQuery 和VirtualQuerayEx函数能够返回关于 某一进程的地址空间中始于指定地址的连续的页面空间 的资料。VirtualQuery返回关于调用进程的内存资料。VirtualQueryEx返回关于指定进程的内存资料而且通常能够支持需要处于调试态进程资料的调试器。页面区域会被限制在 向下调整到最近页面边界的指定地址上。一直延伸到所有拥有以下共同特性的后续页面:
1、 所有页面状态一致:是已提交或预留或空闲三状态之一。
2、 如果起始页面非空闲,那么所有该区域页面都是被VirtualAlloc一起初始化的内存页面组的一部分。
3、 所有页面访问控制级都一致:是 页只读、页读写、页禁止访问三级之一。
VirtualLock函数使进程能够锁定一页或多页已提交内存进入物理内存(RAM),防止系统将这些页面交换到页面文件中。它能够被用于确保在不进行磁盘访问的情况下使临界数据可访问。锁定页面进内存是危险的,这是因为它会限制系统管理内存的能力。的使用VirtualLock函数能够导致可执行代码被交换到页面文件从而降低系统性能。VirtualUnlock函数将被VirtualLock锁定的内存解锁。
VirtualProtect函数能够调整所有在进程地址空间中的已提交页面的访问限制级。比如,进程可以分配读写页面来存储常变数据,并且之后它能够把访问控制级改变为只读或者禁止访问来防止以外的改写。VirtualProtect是一个用VirtualAlloc分配的页面上的典型的应用,但是,它也能够应用于使用其它分配函数分配的页面上。然而,VirtualProtect改变了全部页面的保护级,但是其它分配函数返回的指针并不一定要页面对齐。VirtualProtectEx函数类似于VirtualProtect函数,除了它只改变指定进程内存的限制级之外。改变限制级在调试器访问被调试进程的内存的时候会很有用处。
下期预告:
Memory Management Functions (内存管理函数)
本文地址:http://com.8s8s.com/it/it2021.htm