在32位windows上只能看到最大3GB的内存空间,而且每个应用程序只能访问4GB的的内存,这个限制是windows独有的,为了使程序能够访问大于4GB的内存空间,需要使用AWE编程接口,同时需要开启PAE,让系统支持大于3GB的内存,开启PAE最大能支持128GB的内存。

PAE开启

在windows 7及以上的系统主要使用BCDEdit命令而XP系统使用的是修改boot.ini文件的方式,下面主要介绍的是windows 7 上开启PAE的方式
在命令行下输入BCDEdit /set PAE forceenable windows
另外如果需要扩大用户分区可以打开/3GB开关,这个开关在windows 7上用命令:BCDEdit /set IncreaseUseVa 3072(后面的数字代表的是用户分区的大小,3072正是3GB)
另外编译选项需要打开/LARGEADDRESSAWARE开关

AWE编程接口

开启PAE之后想要自己的程序能够访问到超过4GB的内存,需要使用AWE的编程接口,AWE(Address Windowing Extensions)是地址窗口扩展。
使用AWE时,所有物理页面的交换控制就由应用程序自己控制
使用的基本步骤:
1. 使用VirtualAlloc + MEM_PHYSICAL分配保留一段地址空间
2. 准备用于存储页表的数组
3. 申请分配物理内存(AllocateUserPhysicalPages)
4. 将物理内存映射到“窗口”中(MapUserPhysicalPages)
5. 对映射的内存进行读写操作
6. 释放物理内存页面(FreeUserPhysicalPages)
7. 释放对应的保留地址空间
下面是使用AWE的简单例子

#define MEMORY_REQUESTED 1024 * 1024 * 1024 //1GBBOOL bResult;                   // generic Boolean valueULONG_PTR NumberOfPages;        // number of pages to requestULONG_PTR NumberOfPagesInitial; // initial number of pages requestedULONG_PTR *aPFNs1;               // page info; holds opaque dataULONG_PTR *aPFNs2;               // page info; holds opaque dataPVOID lpMemReserved;            // AWE windowSYSTEM_INFO sSysInfo;           // useful system informationint PFNArraySize;               // memory to request for PFN arrayTCHAR* pszData;TCHAR  pszReadData[100];MEMORYSTATUSEX ms = {sizeof(MEMORYSTATUSEX)};GlobalMemoryStatusEx(&ms);//使用VirtualAlloc + MEM_PHYSICAL分配保留一段地址空间lpMemReserved = VirtualAlloc( NULL,MEMORY_REQUESTED, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE );//计算需要的物理页面大小 以及物理页面需要的页表数组大小GetSystemInfo(&sSysInfo);  // fill the system information structure//向上取整,计算出需要多少个页表项NumberOfPages = (MEMORY_REQUESTED + sSysInfo.dwPageSize - 1)/sSysInfo.dwPageSize;PFNArraySize = NumberOfPages * sizeof (ULONG_PTR);//2 准备物理页面的页表数组数据aPFNs1 = (ULONG_PTR *) HeapAlloc(GetProcessHeap(), 0, PFNArraySize);aPFNs2 = (ULONG_PTR *) HeapAlloc(GetProcessHeap(), 0, PFNArraySize);NumberOfPagesInitial = NumberOfPages;//3 分配物理页面bResult = AllocateUserPhysicalPages( GetCurrentProcess(),&NumberOfPages,aPFNs1 );bResult = AllocateUserPhysicalPages( GetCurrentProcess(),&NumberOfPages,aPFNs2 );//4 映射第一个1GB到保留的空间中bResult = MapUserPhysicalPages( lpMemReserved,NumberOfPages,aPFNs1 );pszData = (TCHAR*)lpMemReserved;_tcscpy(pszData,_T("这是第一块物理内存"));//5 映射第二个1GB到保留的空间中bResult = MapUserPhysicalPages( lpMemReserved,NumberOfPages,aPFNs2 );_tcscpy(pszData,_T("这是第二块物理内存"));//6 再映射回第一块内存,并读取开始部分bResult = MapUserPhysicalPages( lpMemReserved,NumberOfPages,aPFNs1 );_tcscpy(pszReadData,pszData);//7 取消映射bResult = MapUserPhysicalPages( lpMemReserved,NumberOfPages,NULL );//8 释放物理页面bResult = FreeUserPhysicalPages( GetCurrentProcess(),&NumberOfPages,aPFNs1 );bResult = FreeUserPhysicalPages( GetCurrentProcess(),&NumberOfPages,aPFNs2 );//9 释放保留的"窗口"空间bResult = VirtualFree( lpMemReserved,0, MEM_RELEASE );//10 释放页表数组bResult = HeapFree(GetProcessHeap(), 0, aPFNs1);bResult = HeapFree(GetProcessHeap(), 0, aPFNs2);_tsystem(_T("PAUSE"));

