虽然通过Memory Remapping(内存重映射)可以解决大部分MMIO(内存映射IO)的问题,不过有些时候,人们会碰到这个情况:
DELL机皇XPS 730上的4GB只被Vista认出约2GB内存
近些年,在一些高端的桌面系统上,使用32位操作系统会碰到如图的问题:可用内存容量非常之低,一些PC供应商会正确地指出,这是高档显卡占用了。实际上,是这些显卡的MMIO空间占用了,如下图所示:
一些具备怪兽级别显卡的4GB内存系统实际只有可怜的2GB可用(基于最新的BIOS,比上图多了256MB容量)
这台DELL XPS 730配置了NVIDIA 790U主板,以及两块ATI 3870X2显卡,每块3870x2显卡里面包含了两个3870 GPU——也就是RV670显示核心,ATI也将2颗RV670叫做R680。单颗RV670拥有320个流处理器,支持DX10.1和SM4.1,拥有256bit的显存带宽,基层UVD单元支持高清视频解码功能,2颗RV670组成的R680拥有640个流处理器,512bit的显存带宽,核心频率为825MHz,显存大小为1GB(每个核心512MB),频率为1800MHz。在XPS 730里面里,我们可以看到它们占据了90000000 - 9FFFFFFF、A0000000 - BFFFFFFF、B0000000 - BFFFFFFF、C0000000 - CFFFFFFF这四段每段256MB的空间(从2304MB开始到3328MB),这样就整整少了1GB的可用内存空间。很多高端PC都有这样的问题,形成了很滑稽的情况:花了大价钱却只得到很少的可用内存,严重影响到日常操作乃至游戏、工作(主要指图形编辑等)。
一些人可能会认为32位操作系统可以解决问题,实际上这个方法并不总是可以工作。DELL XPS 730上我们尝试了32位的Windows Server 2003和Windows Server 2008,可用内存实际上并没有发生变化,为什么呢?
部分原因是设备的问题,Windows产品组的工程师发现,很多测试计算机会发生崩溃、挂起,或者无法启动的故障现象,某些设备驱动程序——主要是一些桌面计算机(而非服务器)上的显卡或者声卡——其驱动程序在编写时没有考虑到内存大于4GB的情况。所以,这些驱动程序会截去那部分地址,从而导致内存冲突以及其他副作用。较早期的NVIDIA驱动在4GB或以上就有问题。当然现在情况已经好转了。
为了确保兼容性,应对设备的这些情况,一些主板固定地将他们的MMIO保持于低于4GB的空间,这样实际上就丢失了Memory Remapping的大部分内容,哪怕理论上说操作系统(如使用Windows Server 2003和Windows Server 2008)可以使用PAE可以对高于4GB的MMIO空间进行寻址。对于XPS 730的主板来说,情况就是它无法将MMIO映射到高于4GB的空间(很可能它就不支持Memory Remapping技术)。
64位不需要Memory Remapping,虽然显卡的MMIO空间仍然在4GB以下,仍然比32位多出1GB以上的可用内存
在我们安装了Vista x64之后,内存终于正常了,虽然这块NVIDIA 790U主板仍然不痛快地将3870x2的MMIO空间设置在2GB开始,不过可用的内存(任务管理器下)达到了3394MB(在以及打开了几个应用程序的情况下),整整比32位下多了1GB以上。如果我们要购买高端游戏计算机,则应该请OEM厂商预装64位Windows。
注意:假如你也想看自己电脑上的设备内存地址占用,要记住32位下看到的地址总是低于4GB的,因为Memory Remapping是在硬件层次(内存控制器)做出的变动,因此操作系统是无法看出来的。