限制内存使用的因素

一个系统的内存大小限制取决于CPU和操作系统,当然啦,也受限于物理硬件,比如主板、安装了多大的内存条等等。

众所周知,32位的Intel CPU能够支持4G的物理内存,打开PAE后(有36根地址线)可以支持64G的物理内存。对于Linux而言,一个进程空间的大小为4G,其中用户空间可以使用3G。

那么64位系统呢?

理论上讲,64位的地址总线可以支持高达16EB(2^64)。EB是什么概念,我也不晓得。K->M->G->T->P->E

    The emergence of the 64-bit architecture effectively increases the memory ceiling to 2^64 addresses, equivalent to approximately 17.2 billion gigabytes, 16.8 million terabytes, or 16 exabytes of RAM.
    From: http://en.wikipedia.org/wiki/64-bit#History

但实际上,这么大的地址空间对于目前的形式而言绝对是浪费了。

AMD64架构支持52位(4PB)的地址总线和48位(256TB)的虚拟地址空间。

    The AMD64 architecture has a 52-bit limit on physical memory and currently only supports a 48-bit virtual address space[1]. Still, that represents 4 petabytes and 256 terabytes respectively.
    From: http://en.wikipedia.org/wiki/64-bit#Limitations

64位的Linux则分别支持46位(64TB)的物理地址空间和47位(128T)的进程虚拟地址空间。

    64-bit Linux allows up to 128 TiB (140,737,488,355,328 bytes) of address space for individual processes, and can address approximately 64 TiB (70,368,744,177,664 bytes) of physical memory, subject to processor and system limitations.
    From: http://en.wikipedia.org/wiki/X86-64#Linux

即便这样,在目前的应用下也绝对够用了。



windows

简单的说x86代表32位操作系统 x64代表64位操作系统。如果你的CPU是双核以上,那肯定支持64位操作系统了。如果你的电脑内存大于4G,那就要用64位的系统了,因为32位的Windows 7也好,Vista也好,最大都只支持3.25G的内存。而64位的windows 7最大将支持128G的内存。
_________________________________________________________________________________________________


PS:有很多人有误区,甚至包括一些计算机老师,比如认为32bit平台因为2^32=4G所以认为不能使用超过4G内存,然而接受这样的观点后很多人会对为何使用4G内存在系统中只显示3.25G有所疑问。网上也有很多相关文章专门谈这个问题,但是其中有不少错误的认识,而且条理不清。故撰此文,以尽可能简单的解释来清楚地解释这些问题。

程序使用内存到底能用到多大,跟CPU、内存控制器、操作系统、程序、主板都有关,其中支持内存最小的一个就是瓶颈。

CPU:能用到多大和CPU的位数没有直接关系。因为CPU的位数,即通用寄存器的宽度并不等于地址总线的宽度。比如8086,16bit通用寄存器但地址总线是20bit(=1MB);P6架构虽然是32bit的,但其外部地址总线为36bit,寻址范围已经到了2^36=64G了;x86-64的AMD CPU,内存寻址范围是48bit(256T),没有达到64bit,虽然理论上能到但实际上没能实现2^64的寻址范围。所以一般来说CPU不是瓶颈,注意若在32bit系统下实现36bit寻址需要通过PAE(Physical Address Extension)。

主板:取决于主板有多少槽和芯片组最大支持容量。

内存控制器:如果是K8及之后的,因为集成内存控制器,所以是CPU负责,这一般没有问题,可达48bit。而对于intel CPU由芯片组负责,老的芯片组比如945就只能支持32bit寻址即4G,这就需要新的芯片组,如965系列寻址空间达到36bit,但实际最大支持8G。服务器芯片组一般实际支持得比较大,寻址空间一般为36/38bit。

操作系统:windows操作系统如果是64bit的,至少支持8G,无需PAE,目前支持容量最高的数据中心版本可支持2T,用的是44bit寻址(16T)但没有全开放。如果是32bit版本,XP和Vista任何版本皆最多4G,因为都不支持PAE。若用server版本,都支持PAE,可以超过4G,最强Datacenter版可达128G。

程序:对于32bit windows系统,无论真正可用内存有多大,用户模式的程序最大只能分配2G虚拟内存,其它部分由系统核心调用。用了4GT即4GB内存调优技术,可分配最大3G,仅server版支持,启动时加/3GB即可。如果程序设计时使用AWE API集而且系统支持PAE,寻址范围可以扩至64GB。另外驱动也必须合适,比如一些老驱动程序在大内存下不能正常工作。在64bit windows下,用户模式的程序直接就可以访问8T空间。

总之,若在32bit平台下使程序能够调用超过4G内存,需要windows server版系统+合适的芯片组+槽多的主板+合适的程序。如果只有普通的32bit程序,大内存至少可以减少不同程序虚拟内存间的抢占,让每个程序都获得尽可能大的虚拟内存,尽管上限仍是2G。


