服务器 频道

谁限制了4GB内存 32位Vista大内存实战

  【IT168评测中心】虽然现在已经广为人知,然而在两年前,在少数桌面用户踏入4GB内存领域的时候,它们会碰到一个32位Windows无法应用3GB(具体数值根据情况有些变化,但不会大于4GB)以上内存的问题,随着当时的九阳神功秘籍 4GB内存平台全探秘,大家逐渐知道4GB用不满是因为一个叫做MMIO(Memory Mapped I/O,内存映射IO)区域存在的缘故。

典型的3.25GB容量


  虽然笔者写了一些文章建议大内存用户们转向64位Windows平台,不过,不少人仍然喜欢留在32位世界,有什么方法可以让他们也能应用4GB以及4GB以上的内存呢?为什么同样是32位,服务器版Windows就能使用更大的内存呢?本篇文章就试图研究一下这个问题。

九阳神功秘籍 4GB内存平台全探秘

突破4GB内存屏障 64位平台解析(上)

突破4GB内存屏障 64位平台解析(下)

64位才好用 亿能4GBx2 DDR2800内存套装

  在继续之前,首先来看一些各种Windows对内存支持的限制:

Windows Vista、Windows Server 2003、Windows Server 2008
操作系统内存支持对比
IT168评测中心
操作系统内存容量
Windows Server 2003 Web Edition2GB
Windows Vista Starter
Windows Vista Home Basic
Windows Vista Home Premium
Windows Vista Business
Windows Vista Enterprise
Windows Vista Ultimate
Windows Server 2003 Standard Edition
Windows Server 2003 R2 Standard Edition
Windows Server 2003 Standard Edition SP1
Windows Small Business Server 2003
Windows Home Server
Windows Storage Server 2003
4GB
Windows Storage Server 2003 Enterprise Edition
Windows Vista Home Basic x64
8GB
Windows Vista Home Premium x64
Windows Server 2003 Standard Edition x64
16GB
Windows Server 2003 Enterprise Edition
Windows Server 2003 R2 Standard Edition x64
Windows Server 2003 Standard Edition SP1 x64
Windows Compute Cluster Server 2003 x64
Windows Web Server 2008 x64
Windows Server 2008 Standard x64
32GB
Windows Server 2003 Enterprise Edition SP2
Windows Server 2003 Enterprise Edition x64
Windows Server 2008 Enterprise
Windows Server 2008 Datacenter
64GB
Windows Server 2003 Datacenter Edition
Windows Vista Business x64
Windows Vista Enterprise x64
Windows Vista Ultimate x64
128GB
Windows Server 2003 Datacenter Edition x64512GB
Windows Server 2003 R2 Enterprise Edition x64
Windows Server 2003 Enterprise Edition SP1 x64
Windows Server 2003 R2 Datacenter Edition x64
Windows Server 2003 Datacenter Edition SP1 x64
1TB
Windows Server 2003 Enterprise Edition SP2 x64
Windows Server 2003 Datacenter Edition SP2 x64
Windows Server 2008 Enterprise x64
Windows Server 2008 Datacenter x64
Windows Server 2008 IA64
2TB

  特别说明的是,Windows 7将会支持最多192GB的内存(64位版本),服务器版本不会叫做Windows 7 Server,而是叫做Windows Server 2008 R2。

  大概很多人都知道,Windows Vista和Windows Server 2008都基于相同的代码树,也就是说,它们的核心是很相似的(这一点和Windows XP以及Windows Server 2003不同;不过,Windows XP 64bit和Windows Server 2003 64bit是相同的代码树)。据说,这样是为了维护方便:只需要研发一个补丁,就能同时应用于Vista和2008。例如,Service Pack 2就能同时应用于Vista和2008(现在已经有了5种语言的正式版SP2)。


Vista SP1的幻象:插有多少内存,Vista SP1就会显示多少,不过任务管理器里面只会有3.25GB左右

  实际上,Windows Vista SP1和Windows Server 2008的很多核心文件都是一致的(2008推出的时候SP1已经发布了,因此直接就集成了SP1,或许准确地,所有的2008都应该叫做Windows Server 2008 SP1),也许我们能通过简单的方法让32位Vista能像32位2008一样,可以使用超过4GB的内存。

  很幸运,和XP不同,32位Vista的4GB限制确实不是核心代码上的限制,而是一些其他的限制:在系统启动的时候,将会读取一个值,这个值最终确定了用户可以使用的内存。这个值叫做Kernel-WindowsMaxMemAllowedx86,通过一个未公开的函数ZwQueryLicenseValue来读取,这个值代表着可用的最大内存,如32位Windows上总是0x1000,单位是MB,也就是代表着4GB。

  更多的核心内容,可以看这里(英文):Licensed Memory in Windows Vista,国外的先贤对其进行了系列的研究。

