地址窗口扩展 (AWE)

地址窗口扩展是为了帮助那些32地址空间不足的程序的 简称AWE 目标有两个
1.允许应用程序以一种特殊的方式分配内存,操作系统保证不会将以这种方式分配的内存换出到磁盘
2.允许应用程序访问比进程地址空间还要多的内存

基本上,AWE提供了一种方式,可以让应用程序分配一块或者多块内存,当一开始分配的时候,在进程的地址空间中是看不见这些内存块的。应用程序然后(通过调用VirtualAlloc)预定地址空间区域,这就是地址窗口。应用程序然后调用一个函数,每调用一次把一块内存指定到该地址窗口。把内存块指定到地址窗口是非常快的。

很明显,通过一个地址窗口,同一时间只能访问一块内存,由于开发人员必须在需要的时候编写,显示地在代码中调用函数来把不同的内存块指定到地址窗口中,因此这使得代码更加哪里编写

void
TestAWE(void)
{
ULONG_PTR ulRAMBytes = 1024 * 1024;
PVOID pvWindow = VirtualAlloc(NULL, ulRAMBytes, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE);
//申请内存窗口, MEM_RESERVE | MEM_PHYSICAL 第三个参数为
//保护属性必须是 PAGE_READWRITE
//获取系统物理内存块的大小
SYSTEM_INFO sinf;
GetSystemInfo(&sinf);
//计算需要多大的物理页面
ULONG_PTR ulRAMPages = (ulRAMBytes + sinf.dwPageSize - 1) / sinf.dwPageSize;
//用以存储物理页面的地址
ULONG_PTR* pRAMPages = (ULONG_PTR*)new ULONG_PTR[ulRAMPages];
//申请物理页
AllocateUserPhysicalPages(GetCurrentProcess(),
&ulRAMPages,
pRAMPages);
//绑定RAM页到我们的窗口
MapUserPhysicalPages(pvWindow,
ulRAMBytes,
pRAMPages);
//访问物理页的代码
;
//释放物理页
FreeUserPhysicalPages(
GetCurrentProcess(),
&ulRAMPages,
pRAMPages);
//释放我们的窗口
VirtualFree(pvWindow, 0, MEM_RELEASE);
delete[] pRAMPages;
}
操作系统会给每个页面指定一个页框号,系统在分配内存页面时,会将每个内存页面的页框号保存到pRAMPages参数所指向的数组中。页框号本身对应用程序是没有什么作用的,因此我们没有必要页不应该取读取该数组中的内容。
注意:我们及不知道哪个内存页面被分配给这块区域,也不关心这个问题,当内存块中的页面通过地址窗口显示出来时,它们看起来就像一块连续的内存。这一方面减轻了开发人员的负担,因为我们不必理解系统内存到底在做什么,另一方面也使得内存更容易使用,
当函数返回的时候,第二个参数指向的值表示函数成功分配的页面的数量。这个值小于等于我们传入的值。
只有当前进程才能使用通过AllocateUserPhysicalPages分配大的内存页面,AWE不允许把内存页面映射到其他进程大的地址空间中,因此,我们不能在进程间共享内存块
说明:我们必须具备内存中锁定页面用户权限,才调用函数

创建一个地址窗口并分配一块内存之后,接下来调用MapUserPhysicalPages把内存块指定给地址窗口。
BOOL
WINAPI
MapUserPhysicalPages(
In PVOID VirtualAddress,
//表示地址窗口的怩地址
In ULONG_PTR NumberOfPages,
//表示通过该地址窗口看到多少个页面的内存
In_reads_opt(NumberOfPages) PULONG_PTR PageArray
//表示要通过该地址窗口看到那些页面的内存
);
//如果地址窗口的大小小于我们要看到的窗口,则会失败
我们可以把这些内存块指定给任何一个地址窗口,但系统不允许一个内存块中同时出现两个地址窗口。
AWE在X64的作用在于可以分配非交换内存。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值