32位系统与内存限制




以下内容中,约定
直接寻址表示OS和应用程序不经额外转换而对物理地址的直接访问,
物理寻址(平面寻址)表示处理器通过全部地址线对物理地址的访问,
虚拟寻址表示OS和应用程序经过页面管理机制转换后对虚拟存储空间的访问,
扩展寻址表示对超出直接寻址能力之外的处理器物理高端寻址空间的间接访问。


物理地址包括 RAM、ROM、AGP/PCI/PCI-E等的地址空间
“地址”标识了一个一个的单字节,存取信息的具体操作必须给出相应的地址,
如果物理地址是32位的话,就只能直接管理 2^32 Bytes = 4GB 物理地址空间。


PSE:Page Size Extension 页面大小扩展,从P5(Pentium)开始引入的硬件技术。

PAE:Physical Address Extension 物理地址扩展,更先进的硬件技术,
从P6(Pentium Pro)开始引入,也是32位扩展寻址的代名词。

VAS:Virtual Address Space 虚拟地址空间;
VM:Virtual Memory 虚拟内存,这两者指 OS/CPU 按页面管理的全部逻辑存储空间。
有时候也说“某进程的VAS或者VM”,那是指全部空间中该进程可用的部分。

请注意区分“虚拟内存”与“交换分区/交换文件”这两个概念:
交换分区/交换文件 是用于存放虚拟内存中部分页面的部分外部存储,
虚拟内存中的另一部分页面则位于内部存储器中,也就是物理内存中。

32位操作系统是按页管理VAS的,x86 体系架构使用的页面大小为 4KB~4MB,
若是4MB的话,仅 2^10 页便有 4GB。(某些 RISC 体系可用 16MB 的巨型分页)
但是,仅仅给出分页的编号还是不足以直接存取信息的,而需要再做转换——
最终还是要到物理地址空间中去一个字节一个字节的做物理寻址才行。




下面先贴一些老旧的帖子,一篇我整理的,半篇别人写的:
==========================================================================

发信人: marion(好奇心?那只是科研的第一步!), 信区: MSWindows
标 题: 简介一下扩展寻址的Win32程序
发信站: 瀚海星云 (2006年12月09日21:16:08 星期六), 站内信件 WWWPOST


如果只讨论x86及其衍生的x86-64

硬件上,自从 Pentium Pro(P6)开始,就已经使用36根地址线(PAE技术);
Athlon64(K8)则是40根地址线;x86-64最大设计容量是52根地址线……

软件上,Linux/UNIX很早就已经支持PAE技术;
而微软最早也在NT 4.0的高端服务器版中开始支持36位寻址的PAE,
Win32版应用程序的36位物理寻址API叫AWE (Address Windowing Extensions)



NT 4.0 系列的资料不统一,为避免误导就不介绍了。
NT 5.x 系列的 Windows中,支持使用 PAE技术寻址 4GB以上物理内存的有:

Windows 2000 Advanced Server
8 GB

Windows 2000 Datacenter Server
32 GB (64 GB Canc

elled)

Windows XP Professional x64 Edition
32 GB

Windows Server 2003 Standard x64 Edition(仅通过硬件厂商OEM发行)
32 GB

Windows Server 2003 Enterprise
x86 Edition 32 GB (64 GB with SP1)
x64 Edition 64 GB

Windows Server 2003 Datacenter
x86 Edition 64 GB (128 GB with SP1)
x64 Edition 1 TB


上述WindowsOS 都支持 Win32 应用程序

==========================================================================

发信人: Hakkk(蓝猫淘气3k问·荷兰篇), 信区: NewSoftware
标 题: 虚拟内存,物理内存,页面文件,还有任务管理器
发信站: 水木社区 (Tue Nov 20 21:56:20 2007), 站内


虚拟内存(Virtual Memory)是Windows管理所有可用内存的方式。对于32位Windows系
统,每个进程所用到的虚拟内存地址从0到2^32-1,总容量4GB,其中2GB是与操作系统以
及其他所有进程所共享,另外2GB分派给进程独占(这就是常说的32位Windows中一个进
程最多能用2G内存的由来)。

4GB虚拟地址空间(Virtual Address Space,VAS)中,2GB的进程独占VAS是进程隔离
的,换句话说,每个进程都可以从RAM或者硬盘上映射到属于自己的2GB VAS。所以虽然
32位Windows每个进程最多只能获得4GB可用虚拟内存,但是所有进程总和可以使用总量
超过4GB的虚拟内存。可惜XP只支持4GB RAM,也就是说超出部分一定得靠页面文件补
足;而比如2003企业版通过PAE支持32GB RAM,可以减少页面文件的用量。(但单个进程
最多仍然只有4GB虚拟内存地址空间,而不是32GB)

