mysql awe_windows PAE扩展和AWE编程

在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 //1GB

BOOL bResult; // generic Boolean value

ULONG_PTR NumberOfPages; // number of pages to request

ULONG_PTR NumberOfPagesInitial; // initial number of pages requested

ULONG_PTR *aPFNs1; // page info; holds opaque data

ULONG_PTR *aPFNs2; // page info; holds opaque data

PVOID lpMemReserved; // AWE window

SYSTEM_INFO sSysInfo; // useful system information

int PFNArraySize; // memory to request for PFN array

TCHAR* 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的技术

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值