虚拟内存功能

【勇芳软件工作室】汉化HomePreviousNext

Win32 API提供了一组虚拟内存功能,可使进程在其虚拟地址空间中操作或确定页面的状态。许多应用程序能够通过使用标准分配功能(GlobalAllocLocalAlloc的malloc等)来满足其内存需求。然而,虚拟内存功能提供了一些标准分配功能不可用的功能。他们可以执行以下操作:

*保留一系列进程的虚拟地址空间。预留地址空间不分配任何物理存储,但是它可以防止其他分配操作使用指定的范围。它不影响其他进程的虚拟地址空间。预留页面可防止不必要的物理存储消耗,同时使进程能够保留动态数据结构可以增长的其地址空间范围。该过程可以根据需要为此空间分配物理存储。

*在进程的虚拟地址空间中提交一系列保留页面,以便物理存储(在RAM或磁盘上)只能由分配进程访问。

*为一系列提交的页面指定读写,只读或无访问。这与总是分配具有读写访问权限的页面的标准分配函数不同。

*免费一系列保留的页面,使得虚拟地址的范围可用于调用进程的后续分配操作。

*撤销一系列承诺的页面,释放其物理存储,并使其可用于任何进程的后续分配。

*将一个或多个已提交内存的页面锁定到物理内存(RAM)中,以便系统无法将页面切换到页面文件。

*获取关于调用进程或指定进程的虚拟地址空间中的一系列页面的信息。

*在调用进程或指定进程的虚拟地址空间中,为指定范围的已提交页面更改访问保护。

虚拟内存功能操纵内存页面。这些功能使用当前计算机上页面的大小来舍弃指定的大小和地址。

要确定当前计算机上页面的大小,请使用GetSystemInfo功能。

VirtualAlloc功能执行以下操作之一:

*预留一个或多个免费页面。

*提交一个或多个保留页面。

*保留并提交一个或多个免费页面。

您可以指定要保留或提交的页面的起始地址,也可以允许系统确定地址。该函数将指定的地址循环到适当的页面边界。保留的页面不可访问,但是可以使用PAGE_READWRITE,PAGE_READONLY或PAGE_NOACCESS标志分配已提交的页面。当页面提交时,在分页文件中分配存储空间,但是只有在首次尝试读取或写入该页面时,才会将每个页面初始化并加载到物理内存中。您可以使用正常的指针引用来访问由VirtualAlloc函数提交的内存。

VirtualFree功能执行以下操作之一:

*取消一个或多个提交的页面,将页面的状态更改为保留。解密页面释放与页面相关联的物理存储,使其可以由任何进程分配。任何提交的页面块都可以被分解。

*释放一个或多个保留页面的块,将页面的状态更改为空格。释放一个页面块使保留地址的范围可以由进程分配。只有通过释放最初由VirtualAlloc保留的整个块才能释放保留的页面。

*同时分解和释放一个或多个承诺页面的块,将页面的状态更改为空闲。指定的块必须包含最初由VirtualAlloc保留的整个块,并且所有页面必须当前提交。

VirtualLock功能允许进程将一个或多个已提交内存页面锁定到物理内存(RAM)中,从而防止系统将页面交换到页面文件。它可用于确保关键数据可访问,无需磁盘访问。将页面锁定到内存中是危险的,因为它限制了系统管理内存的能力。过多使用VirtualLock可能会导致可执行代码被换出到页面文件来降低系统性能。VirtualUnlock功能可锁定VirtualLock锁定的内存。

VirtualQueryVirtualQueryEx函数返回有关进程地址空间中指定地址开始的连续页区域的信息。VirtualQuery返回有关调用进程内存的信息。VirtualQueryEx返回有关指定进程内存的信息,用于支持需要有关被调试进程的信息的调试器。页面的范围由指定的地址四舍五入到最接近的页面边界。它扩展到所有后续页面,具有以下属性:

*所有页面的状态相同:承诺,保留或免费。

*如果初始页面不是空闲的,该区域中的所有页面都是通过调用VirtualAlloc预留的页面的相同初始分配的一部分。

*所有页面的访问保护是相同的(即PAGE_READONLY,PAGE_READWRITE或PAGE_NOACCESS标志)。

VirtualProtect功能使进程可以修改进程地址空间中任何已提交页面的访问保护。例如,一个进程可以分配读写页面来存储敏感数据,然后它可以将访问权改为只读或无访问以防止意外覆盖。VirtualProtect通常用于由VirtualAlloc分配的页面,但它也适用于任何其他分配函数提交的页面。但是,VirtualProtect更改了整个页面的保护,而其他函数返回的指针不一定对齐页面边界。VirtualProtectEx功能类似于VirtualProtect,只不过它改变了指定进程中的内存保护。更改保护对于调试器访问被调试进程的内存很有用。