當前位置: 華文問答 > 數碼

為何微軟不在新的作業系統中讓 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的驅動,所以,微軟無法知道這個驅動裏究竟搞了什麽小動作。所以不得不把這條路堵死。