首页
社区
课程
招聘
[讨论]问一下,用AWE编程怎么突破2G内存限制呢?
发表于: 2009-3-9 03:49 7640

[讨论]问一下,用AWE编程怎么突破2G内存限制呢?

2009-3-9 03:49
7640
主要就是AllocateUserPhysicalPages、MapUserPhysicalPages两个函数

BOOL MapUserPhysicalPages(
   PVOID pvAddressWindow,
   ULONG_PTR ulRAMPages,
   PULONG_PTR aRAMPages);

If the window is smaller than the number of pages you're attempting to map, the function fails.

以上是Jeffrey Richter的原话

但问题是:用户的window大小(即virtual memoroy)最多也就2G,想不通用AWE编程怎么突破2G或者说4G的内存限制呢?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (23)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
我也不清楚,你再好好看看Windows Internals吧
2009-3-9 10:08
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
3
地址窗口。。
2009-3-9 11:31
0
雪    币: 354
活跃值: (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
前提是你机器得有>4GB的物理内存。。。

然后开启/PAE

再使用这些函数即可
2009-3-9 12:30
0
雪    币: 354
活跃值: (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
另外注意必须有Lock pages in memory权限
2009-3-9 12:39
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感觉Windows Internals上交代的也不清楚,P399~400:
1.If an application creates 256-MB window in its address space and allocates 4GB of physical memory (on a system with more than 4GB of physical memory), the application can use the MapUserPhysicalPages or MapUserPhysicalPagesScatter Windows function to access any portion of the physical memory by mapping the memory into the 256-MB window.
2.The size of the application's virtual address space window determines the amount of physical memory that the application can access with a given mapping.

我估计Mark Russinvocih的意思是说:先VirtualAlloc是256MB,然后AllocateUserPhysicalPages是4GB,最后MapUserPhysicalPages还是256MB
不过再看看Jeffrey Richter的原话:
BOOL MapUserPhysicalPages(
   PVOID pvAddressWindow,
   ULONG_PTR ulRAMPages,
   PULONG_PTR aRAMPages);
If the window is smaller than the number of pages you're attempting to map, the function fails.

问题也很简单:从编程角度(说什么PAE的,就不要来讨论了),究竟怎么实现超过2G?
2009-3-9 12:55
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
就是说它通过这个单独的256M地址窗口(这256M总是可以满足的吧)来管理那部分物理内存
2009-3-9 13:03
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
怎么管理?Jeffrey Richter不是说MapUserPhysicalPages会fail吗?
2009-3-9 13:32
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
而且Mark Russinvocih自己也说了:The size of the application's virtual address space window determines the amount of physical memory that the application can access with a given mapping.

怎么理解?
2009-3-9 13:34
0
雪    币: 354
活跃值: (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
10
麻烦楼主回去再读多十遍Intel Manual再来问。。。

玩AWE需要硬件支持的

AWE只不过是微软自家的东西,Linux用mmap()...
2009-3-9 14:34
0
雪    币: 354
活跃值: (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
11
楼猪连地址窗口和地址空间等基本概念都分不清
2009-3-9 14:36
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你不懂不要乱叫,最讨厌不懂装懂的

这里是看雪“Win32/Win64编程”,不是百度知道好哇,跟我说什么/PAE一刚

你要是懂,写段程序看看,到底怎么使用超过2G的内存?
2009-3-9 14:59
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
算了,不研究AWE了,反正64位马上就要普及了

只是很怀疑AWE的效率,照我现在的理解:比如有个大于2G的文件要处理,AWE应该还是要分块处理(64位当然就爽啦),不可能同时控制超过2G的实际内存吧;这样的话,效率会比IOCP或者Memory-Mapped Files高吗?

听说MySQL用到了AWE,哪天有空看看吧……
2009-3-9 15:05
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
多说无意,你要是真懂了,就写段代码出来,给大家看看
2009-3-9 15:08
0
雪    币: 354
活跃值: (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
15
MSDN上都有例子,如果还不懂那真是楼猪啊

http://msdn.microsoft.com/en-us/library/aa366531(VS.85).aspx
2009-3-9 15:19
0
雪    币: 354
活跃值: (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
16
就以MSDN上这个代码为例

哪句代码你有疑问??
2009-3-9 15:20
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
你再看看,那大小是多少,1024*1024,有意义哇

不和你多说了,这个帖子你不要再进来了好哇,拜托
2009-3-9 15:23
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
搞了半天,以为我api不会用一刚,就这么简单的2个api谁不会用

麻烦把Jeffrey Richter的那句话好好理解,再来讨论
2009-3-9 15:26
0
雪    币: 354
活跃值: (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
19
搞了半天原来是楼猪不懂装懂。。。

我一开始就说了要开启PAE才能一次分配 >4GB内存,
可楼猪却对PAE不屑一顾,我还以为他懂这个,害得我以为他API不会用...

在说一次,32位单进程要分配>4GB内存请先开启PAE,
当系统以PAE启动时,线性地址到物理地址的转换就是按照PAE的方式了

楼猪自己去看下INTEL 手册 第3卷 3.82节的
linear address translation with PAE Enable(4kb page)

线性地址到物理地址转换由2级变成了3级

并且,页目录指针表 页目录 页表项全都是64位了(再次重读INTEL 手册3.85节)

因此可以分配> 4GB的内存了...

打字真楼猪他妈的累
2009-3-9 16:24
0
雪    币: 354
活跃值: (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
20
你可以不理会我的回复
我不再进来了...
2009-3-9 16:32
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
提问题的还蛮凶的啊   FT
2009-3-9 16:38
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
你怎么又进来了?

真怀疑你懂不懂编程?

好像就你一个人知道PAE似的,Windows Internals里又不是没有提到

无非就是加个/pae启动参数,对编程一点影响也没有

又和我扯什么intel手册

我是在ring3编程,好哇

算了,你估计是个操作系统理论派
2009-3-9 16:47
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
搞了半天,我算是真正理解AWE了

AWE的确是可以操作大于2G/4G的实际内存

但绝不是LS某位想的那么简单什么“加个PAE,弄个privilege,然后就可以直接在virtual memory上分配4G以上的空间了”

实际应用的话,编程相当复杂,LS的某位还是自己动动手吧

其实是这样的:每次需要实际内存的话,就用AllocateUserPhysicalPages重新分配,并把这个新的内存给virtual memory上的同一address window,原来用AllocateUserPhysicalPages分配的内存依然保留着,不同AllocateUserPhysicalPages分配的内存直接要互相配合……

其实也还是对大内存分块的意思,终于理解Jeffrey Richter说的64位编程就不需要AWE的意思了

唉,还是我不细心,一开始把FreeUserPhysicalPages想当然了,以为free的是virtual memory

但感觉效率方面还是大问题,文件操作方面不见得会比memory-mapped files高很多,还是改天看看MySQL中是怎么实现的吧

PS:msdn中的例子在编程风格方面有重大缺陷,LS某位看的出来吗?
2009-3-9 17:14
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
另外想说的一点就是,Mark Russinovich在Windows Internals上举的例子感觉有点问题

因为MapUserPhysicalPages的第三个参数虽然是[IN],但实际上这个参数用户是不能修改的
2009-3-9 17:22
0
游客
登录 | 注册 方可回帖
返回
//