上述代码中,虽然只保留了1GB的虚拟地址空间,但是这1GB的虚拟地址空间通过映射的方式,映射到具体不同的真实内存中,这个就是PAE能访问大于4GB内存的秘密,通过对分页机制的了解,4字节的虚拟地址空间能够映射4KB的一页内存,所以经过简单的计算,其实没多映射1GB的内存其实只需要1M的数组来存储这些页表项。
64位的windows不再也没有必要支持AWE技术,因为这个技术就是为了解决应用程序访问内存不足的情况,但是在64位系统中不存在这个问题,也许有朝一日64位的操作系统也会出现能够访问的内存太少的情况,这个时候说不定会出现类似于AWE的技术

转载于:https://www.cnblogs.com/lanuage/p/7725740.html

windows PAE扩展和AWE编程相关推荐

  1. Windows 外壳扩展编程入门实例

    Windows 外壳扩展编程入门实例 -- Delphi 篇 作者的话 关于Windows 外壳扩展方面的文章私心以为最好的应当算是Michael Dunn 的TheComplete Idiot's ...

  2. [Delphi] Windows 外壳扩展编程入门实例

    关于Windows 外壳扩展方面的文章私心以为最好的应当算是Michael Dunn 的TheComplete Idiot's Guide to Writing Shell Extensions 我也 ...

  3. Windows Shell 扩展编程 第十五章

    转自:http://blog.csdn.net/chchzh/article/details/4597866 第十五章 SHELL扩展 谈到Windows Shell编程,Shell扩展是最重要的科目 ...

  4. 【转】Windows Shell扩展编程傻瓜手册大全:上下文菜单扩展

    引用自: http://blog.163.com/yesaidu@126/blog/static/51819307200861853827582/ Part I: A step-by-step tut ...

  5. Windows Embedded Compact 7网络编程概述(上)

    如今,不论是嵌入式设备.PDA还是智能手机,网络都是必不可少的模块.网络使人们更方便地共享设备上的信息和资源.而且,利用智能手机浏览互联网,也逐渐成为生活中的常见手段.物联网所倡导的物物相联,也离不开 ...

  6. 初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程

    @TOC初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程 [1]什么是windows API Windows API 中文翻译过来就是windows应用程序接口(Applica ...

  7. 成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入

    成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入 目录 解决问题 解决思路 解决方法 解决问题 .pyx格式文件,在window ...

  8. windows下扩展yaf,并生成yaf框架文件(亲测)

    YAF中文文档:http://www.laruence.com/manual/index.html 1 YAF框架是用C开发的,属于PHP的扩展框架: 2 YAF的性能相对于源生PHP,性能只降低不到 ...

  9. Windows XP下Service的编程入门[2]

    Windows XP下Service的编程入门[2] // _dse.cpp : Defines the entry point for the console application. // 作者: ...

  10. Windows XP下Service的编程入门[1]

    Windows XP下Service的编程入门[1] // _dse.cpp : Defines the entry point for the console application. // 作者: ...

最新文章

  1. Python计算数据相关系数(person、Kendall、spearman)
  2. 阿里巴巴发布首个知识引擎研究计划,联合清华浙大等五大高校攻坚AI推理
  3. 【数据结构与算法】之深入解析“分割回文串”的求解思路与算法示例
  4. CF-825 G.Tree Queries(DFS)
  5. 使用jquery脚本获取随笔、文章和评论的统计数,自定义显示位置
  6. java vbs_VBS基础篇 - vbscript Dictionary对象
  7. grafana导入json文件没有数据_基于SpringBoot将Json数据导入到数据库
  8. scrapy_redis爬取统计局的城乡代码,以目录文件夹形式生成,同时最后保存在excel和redis数据库中
  9. 微信小程序之使用云存储
  10. vscode 升级时失败 win10
  11. linux开机自动root,linux怎样设置root自动登录
  12. 如何画神经网络模型图
  13. 七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
  14. flv.js播放视频时遇到的问题
  15. 图数据库nebula
  16. Attention注意力机制——ECANet以及加入到1DCNN网络方法
  17. Mac OS下搭建Hadoop3.2.1
  18. cs1.6 linux,在Ubuntu 8.04下玩CS1.6
  19. Html5通过js进行页面内搜索
  20. 微信小程序--P2P消息收发模式(MQTT)

热门文章

  1. Spring源码之bean的解析obtainFreshBeanFactory方法解读
  2. 多线程之同步Synchronized
  3. 在struts中实现验证码
  4. Spring依赖注入@Autowired原理解析(一)之寻找需要注入的属性
  5. 【设计模式专题】Singleton
  6. ConstraintLayout 完全解析 快来优化你的布局吧
  7. jQuery基础知识--Form基础(续)
  8. .NET IO 复习中的误区
  9. Spring MVC中的统一异常处理
  10. 直接插入排序-java