.Net应用程序突破2G的内存访问限制方法(3)
下面的AweStream构造函数完成了对AWE内存的申请过程。
整个申请过程分为下面几步
1、为当前进程申请锁定内存的权限(注意 调用进程的帐号必须具备锁定内存的权限,否则这一步会失败)
2、就是需要申请的页面数量
3、通过 AllocateUserPhysicalPages API 申请AWE内存
以下为引用的内容: public AweStream(UInt32 capacity) lock (_SetLockPagesPrivilegeLockObj) General.SYSTEM_INFO sysInfo; _PageSize = sysInfo.dwPageSize; _PFNArraySize = (UInt32)(_NumberOfPages * sizeof(UInt64*)); // memory to request for PFN array _PFNArray = Marshal.AllocHGlobal((int)_PFNArraySize); UInt32 numberOfPagesInitial = _NumberOfPages; if (!AweApi.AllocateUserPhysicalPages(System.Diagnostics.Process.GetCurrentProcess().Handle, _AweAllocated = true; if (numberOfPagesInitial != _NumberOfPages) _Capacity = _PageSize * _NumberOfPages; } |
AWE内存申请完毕后并不能被立即访问到,我们必须将其映射到32位内存地址中才可以访问。