另一个问题:4G内存时,发现可见内存被吞掉750MB或者更多,是因为一些设备固定占据挨着并且低于4GB位置的一段空间,称为MMIO(PCI内存占其中很大部分),这是内存控制器将这些设备映射到这个地址实现的,好处是系统可以方便快速地通过内存地址来访问这些设备,但原来在这个部位的物理内存就访问不到了,很浪费,也叫memory hole,尤其是GPU越多占得越多。解决方法就是用内存重映射(Memory Remapping),内存控制器把这个部位的内存地址映射到4G位置后面的一段空间,然后将这样转化过的地址告诉CPU,这样CPU用大于FFFFFFFF的地址就可以访问到原本被MMIO覆盖的内存空间,就不会浪费了。

使用内存重映射,若是32bit操作系统的话必须支持PAE,否则高于4G的映射空间还是访问不了,不同操作系统对重映射支持也不同,server版比较好。芯片组必须支持重映射并且开启(对于A64及以后的是在CPU内的内存控制器实现),至少680i、955X、965系列及以上或者是服务器芯片组,如果主板BIOS没有相应选项而且默认是关闭的就不行。

对于XP,系统属性-常规下面显示的就是此时相对于操作系统全部能使用或者说可见的内存空间,不包括MMIO部分。注意对于Vista SP1,插了多少内存就显示多大,即使实际上根本不能全部利用。

_________________________________________________________________________________________
首先说软件方面
主要是操作系统的责任
其实像XP 32bit这样的操作系统设计上是支持4GB内存的(32bit版本XP最高支持4GB内存)
但是在整个IA32系统上位于4GB以下的内存地址在系统中被分为很多块(4GB到64GB同样被划成多块但不是这里需要讨论的)
其中主要包括了系统可用内存及PCI设备内存地址范围
操作系统中显示内存不足4GB的主要原因来源于系统地址中PCI设备的内存地址范围
这个范围是以256为基础成倍设定的
该PCI设备地址范围包括了系统BIOS/芯片组/IO/PCI区域/VGA等等等等
这些设备都是通过实际内存地址来通信的
该类地址被定义为内存映射IO空间(MMIO)
由于MMIO地址所占用的就是4GB系统地址中部分物理内存所对应的地址
此时被其占用的对应地址的原物理内存部分就完全无效了
这就是软件方面大多32bit Windows操作系统为什么在使用4GB内存时只能看见3到3.25GB的罪魁祸首

然后是硬件方面
在物理内存槽中镶着4GB内存的时候正好包含到系统地址中第一个PCI设备地址范围(MMIO)
正如上面操作系统所要求的
对MMIO的寻址部分被内存控制路由到对应的设备上
而这些设备使用的地址正是4GB系统地址中对应物理内存地址的一部分
此时它所对应的应该是实际物理内存的那部分地址就没有了(被MMIO取代)
附和操作系统来完成这一罪恶行径的正是内存控制器

那么失踪的内存还有没有办法捞回来呢
答案是肯定的
需要说明的是捞回这部分内存有前提条件
同样要从软硬件两方面下手

软件方面
NT核心的操作系统所要完成的是对PAE的支持和4GB内存调整优化
而后支持PAE的操作系统会通过AWE使每个程序的虚地址范围可以突破2GB的限制最高到64GB(64bit操作系统暂无此类问题)
那么操作系统方面解决问题的关键在于支持PAE
Win2000开始微软的操作系统基本都支持PAE
4GB内存调整优化通过/3G启动参数来启用(本质上还是对PAE的支持)

硬件方面
要捞回这部分内存就是要将这些被MMIO占用的系统地址重新被路由到对应的内存上
为了解决这个问题引入了一种叫内存重映射(Memory Remapping)的技术
Memory Remapping技术最早是在服务器上使用的
在内存重映射启动后CPU要使用这部分被MMIO占用的物理内存时会通过PAE向高于4GB的空间寻址
此时CPU自身并不具备鉴别哪些是MMIO哪些是重映射的部分的能力
需要内存控制器将其重新转换到实际物理内存上
由此才能捞回那部分失踪的内存
这个累活完全是属于内存控制器独享的(自作自受)

那么只要你使用的是Win2000之后的操作系统
能否捞回它们的关键就在于是否支持内存重映射技术(Memory Remapping)
换句话来说
如果你用的是Intel系统那就需要确定你主板北的桥芯片是否支持Memory Remapping(Intel目前将内存控制器集成在北桥芯片中)
如果你用的是AMD的系统的话那么就需要先确定你的CPU是否支持Memory Remapping(AMD目前设计的内存控制器集成在CPU中)
从掌握的资料来看Intel支持该技术的桌面芯片组是i955X之后的所有支持8GB内存的型号
AMD支持该技术的桌面CPU为Athlon 64(不含闪龙)以上支持8GB内存的型号
同时我们必须在BIOS内打开Memory Remapping的选项才能正式开始捞回失踪的内存

猜你喜欢

转载自ihyperwin.iteye.com/blog/1530648