当前位置: 华文问答 > 数码

为何微软不在新的操作系统中让 32 位支持大于 4GB 的内存?

2014-02-13数码

先给一个参考文献:

The RAM reported by the System Properties dialog box and the System Information tool is less than you expect in Windows Vista or in Windows XP Service Pack 2 or later version

先说结论:

1、PAE允许操作系统在32位模式下使用大于4G的物理内存。

2、 不管是否使用PAE,对于单个进程而言,32位系统下可见的地址空间最大只有4G。

3、 PAE的优势是可以让不同的进程(在不同的地址空间里)累计使用大于4G的内存 ,因此而达到使用超过4G内存的目的。

4、WindowsXP系列虽然支持PAE,但实际在使用中最大内存限制在了4G, 是人为限制的 ,原因后面给分析(楼上给出的各种理由都不成立,这里是有技术原因的)。

5、Linux则在开启PAE的模式下能支持在32位系统中使用超过4G的内存。

然后给原因,其实就是我最初给的链接里的内容:

This issue occurs because of a design change in Windows XP SP2 that is also included in Windows Vista. The changes were made to PAE mode behavior to improve driver compatibility.

To reduce driver compatibility issues, Windows Vista and Windows XP Service Pack 2 or a later version include hardware abstraction layer (HAL) changes that mimic the 32-bit HAL DMA behavior. The modified HAL grants unlimited map registers when the computer is running in PAE mode. Additionally, the kernel memory manager ignores any physical address that is more than 4 GB. Any system RAM that is more than the 4 GB barrier would be made unaddressable by Windows and be unusable in the system. By limiting the address space to 4 GB, devices with 32-bit DMA bus master capability will not see a transaction with an address that is more than the 4 GB barrier. Because these changes remove the need to double-buffer the transactions, they avoid a class of bugs in some drivers that is related to the correct implementation of double buffering support.

英文比较长我大概解释一下(以下仅限x86-32/64bit平台,不考虑其它arch):

首先要先科普一下DMA:DMA的意思可以大概理解为:让硬件(比如显卡、声卡、USB、磁盘控制器等)直接操作物理内存,等操作完成以后返回一个中断给操作系统,告诉操作系统说我干完了。

DMA的好处就是:假如我想要往磁盘上写数据,数据已经在内存里了,那么CPU只需要把内存地址告诉磁盘控制器,剩下就不用管了,磁盘控制器完成写操作以后会告诉CPU说写完了,这个期间不耽误CPU做其它的事情。

DMA跟4G内存有什么关系?当然有关系了,因为 不是所有内存都是随便都能做DMA的

如果写过64位操作系统的驱动的话,应该会了解到:有一些外设是无法访问超过4G的内存地址的, 有些外设做DMA的时候,能访问的地址都是4G以下的地址 (如果我没记错,USB-EHCI控制器好像就是这样的)。

因此在64位操作系统里,所有DMA操作都是先专门申请一块专门的DMA内存(4G以下),然后再进行操作。而32位系统里,则一般没有这个限制。

好了,问题就来了:

微软的XP是十几年前的操作系统,在当时的硬件环境里,所有内存都是可以做DMA的。所以在XP的内核API里,没有考虑过内存不能DMA的情况,所以,XP里的各种驱动、软件在写代码的时候,也都没有考虑过内存能不能DMA,只要拿来用就是了。

而十几年间,硬件发生了翻天覆地的变化,而XP由于其强大的兼容性,这方面的API一直都没改进。况且,想改进也不行,因为 必须二进制兼容旧代码 ,并且由于这个兼容性的问题从XP一直延续到了Vista,所以包括Win7在内的各种版本,都必须保持这个兼容性。

二进制兼容这个巨大的包袱使得MS如果真使用了大于4G的内存,那么很有可能出现蓝屏之类的异常情况,因为微软也不知道用户的驱动代码是怎么写的,会不会直接使用内存进行DMA。

所以,微软强行把内存限制在4G以下是为了保持可恨的兼容性。

如果放弃了兼容性可不可以?当然可以了,但那就不是XP而是另一个版本的Windows了。

为什么Server版一直都支持超过4G的内存?因为Server版的驱动跟普通版的不兼容。

所以楼上的所有解释都是不对的, 不是市场定位或者照顾用户情绪或者不想让用户这么做 ,而是 因为兼容性无法保证DMA正确执行 (微软也解释的很清楚了,但是国内用户似乎没人注意)。

有人提了Ready For 4G,这东西会导致某些程序异常,原因就是这些程序在运行中尝试直接使用物理地址(很多软件就是这么流氓),而代码中获得的物理地址都是32bit的,在某些情况下代码中获得的地址不是实际的物理地址,而导致程序崩溃,说实话,没蓝屏已经很不错了。

如果要让Windows支持超过4G内存,那么几乎所有驱动都要重写一遍 ,这里还包括操作系统中运行的大量第三方未签名的驱动,这么大的负担显然是谁也承担不了的,因此在32位系统上无法使用4G内存。所以, 不是不想,是不能

评论里有人提出,如果专门识别一下驱动,对于非认证的驱动强制限制在4G以下,认证过的驱动允许使用高于4G的地址,这样是否可以?

答案是可以的。问题是这么做代价很大,内核中各个API都要多一条甚至几条检查路径来判断驱动的情况,甚至还要小心驱动代码直接用non-paged内存搞DMA,这么做效率就是一个问题,而且微软是无法拿到所有驱动的源码的,比如显卡厂商一般就只发布binary的驱动,所以,微软无法知道这个驱动里究竟搞了什么小动作。所以不得不把这条路堵死。