- UID
- 1
- 阅读权限
- 255
- 注册时间
- 2006-7-24
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
楼主 |
发表于 2009-2-4 18:58:01
|
显示全部楼层
虚拟内存
) j& q" \, u' o% }6 x; [ 在早年的计算机中,地址的转换很单纯,有效地址就直接等于物理存储器的地址,这适合同一时间只有一个进程在运作。但Windows不会只有一个 Window,多进程并存是现代计算机的基本情形。后来人们决定为每个进程划定一块专用内存区域,这样可以让多个进程同时运作。但这种分段方式会让内存在进程开开关关的过程中产生很多碎片,很多小块内存无法被利用。由于内存空间总是相对有限的,因此应用程序也不能疯狂的将所有东西直接塞进内存当中。同时我们也不能依赖硬盘这个缓慢的二级存储器去充当内存,那实在太慢了。为了调和这个矛盾,操作系统都引入了虚拟内存机制。, S* z7 ]0 h: v @
, {* w" e; v( H8 e, R
i. R0 }8 \4 W( a7 ^2 w8 B# W: [ Windows的虚拟内存并非简单的指位于我们硬盘上的那个pagefile.sys文件,或者是在内存装不下的时候用于应急的“模拟内存”。在当代 Windows系统中,任何一个进程都会被赋予其自己的虚拟地址空间,这是一种逻辑地址空间,并不存在实体,该虚拟地址空间可以覆盖了一个相当大的范围。对于一个32位进程,其可以拥有的虚拟地址空间为2^32=4GB,典型情况为2GB用户空间,2GB系统内核空间(最大可调整为3GB用户空间和1GB 内核空间),这与安装了多少物理内存没有任何关系。每个进程的虚拟地址空间都会被标上各自的ID,这样两个进程之间的虚拟地址就不会互相干扰。虽然每一个 32位进程可使用4GB的地址空间,但并不意味着每一个进程实际拥有4GB的物理地址空间或使用4GB物理内存,虚拟地址仅仅是一种逻辑地址。
$ A1 C% i9 U& r6 f- k8 r3 x% F
9 b" U) L1 X, H8 \# B! D0 V- F% R
: k9 ^# k v D4 B" O O$ j 应用程序自然不能总在看不见摸不着的虚拟地址里溜达,最终还是需要实实在在的物理存储器关联。应用程序会去为其虚拟地址申请物理存储空间,这个空间通常会小于应用程序的总虚拟空间。这里所说的物理存储器并不局限于计算机内存,还包括在磁盘空间上创建的页文件(pagefile.sys),其存储空间大小为计算机内存和页文件存储容量之和(所以Windows自动管理时的pagefile.sys是很大的)。由于通常情况下磁盘存储空间要远大于内存的存储空间,因此页文件的使用对于应用程序而言确实相当于透明的增加了其所能使用的内存容量,只是速度慢了点。有了虚拟内存的存在,程序本身就不用完全装入内存,或者完全存于硬盘,系统会将目前需要的部分读入内存处理,暂时不需要的就放在硬盘的页文件留作交换。不过CPU并不能直接去访问磁盘上的信息,每次磁盘访问都必须通过内存,所以若所需的内容在磁盘上的页文件中,就需要先加载到内存然后访问。
0 b* [& n( v0 b- a; F+ `$ v8 V! S; G; @
应用程序本身并不关心自己占用的内存大小,它只要求提交物理存储器,无论是磁盘还是内存。那么自然是尽量分配更多的高速的内存作为物理存储器最佳,所以我们也知道内存大的机器在大量应用程序启动时会快。当一个进程的虚拟内存提交的物理存储器是物理内存时,我们就可以省去从磁盘的页文件加载数据到物理内存的时间,程序的工作效率自然就会提高。尽管我们的内存超出了32bit系统的地址结构范围,但我们只要将4GB地址以上的物理内存为虚拟内存所用就不会浪费内存了。 A. a: E8 F- H5 y9 @+ }+ F( w
3 E" e. K& \0 t" x6 h
物理地址扩展(PAE)
5 V5 ]$ C; E3 f5 }) A# M7 z" P- I6 W0 j4 w |; [
3 G: n4 A. \+ b! X 物理地址扩展(PAE)是早在Pentium Pro时代就有的东东,它可以提高IA32处理器应对4GB以上内存的能力。当启用 PAE之后,Windows操作系统将从两级线性地址转换变为三层地址转换,额外的一层转换用于访问超过4GB地址的物理内存,可以将超出4GB地址的物理内存映射为应用程序进程的虚拟地址空间以提升虚拟内存性能。地址窗口扩展(AWE)更是可以将未分页的物理内存转换到进程的虚拟地址。通过PAE,我们可以完整的利用到被回收至4GB以上地址的那部分内存。
. b' r+ O* r& w8 c4 K3 b+ k# y8 K9 U- z& {
& S8 G/ e1 t, B& [7 H. e 至于开启PAE的方法网上遍地都是,我想就不用在这里多费笔墨了。而且事实上,操作系统多数情况下会自动开启PAE,在使用多核心处理器时,无论安装多少物理内存,Windows都会因处理器需要而默认开启PAE功能。换句话说,在这个双核心处理器普及的时代我们基本上不用去考虑PAE的开启问题。! @3 t4 W: `% @5 K2 w( [" K
* R8 d a. w! D2 z& b! q3 f
现在万事俱备,只要芯片组与PAE都正常运作,那么我们的4GB内存就1字节都不会少。
' i1 |# w/ R( {) g% {; w) D
! O5 ?8 D6 J$ F) x+ H; m
) f7 L v; K m# b3 U& B( M& i" {: }通过前面的讲述,我们现在明白了三点:1、MMIO只占据地址不占据内存空间;2、现代的芯片组和内存控制器完全具备回收(转移)与MMIO交叠的内存的能力;3、32bit操作系统通过PAE可以拥有访问位于4GB地址以上的内存的能力。5 A4 b" T) K5 h3 _
: H1 f) P/ N" X" s# A% K) n9 d
( C- E) l% \. e5 |3 V" c
然而多数人都会发现,我们虽然已经找到了开启4GB大门的钥匙,但却始终找不到钥匙孔。操作系统在多核心状况下PAE强制开启,处理器早在N年前就支持了PAE 36bit寻址,而PAE也处于活动状态,但我们始终就发现不了那完整的4GB内存。所有人都卡在了这里。
- t) N+ K* X' ^1 r; E1 n; y7 P# }+ N# M7 i
\* z; d$ k2 x0 k
事实上,Windows内部的一些设定(不排除是bug)限制了我们的内存使用,桌面版Windows(包括Vista旗舰版)的36bit寻址功能无论PAE是否处于启用状态都无法访问32bit以上地址,甚至可以说PAE根本是无效的。这样就无法去访问被芯片组转移到高地址位的内存,哪怕该系统本身完全具备了这样的能力。而同样最大只支持4GB物理内存的Windows Sever 2008标准版却可以通过PAE访问高位地址,去享受被芯片组回收和转移那部分内存。笔者现在并不知道究竟是那些内部设置或bug限制了桌面系统的PAE 功能,但我们有办法去改变现状。
' m0 ~, H" e+ \' O, x" ?
5 L0 ^. M/ K' m, O
. H9 G9 t" e& u- H# V9 i( N0 T 首先我们需要准备Windows Sever 2008标准版的tokens.dat文件和序列号。在C:\Windows\ServiceProfiles\NetworkService \AppData\Roaming\Microsoft\SoftwareLicensing中我们可以看到一个名为tokens.dat的文件,这一个软件许可文件,我们需要在他身上做点文章。该文件正常状态始终为Software Licensing服务调用,是不可修改或替换的,我们可以安全模式或者在禁用Software Licensing服务之后进行替换。我们要做的事情,就是用Windows Sever 2008标准版的许可文件替换Vista的许可文件。( h( S) @( d* D! S$ ]4 R4 Z4 E: c
+ G" s& f! M& X" q- E" Q
当文件替换完成之后,注销或者重启之后系统会提示当前序列号(Vista的序列号)不可用,要求输入新序列号,同时强制不可进入系统(安全模式正常)。此时我们输入Windows Sever 2008标准版的序列号,无论激活是否成功,序列号都会正确替换,同时重启后我们可以正常进入系统(若未激活会提示3天内激活)。许可文件对Vista的一些设置进行了调整,比如关闭Aero功能,开启事件跟踪程序之类Windows Sever 2008的特性。当然操作系统本身依然是Vista,我们可以打开Aero以及关闭不需要的服务器功能。
7 P4 K& h5 y, P5 q" ]4 R4 i, }
* v& _. f7 m# [3 f3 y7 |4 |) b4 Q4 U! [
欢呼吧,各位!尽管操作系统仍然是Vista,但由于内部某些设定的自动调整使得我们的操作系统完完整整、千真万确的利用到了所有的4GB内存。我们的内存不仅谁也没动,而且安然无恙的全部回来了。(若出现只显示2GB内存的状况,再次重启即可)
; v) j* y; b5 T& {5 i& y( u, u
' o) z+ |7 ]. C
6 k j% w2 G3 p4 m# ^; N 看看设备管理器中的地址分配,MMIO还是牢牢霸占着4GB以下的物理地址,但芯片组的Memory Reclaim功能帮我们找回了内存。而操作系统嘛,再激活一次就一切正常了。
3 q' x+ g. a' Z6 k% d8 u) Y5 Y# G/ _
( J6 _9 g! \4 I4 E$ {; R
1 [; ?! W# C! ` p- q% K( L
通过芯片组的 Memory Reclaim机制和CPU、操作系统PAE功能的正常运作,我们在32bit桌面系统上完整的利用到了4GB内存。这一切不能怪32bit操作系统本身,恐怕只能怪微软的设定(或bug)。不过无论如何,我们的内存谁也没动,并没有被任何东东占据我们的晶体管。
8 a( |" m5 G Y1 v' \. u6 K- v8 ]1 P$ A1 F% E. x) F
如果希望变回原版的Vista系统,只需要按照相同地方法替换Vista版的tokens.dat文件,并进行序列号更换即可。事实上我们或许不需要这样麻烦的去替换系统许可文件,相信只是一些内部设定妨碍了桌面系统PAE的正常发挥。笔者暂时恐怕无法找出究竟是哪一项设定造成的影响,期待各位热心的网友去发掘。
1 Q( O- V# ? p! n( [* J" M# _/ |5 p% M& N
修改许可文件之后会有一个后遗症,那就是Windows Update会认为你的操作系统是Windows Sever 2008,因而提供Windows Sever 2008版补丁下载。但是由于我们的操作系统是货真价实的Vista,所以安装Windows Sever 2008补丁会造成一些问题,请各位通过其他途径安装正确的Vista版补丁。 |
|