关于32位Windows最高支持内存数和虚拟内存的问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于32位Windows最高支持内存数和虚拟内存的问题
Windows作为一个现代操作系统,使用两种处理器访问模式(即内核模式和用户模式)来保护操作系统内部数据不被其它程序有意或者无意篡改。
这两种访问模式的体现,一是在内存管理上,二是在对系统服务和函数的有选择屏蔽上。
后者类似于一个类的私有和公有成员的区别,不需多说。
(内核模式程序包括Windows内核、执行体、设备驱动程序还有其它的相关组件;用户模式程序包括子系统、服务和我们平常用的大多数应用程序)
重点就是在内存管理上。
大家都知道Windows使用一种技术叫做虚拟内存。
但是很多人可能有点误会。
有些技巧中说到的“关闭(或者调整)虚拟内存”实际上应该叫“关闭(或者调整)虚拟内存页面文件”,它并不是Windows的虚拟内存机制本身。
(页面文件的作用是将内存中的页或即数据暂存(翻,page)到硬盘中,待需要使用时再将其读入内存——但是,要注意的是这种暂存并不是内存不足的时候才进行)
实际上,虚拟内存的作用简单来说就是将内存按照一定的单位进行组织,并使用虚拟地址重新映射(至物理地址)。
(这样就出现了一种状况,即一系列连续的虚拟地址所指向的内存页面,物理地址并不一定是连续的。
)
为了实现使用访问模式来保护系统数据的目的,系统有意地将虚拟内存的地址空间(即虚拟地址)进行分隔,规定用户模式和内核模式的虚拟地址空间为多少。
因此,用户模式的程序可以访问用户模式的虚拟地址空间,但是它不能随意访问内核模式程序的虚拟地址空间。
而内核模式的程序可以访问所有虚拟地址空间。
另外,用户模式的进程由于虚拟内存的保护,不需担心其它进程侵入到当前进程的地址空间中从而破坏数据或留下安全隐患。
说了这么多,有人会问:这和4GB内存识别有什么关系?
其实,正因为虚拟地址空间被分隔了,所以对用户模式程序来说,可访问的地址空间只有分给用户模式程序的那点而已。
这个地址空间的大小就是系统属性里面显示的那个内存大小。
对32位Windows来说,其虚拟地址空间总数就是2的32次方,即4GB。
如果没有在引导时加上/3GB或/BOOTV A选项,Windows默认最大会分2GB给内核模式程序使用,2GB给用户模式程序。
分配方式是,从地址0x00000000到0x7FFFFFFF(4GB地址空间较低的一半)分给用户模式,剩下的就是内核模式的了。
所以,第一个问题,“Windows XP为什么识别内存只有2GB或者3GB”,原因正在于此。
(如果加了这两个选项,那么Windows会分3GB给用户模式,1GB给内核模式。
但是不管怎么分,用户模式程序是没法用到全部4GB的虚拟地址空间的)
关于这个默认的分配,请参考/zh-cn/library/bb124810(EXCHG.65).aspx这篇文章第一段的内容。
(另外有人可能会问:“那机器没装够4GB内存的时候是怎么分配的?”
答案就是,Windows默认会分配相当于物理内存容量大小的虚拟地址空间一半给内核模式,
一半给用户模式。
即50%:50%的比例
但是这时显示行为会有所变化——系统属性会显示所有物理内存大小)
到了Windows XP SP2及其以后发布的操作系统和Service Pack,情况有了一些变化。
Windows从这时候开始,已经不是单纯死板地这样分配4GB的虚拟地址空间,而是倾向于动态的内核模式地址空间分配(要多就分多,否则就分少)。
Windows Vista(32位)下,内存管理器完全实现了动态的内核模式虚拟地址空间分配。
因此大家在Vista下看到的内存大小(比如3.25GB)正是因为内核模式虚拟地址空间动态分配后的结果。
(关于这个请参照/zh-cn/magazine/cc162480.aspx(Windows 管理: 了解Windows Vista 内核:第 2 部分)这篇文章,“动态内核地址空间”这一节。
作者是Mark Russinovich,就是写Process Explorer工具的那个)
既然32位Windows的虚拟地址空间只有4GB大小,那么32位Windows就只支持4GB的物理内存吧?
很遗憾,这种观点也是错误的。
其实32位Windows不管系统物理内存有多少,它只会映射这4GB的虚拟地址空间。
也就是说,你不需要做任何额外的操作就可以直接使用这4GB虚拟地址空间。
那剩下的物理内存怎么办呢?32位Windows有一个机制,名叫地址窗口扩展(AWE,Address Windowing Extension)。
这个机制是给程序员准备的,作用是提供了一种方法,可以让程序员将4GB以外的物理内存地址映射到已被分配的用户模式地址空间中。
(即一个多对一关系,多于用户模式地址空间大小的物理内存挤在用户模式地址空间里;而且这是要程序员自己实现的,系统并不会帮你实现)
这个机制可以使一个用户模式的应用程序申请多达64GB的物理内存(当然,由于4GB虚拟地址空间的限制,如果同时要使用这么多内存肯定是不太可能的)。
用Windows Internals, 4th Edition这本书的原话来说——
“虽然AWE将管理“虚拟内存-物理内存”映射关系的负担放到了程序员的身上,但是,它确实解决了问题”
所以,32位的Windows并不是只支持4GB的物理内存(你装8GB也可以,只不过如果想用到额外内存的话会很费力气)。
那……64位呢?
64位的Windows就比较轻松了——(以Windows XP Professional x64 Edition和Windows Server 2003族为例)
x64版本:内核模式系统空间是6657GB,用户模式空间是8192GB(8TB)
IA64版本(就是用安腾处理器的那个):内核模式系统空间是6144GB,用户模式空间是7152GB(7TB)
所以,总结一下就是:
1、你在系统属性里看到的内存大小实际上是分给用户模式程序的虚拟地址空间大小(若内存不够用户模式虚拟地址空间大小的最大值则显示实际内存大小),并不是物理内存的实
际大小;
2、剩下“丢失”的内存(即4GB减去你看到的大小之后的剩余部分)都是内核模式程序在用(Windows内核、执行体、设备驱动程序还有其它的相关组件);
3、Windows Vista(及其以后的操作系统,包括2008)使用了动态内核模式地址空间,因此在系统属性里看到的内存数可能会比Windows XP/Server 2003的要多;
4、虚拟内存页面文件属于虚拟内存里的一个机制;
5、32位的Windows不是只支持4GB物理内存,而是只支持4GB的虚拟地址空间。
理解这一点是最重要的。