附概念澄清:32位操作系统并不意味着只能使用4GB内存

  从硬件上讲,所谓的计算机位数是指处理器指令的长度,对硬件来说就是通用寄存器(GPR,General Purpose Registers)的宽度,它并不意味着地址总线的宽度,虽然有些情况下它们碰巧也会相等。对于当前的从80386开始算起的大多数x86处理器来说,通用寄存器的长度就是32位,支持x86-64(或者按照更常见的说法:x64)的处理器则可以支持64位的通用寄存器。32位的PowerPC(G5之前)使用32位的通用寄存器,指令长度固定为32位,DEC Alpha64则基于64位通用寄存器,指令为64位。


Intel Pentium PRO运行16/32位混合操作系统Windows 95很慢,性能甚至低于运行纯32位操作系统Windows NT

  32位操作系统指的它的指令们只使用32位宽度的GPR,并不意味着它只能的内存寻址就是32位。实际上,早在Pentium Pro(Pentium Pro是一个纯正的32位处理器)上就采用了36位的地址总线(基于这个原因,PAE有时也被称为PAE-36bit),寻址能力就达到了64GB,这个简单有效的扩展就被称为PAE(Phsical Address Extension,物理地址扩展),可见10多年前,x86处理器就能支持这么多的内存了。一再认为32位系统只能支持4GB内存在硬件上就错了。

 
32位XP/2003操作系统通过PAE来支持4GB以上的内存,因此具有“物理地址扩展”的字样


但是32位Vista/2008内部直接使用64位PTE,因此就没有了PAE相关字样

  在现代操作系统上,如32位的Windows Vista/7,为了实现与64位的兼容(如,为了驱动程序编写的方便),系统使用了64位的PTE(Page Table Entry,分页表)来管理内存,因此它们就和64位版本一样,也能管理和使用更大的内存。

  既然知道了32位Vista通过ZwQueryLicenseValue函数来决定系统能使用多少内存,而不是通过编写内存管理功能时就加上的限制,那么相对来说,让32位Windows突破4GB的限制就比较简单了。

  启动时系统在NTKRNLPA.EXE内核文件中使用了这样的代码:

 

Opcode Bytes
操作码
Instruction
汇编指令
7C xx
jl      default
8B 45 FC
mov     eax,dword ptr [ebp-4]
85 C0
test    eax,eax
74 yy
je      default

  执行中,eax寄存器中保存了ZwQueryLicenseValue的状态值,在通常情况下,系统跳转到default代码段,不允许使用超过4GB容量内存,通过简单的修改就可以让系统认为ZwQueryLicenseValue返回128GB的可用容量:

Opcode Bytes
操作码
Instruction
汇编指令
B8 00 00 02 00 
mov     eax,00020000h 
90
nop
90
nop

  nop是空操作的意思(no operation),20000h就代表着128GB(16进制值)。以下是上述指令在英文版本Vista上的位置:

Version
版本号
Package
版本
File Offsets
文件偏移量
6.0.6000.16386Windows Vista0x003040B1, 0x003040F2
6.0.6001.18000Windows Vista SP10x00309AA3, 0x00309AE4

为了安全,一般建议,修改后的内核文件名为NTKR128G.EXE

  温馨提示:修改核心文件具有风险,此文仅用于研究用途。

  虽然知道原理之后还有很多操作,如,数字签名等操作,不过这些都是为人熟知,因此已经有不少的补丁实现了该大内存支持修改理论,有一个国内的圣贤实现的版本:


如图,请自行思考如何获得该软件

简单地按下“应用”按钮

一个新的核心文件就出炉了

该补丁还提供了一个自动修改启动选项以应用NTKR128G.EXE的命令行批处理文件

自行进行修改
为了安全,这个补丁默认启动正常的核心文件,需要手动选择加入的新选项才能使用NTKR128G.EXE启动

  以下为可选命令:

启动菜单10秒选择时间:
bcdedit -timeout 10

将指定的GUID代表的启动选项设置为第一项,GUID可以通过bcdedit命令显示出来(resumeobject):
bcdedit -displayorder GUID -addfirst

修改默认启动为GUID代表的启动选项
bcdedit -default GUID