所以,一个简单的计算示例:三个进程最多能用掉多少VAS?
2GB(共享)+2GB(独占)×3=8GB

这4GB的虚拟地址空间,按照4KB的大小进行分页(page),然后以页为单位映射到实际
存储单元中,包括:
·物理内存(RAM)
·页面文件(Page File,在Win9x中称为交换文件Swap File,即win386.swp)
·其他文件自身(比如一些长时间未活动的进程的exe文件自身)
可见,通常人们所说的虚拟内存实际上只是指其中的页面/交换文件而已,这是对虚拟内
存的一个错误的理解。虚拟内存≠页面文件

RAM中除了保存最近读写的文件缓存(File Cache,相当于Win9x中的Vcache)主要用来
存储正在使用的程序代码和数据,当RAM资源紧张,或者有程序码或数据长时间未使用
时,XP通常会将非活跃程序码所在的地址页映射回程序文件(exe、dll等),将数据所
在的地址页映射到页面文件(pagefile.sys)中并拷贝数据,然后将它们本来占用的RAM
空间释放。这个过程称为页出(Page Out)。

当系统读取某个虚拟内存地址,而该地址所在的页不在RAM中时,将产生一个页面错误
(Page Fault)中断,告诉系统从页面文件或者程序文件中取回包含该地址的虚

拟内存
页,即将内容拷回到RAM并建立新的虚拟地址映射,并将页面文件中对应部分标记为未使
用,这个过程就是页入(Page In)。页入成功的话就是一个Valid Page Fault,否则就
是Invalid Page Fault。前者非常普遍,(可以在任务管理器的进程页监视到)而后者
是由程序或硬件错误引起,如果发生在进程上会导致非法操作,如果是系统自身则很可
能蓝屏。

…………以下部分略…………
==========================================================================




从硬件上来看,早在16位CPU时代,就已经采用超过数据线位宽的地址线来物理寻址更大
的物理内存,比如20位地址线的8086(1MB),24位地址线的80286(16MB),所以36位
地址线的32位CPU从硬件上来看也是很自然的一件事。关键问题是操作系统和应用程序如
何充分发挥CPU额外的物理寻址能力。

虽然32位操作系统存在着4GB直接寻址空间的上限,但是虚拟寻址能力却远远不止4GB ,
因为它们可以利用内存分页的机制把大量信息存放在一个个分页上,这些页面可能就在
物理内存中,也可能在其它位置(比如交换分区或者交换文件中)。无论如何,不支持
扩展寻址的32位应用程序必须在4GB的直接寻址空间内才能存取信息:如果待访问的那些
页面就在其中,很好,直接读写就行了;如果不在,那就需要被OS调度进来才能使用。

这就好比是书架和书桌,书桌相当于物理内存,它的大小较小,但是其上的所有信息可
以被快速访问;书架相当于交换分区或者交换文件,其上所有的内容按“本”管理,因
此容量可以很大。书桌上有一块地方属于操作系统占有,不可以被挪动!(WindowsNT中
这叫做未分页内存。)桌上其余部分则放着一本本的书——这些书可以被细致而快速的
逐字存取,也就是一个个位于物理内存中的虚拟内存分页啦。

这里插一句:我不知道Linux管理内存中I/O缓冲区的模块有没有使用特殊机制,但至少
Windows一直使用和普通应用程序一样的分页方式来管理缓冲区。

书桌的大小是有限的,要查阅的内容可能不在书桌上而在书架上,想阅读书架上的资
料,得将一本本的书从书架上拿到书桌上才能仔细阅读,这个叫做“页入”;书桌上堆
满了以后,如果还要再拿新的书籍过来,那就得把一部分旧书放回原处,这个叫做“页
出”。请参照Hakkk的那部分文字理解OS的这一调度过程。但是,很快我们就不满足于这
一张小小的书桌了,不停的在访问速度缓慢的书架与这张小小的书桌之间来回倒腾东西
实在不是什么明智之举!但是,要看书就必须把它拿到书桌上才行……那么,我们把书

加大不就行了吗?于是它被一直加大到了 >4GB 。

>4GB 物理内存确实很诱人,那么怎么才能使用呢?让我们一项项的来分析:

CPU 方面很早就支持这么做了;内存控制器么,以前只有服务器专用北桥芯片才支持,
近一两年的桌面产品也开始支持,而内置内存控制器的AMD K8 CPU就更不必说了;内
存,越来越便宜,超过 4GB 不再是海市蜃楼。所以,硬件上基本没有问题。

