32位,64位和內存的那點事

這兩天果殼上有些人問到了關於在32位系統下使用4G或以上內存的問題。對於“32位操作系統能否使用4G或以上的內存”這個問題,在網絡上爭論也是很多。下面,我就我自己對操作系統內存分配的理解,談談我的觀點。

         32位、64和“最大內存量”是怎麼回事

     首先需要明確一下,32位也好,64位也好,這個概念是同時存在於軟件、系統、主板芯片組和CPU四個方面的。對於操作系統到底最多能支持多少內存這個問題,其實不是操作系統一方面說了算的。

     目前不少人可能對於CPU的尋址概念有些模糊,認爲CPU的尋址範圍與其平常概念上的位寬直接聯繫,即所謂的32位CPU尋址範圍爲2^32,64位的則是2^64。其實這是一個錯誤的概念,對於CPU來說,這個的位寬一般是指是其數據總線位寬,和尋址能力並無直接聯繫。至於一個CPU的尋址位寬是多少則要看其具體的設計。

     而對於主板芯片組這方面來說,目前的Intel x86平臺採取的是內存映射技術(Memory-Mapped I/O, MMIO),也是PCI規範的一部分,也就是將I/O設備放置在內存空間而非I/O空間,從處理器和操作系統看來,訪問一個硬件也就是訪問內存空間,因此主板的芯片組也存在一個尋址位寬的問題,當然也有可能成爲內存總量的一個瓶頸。當然了,現在的新主機一般都不會有這個問題了。

     說完了硬件層面的概念,我們繼續看操作系統是如何與CPU進行“交流”的:

     Windows對於內存的管理,採取的是分頁機制,每個進程都佔有一定的虛擬地址空間,在這個機制下,這個空間一部分被映射到物理內存,一部分映射到虛擬內存(存在於硬盤上的一個或多個空間),還有一部分則可能什麼也沒有映射。同時,在CPU中,會設置一個“分頁標誌位”,如果CPU在運行指令時發現這個分頁標誌被設置,則會根據頁目錄和頁表中的對應關係,將指令中的虛擬地址轉換爲實際的物理地址。

     目前的32位系統分頁大小爲4K,尋址位寬爲32位,因此,第0個分頁的地址是0x00000000,第1個分頁地址從0x00001000開始,以此類推。所以,在目前的32位系統中,用到了32位中的高20位來標記物理頁,剩餘的12位用於添加一些標記信息等。這樣,就可以支持到最大(2^20)*4096=4GB內存,除掉我們上面所說的爲I/O保留的內存映射空間和操作系統本身保留的內存,剩下的就是我們在任務管理器裏能看到的可用空間。

上圖顯示的是我的電腦目前的內存分配情況

32位系統下的悲劇,這個圖是從網上搜羅來的

 

如何突破32位系統的4G限制

其實PAE並不是一個新鮮東西,也不是操作系統弄出來的特性

爲了對PC服務器提供大內存的支持,Intel採取了物理地址擴展(Physical Address Extension, PAE)的技術,將現有的IA32架構的處理器的地址總線從32位擴展到了36位,這樣從硬件層面來看,可以支持最多64G的內存。至於操作系統要如何實現對多出來的這幾位進行內存地址映射,簡要的說就是將原有的分頁表結構改成了三層結構。

     根據微軟官方的說法,下述系統支持開啓PAE功能:
          • Windows 7 (32 bit only)
          • Windows Server 2008 (32-bit only)
          • Windows Vista (32-bit only)
          • Windows Server 2003 (32-bit only)
          • Windows XP (32-bit only)
          • Windows 2000 Datacenter Server
          • Windows 2000 Advanced Server

     具體實現步驟可以見微軟官方文章:http://msdn.microsoft.com/en-us/library/aa366796%28v=vs.85%29.aspx

     在這裏,推薦大家用一個叫Ready4GB的小程序,可以自動完成改造工作。

          開啓PAE的兼容性問題和收益

     關於開啓PAE以後的兼容性問題和是否有效可能是大家最爲關心的問題了,根據微軟官方的說法,PAE開啓後,可能會造成部分驅動程序的兼容性出現問題。事實上根據我自己的體驗,本人的NV 540M雙顯卡就無法正確工作在PAE模式下,查證後發現所有的Nvidia的雙顯卡都是不支持PAE的,網絡上也有少數人反應開啓PAE後會造成藍屏等現象,是否有相關性尚無明確驗證。所以具體情況要嘗試後才能確定了。

     說到收益,網絡上是衆說紛紜,很多人認爲即便開啓了PAE,單個32位程序也無法分配到超過4G的空間,因此無效。

     先簡要了解一下應用程序運行時的內存使用情況是什麼樣的:因爲不同用戶使用環境不會完全一樣,很顯然應用程序的開發人員不可能在設計階段去確定這個程序有多少內存空間可以使用。所以,正如前文所述,現在的應用程序運行時,都會分配到一個“虛擬”的內存空間,所有的內存請求都是在這個虛擬地址內完成的,然後再根據具體的內存映射關係,將這些虛擬地址轉換爲具體的內存地址,或者是上的硬盤空間,在這些地方讀寫具體的數據。

     因此關於上述說法,前半句是對的,對於普通的32位程序來說,無論工作在何種環境下,其始終都只能分配到最多4G虛擬內存地址(0x00000000-0xFFFFFFFF),而這4G內存,其中有2G是操作系統保留的核心內存,另外2G纔是程序的自由空間。這是32位程序的機制所決定的,即便我們將這些程序拿到現有的64位系統下運行,它們也只能分配到4G內存,2G可用內存。

應用程序內存分配示例

但是上述機制的存在絕不代表這PAE對於整個操作系統的性能沒有幫助,更多的內存有利於操作系統對多任務進行內存分頁,可以提高系統在多任務下的表現。總之,單個程序不能利用超過4G內存,不代表整個系統不能完全利用。

     另外,對於支持PAE的幾個系統來說,它們同時還支持另外一項技術:地址窗口擴展(Address Windowing Extensions, AWE)。這是一個程序設計時的接口,它可以使得32位程序訪問到超過4GB的內存,目前SQL Server是內置支持這項技術的。

     這幾個系統還有另外一個開關:/3GB,這個開關可以使得在給應用程序分配內存的時候,僅保留1G的核心內存,而將3G的內存保留爲應用程序可用空間。但是由於這個開關縮減了核心內存空間,可能會造成系統的穩定性下降,因此建議還是用AWE功能進行替換。

     最後,我還在網上搜索相關文檔的時候發現了一個很有意思的小東西4GB Patch(4GB補丁),這個程序聲稱其能改造普通的32位程序,使之支持2G以上的可用內存:http://www.saqqdy.com/computer-skills/64-windows7-system-to-support-32-bit-process-virtual-memory-4g 。

     本人學識粗淺,對操作系統核心瞭解有限。以上內容如有謬誤,還望各位高人給與指點。

 

 

轉自:http://www.guokr.com/blog/61322/

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章