6GB容量

  成功之后,系统将可以应用超过4GB以上的内存。

  虽然经过修改,已经解决了大内存支持的问题(顺便也解决了MMIO吃掉内存的问题),然而,在32位环境无法解决的是,进程的地址空间的问题。因为架构的原因,现代的普通32bit操作系统上,每一个用户模式的应用程序可以寻址的通常只有2GB(有一个选项可以让其增大为3GB)。提供多于4GB容量的内存,每一个用户模式的应用程序可以寻址的容量仍然没有改变——尽管不同的应用程序都具有互相独立的的2GB寻址空间可以让大内存电脑同时运行多个不同的程序。


通常,64位的应用程序才可以使用超过2GB的内存;64位应用程序的寻址空间是4TB
图中部的Virtual Size显示了一个程序使用的地址空间,Working Set则是其所有占用的内存(包括映射的系统文件),Private Bytes则是完全由程序自己占用的私有内存

  通常的应用程序就受到了这个限制,例如,在使用如Maxthon这样的多页面浏览器打开70个图片页面的时候,程序的寻址空间就已经到达2GB了,这时虽然其工作集并不大,然而程序已经无法寻址更多的内存;继续打开新的页面只会让Maxthon崩溃。

 

  为了让程序突破2GB寻址的限制,近代Windows NT核心提供了一个变通的方案:4GB内存调整优化技术,通过这个技术,可以将用户模式的寻址空间扩大至3GB,这样核心寻址空间便被限制为1GB了,需要超大内存容量的应用程序可以从这个特性中获得性能改善,如SQL Server数据库这种类型。要使用这个4GB内存优化技术,用户需要在Windows Server操作系统的启动参数中加入/3GB开关。这个特性同时需要操作系统打开DEP(数据执行保护,其实/3GB开关需要的是PAE的支持)。

  对于一个用户进程来说,默认的2GB可能已经足够,然而对于操作系统核心来说——所有的内核模式程序包括内核、驱动程序、系统缓存等都共享着相同的2GB空间(或者1GB;从这点上看,Windows已经不怎么具有微内核的样子了,为了性能,Windows将许多本应该放在用户模式的系统服务都放进了内核),在一个大系统上很容易受到限制。如上图这样,系统的System Cache总不会超过2GB(还要加上核心内存的占用),这样Superfetch也就无法发挥最大的作用。

  【IT168评测中心】除了破解NTKRNLPA.EXE文件之外,以往还有一个方法来应用超过4GB的内存:RAMDISK,通过启动时装载的内核模式驱动,它也能让超过4GB的内存得到一些应用。显然,破解的方法更为灵活一些,不仅仅是RAMDISK才能使用4GB以上的内存。并且破解之后一样可以使用RAMDISK。


32位Windows Vista突破4GB容量限制(也可以应用于Windows 7)

  然而,由于上一页所说的限制,使用64位操作系统仍然是推荐的,不仅仅是为了支持的最大内存容量更大,而是为了更强大的操作系统内部数据结构。

64位系统:系统缓存、分页池和未分页池(较小的系统缓存是因为笔者使用了一个应用软件来限制的缘故)

  系统资源主要有四种:分页池、未分页池、系统分页表和系统缓存,System Cache系统缓存容易理解(用来缓存读取的各种程序/文件),系统分页表则是用来保存所有线程使用到的堆栈(Windows所有的线程都具有自己的堆栈),分页池和未分页池则是所有程序的核心模式组件使用到的内存部分,区别只是未分页池里分配的内存是不能交换到虚拟内存上面的,分页池上的则可以(从而可能保存到磁盘上去,当程序需要这些页面的时候,再读到内存里面来)。例如设备驱动就使用未分页池(假如放到虚拟内存并被交换到磁盘上时可能会发生灾难性的后果)。这些资源短缺的时候系统将会发生不可预料的事情,分页池吃紧的时候系统将会频繁地使用虚拟内存,从而不停读写磁盘减低性能,而未分页池吃紧的时候系统多半已经踏入鬼门关了。

  由于这些资源共同占用着相同的内核模式地址空间,因此在32位条件下很受限制,并且稍有不慎就会导致短缺,在64位环境下,这些资源的上限都可以达到128GB,因此系统运行起来会更加稳定,可以支持更多的进程/线程运行——也就是打开更多的窗口,运行更多的程序(从这点上看,32位的Vista也多少具有这些特征,虽然无法突破4GB的限制,不过系统资源的分配没有太过于固定的限制)。

九阳神功秘籍 4GB内存平台全探秘

突破4GB内存屏障 64位平台解析(上)

突破4GB内存屏障 64位平台解析(下)

64位才好用 亿能4GBx2 DDR2800内存套装

0
相关文章