我最近正在研究一个程序。尽管它是一个小程序,但它占用大量内存,可以轻松达到10G。它可以在64位系统上轻松实现,但是我正在基于32位系统上进行开发,并且该程序在运行之前已终止。
我尝试了许多方法,包括文件内存映射等,但是效率不高,并且由于32位应用程序的限制,最大可用内存地址只能是0x7FFFFFFF,而可以限制为2G。最终,我终于找到了AWE(地址窗口扩展)。
AWE是Windows内存管理功能的一组扩展。它允许应用程序获取物理内存,然后将非分页内存的视图动态映射到32位地址空间。尽管32位地址空间限制为4GB,但非分页内存可能比4GB大得多。这样,需要大量内存的应用程序(例如大型系统)可以使用比32位地址空间支持的内存大得多的内存。
稍后将介绍与AWE相关的功能。
为了使用大容量存储器,除了使用AWE之外,还有一点不可少的东西,那就是PAE(物理地址扩展)。 PAE是基于x86的服务器的功能,它使运行Windows Server 2003,Enterprise Edition和Windows Server 2003,Datacenter Edition的计算机可以支持4 GB以上的物理内存。物理地址扩展(PAE)允许将多达64 GB的物理内存用作常规的4 KB页面,并将内核可用于将物理内存地址扩展的位数从32扩展到36。
在正常情况下,Windows系统的PAE无效。只有在打开PAE之后,Windows系统才能识别4G以上的内存。在使用boot.int的系统中,要启动PAE,必须在boot.ini中添加/ PAE选项。在Windows Vista和Windows 7中,必须修改内核文件并设置BCD启动项。对于Vista和Win7系统,可以使用Ready For 4GB软件直接完成此操作。有关特定方法,请参见Ready For 4GB软件说明。以下是打开/ PAE选项的boot.ini文件的示例:
本文将以Windows 7 Ultimate为例,介绍如何在启用PAE的情况下使用AWE达到在程序中使用2G以上内存的目的。下图显示了在打开PAE和未打开PAE时系统识别的内存容量的差异。
图一.打开PAE

图二.关闭PAE


如果未打开PAE,则系统只能识别3G内存,最多0. 5G不到,因此即使您使用AWE,因为系统和其他应用程序已经占用了一部分内存,剩下的内存可能只是2G多一点,没有太大的改进。只有当系统识别出4G以上的内存时,AWE才能发挥真正的作用。
让我们看一下Windows中提供的AWE API函数,它们都是在winbase.h中定义的。
从winbase.h中的定义可以看出,仅当系统版本大于或等于0x0500时,才可以使用AWE。下表中显示了每个版本的_WIN32_WINNT值。 AWE不能用于Windows 2000以下的版本。
需要最少的系统
_WIN32_WINNT和WINVER的最小值
Windows7
0x0601
Windows Server2008
0x0600
WindowsVista
0x0600
带有SP1的Windows Server2003,带有SP2的WindowsXP
0x0502
Windows Server2003,WindowsXP
0x0501
Windows2000
0x0500
如果您的系统版本符合要求,但是编译器在编译添加了AWE API的代码时出错,则可以将以下代码添加到程序头文件中。
下面简要介绍每个API的功能。
在查看示例程序之前,仍然需要进行一些设置,并且需要设置系统的本地安全策略。在win7中,打开“控制面板->系统和安全性->管理工具->本地安全策略”,将当前用户添加到“锁定内存页面”,然后退出并重新启动(通常,如果不重新启动,它将不会生效!)

在进行了前面的准备之后(再说一遍:确认您的计算机具有4G或更多的内存;打开PAE以使系统识别4G或更多的内存;设置本地安全策略),我们可以通过以下操作:代码进行实验。
该代码是从MSDN中的AWE示例中修改的。有关特定过程,请参见代码中的注释。如果您对本示例的源代码感兴趣,则可以参考MSDN。
程序运行结果如下:

可以看出,系统页面大小为4K,总共请求了655,360页,即2. 5G。每个分页成员占用4个字节,共2621440个字节。 2. 5G内存分为512M块的5个段,并且成功写入和读取了字符串。
在调试过程中,执行AllocateUserPhysicalPages函数后设置一个断点,检查任务管理器,可以看到成功分配物理内存后,实际的物理内存已占用2. 5G,从而验证了AWE。

通过上面的示例,我们成功地在32位系统中识别了4G内存,并在32位程序中成功使用了2G以上的内存。借助PAE和AWE,即使在32位系统上,我们也可以成功开发消耗大量内存的应用程序,而无需依赖64位平台。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-360136-1.html
我本人也喝过很多黑芝麻糊
哎呀杨洋啊