操作系统支持PAE?Linux/UNIX 只要选择相应的内核就可以了,实在找不到就自己改参
数编译一个内核,(CPU尖端技术总会最先由Linux/UNIX提供支持,Windows要迟个几
年);Windows 按微软的市场策略应该要求只有 Server、Advanced Server、Data
Center 版本才支持PAE,甚至 Windows Server 2003 Standard 版都不支持。事实上,
让Windows支持PAE而又不显著降低系统的稳定性和性能,这并不是一件很容易的事,
Windows 2000 Datacenter Server 就是因为性能下降严重而不得不放弃从 支持32GB 升
级到 支持64GB,而 Windows XP SP2 Professional 以及 Windows Server 2003
Srandard 都是因为稳定性原因而最终取消了PAE支持,至少微软是这么宣称的。要让那
些可以支持PAE的服务器版Windows启用PAE支持,则需要在 boot.ini 里面加上开关
“/PAE”,不过桌面版加这一开关不知道什么后果。(我只知道用于服务器版的/3G参数
放到桌面版会弄巧成拙,好处没得到,副作用倒是留下来了。)

如果上述因素都支持的话,那就只剩下一样了——应用程序。

其实即使应用程序不支持的话,多出来的内存也不完全是废物,至少操作系统可以拿这
些内存来充当超大的I/O缓冲区。或者也可以由OS把更多的虚拟内存页面存放在物理内存
中而非磁盘上,这样有许多页面调度操作就会发生在物理内存高端地址区和低端4GB地址
区之间,每一个正在工作的进程仍然只看到低端的4GB物理地址空间并在其中直接寻址,
至于高低内存区之间的换页完全是OS的事情,正如一直在内存与交换文件/分区之间发生
的换页操作那样。还有一种方式叫做PSE36,具体细节不清楚,但属于早已淘汰的技术,
因为使用了4MB的分页大小,这对于大部分实际应用来说都过大因而导致性能太差!

UNIX 高端服务器上还经常使用一种变通的办法来让一个应用程序使用大内存,那就是多
进程应用程序,因为进程之间是地址空间相互隔离的,每个进程各自直接寻址4GB空间,
整个程序就可以使用远多于4GB的地址空间,而又仍然只用到32位物理地址常量/变量。
用老学究的口气来说,这叫做 多地址空间 的 共享内存式 并行计算模型。

让32位的单一进程能掌控超过4GB物理地址空间,这才

是PAE技术的最终目标。以Win32体
系为例,除了操作系统和硬件的支持以外,实现这一目标的关键是一套API,称为
Address Windowing Extensions, AWE 。利用这一组API,Win32用户进程可以把32位物
理地址常量/变量扩充到36~40位,然后提交给 Windows Server 的PAE支持模块,从而
对 2^32 Bytes ~ 2^40 Bytes 大小的物理地址空间进行扩展寻址,也就是 4GB ~
1TB 。需要指出的是:原本32位CPU执行32位物理地址寻址的操作是非常快的一件事,而
现在每一次寻址都需要调用一次库函数来转换,这将会显著的影响执行效率;相比而
言,64位Windows上运行64位应用程序才是王道,你用超大内存干什么?不就是为了性能
嘛!






现在我给最近准备添加至>=4GB物理内存的同学几点建议:
Windows XP SP2 不支持扩展寻址,它对PAE的兼容仅仅是为了硬件DEP(Date
Execution Prevention),因此即使使用 /PAE 参数,也仅仅是显式的指定开启硬件DEP
而已。如果需要,可以考虑使用关键文件替换法使其支持真正的PAE。

Windows Vista 据说暂时没有任何一个版本支持扩展寻址,具体情况类似于 XP SP2,但
是又有消息说 Windows Vista SP1 可能加入对PAE的正式支持,我觉得希望不大。

也就是说,目前没有任何一个桌面版的 x86 Windows 操作系统真正支持PAE,因此最多
只能利用到4GB的物理地址空间,如果想要使用超大内存跑 Windows,建议选用 x86-64
Windows 操作系统并运行64位程序或者带有AWE的32位程序,(或者普通32位程序,如果
你只是为了在超大内存上感觉爽的话)。对于非专门设计的服务器,最好不要选用服务
器版的 x86 Windows 操作系统然后开启 /PAE 开关,因为一般的未经严格设计的驱动程
序很可能会和PAE机制发生冲突,造成系统不稳定。


最后还得提一下,这4GB物理地址空间并不等同于可用物理内存的大小!

32位内存控制器所能控制的物理地址范围是4GB,但是这4GB地址空间还要预先被分出去
几部分:BIOS的ROM,各种总线的保留资源,还有——显存。注意,显存和主内存在逻辑
上是一样的东西,只不过在物理上它离GPU更近一点而已,CPU也可以直接对显存中的内
容进行物理寻址。

OK,这样算下来,即使你插上4GB内存,桌面版32位Windows却认不出4GB来,它会认为大
概是3.x GB,至于多出来看不见摸不着的部分,似乎倒也不会对系统稳定性造成什么危
害……


相关文档
最新文档