2010年10月12日 星期二

關於記憶體上限的迷思!

http://www.mobile01.com/topicdetail.php?f=300&t=939023&p=2#10337281

http://www.shopping01.com/topicdetail.php?f=300&t=939023&m=f&r=6&p=29

以上兩篇,作者 ycweng 很用心的提醒大家。指正出目前大家對記憶體的迷思!
剛好上篇文章,我個人也寫了相關議題的文章,而且也是引用到錯誤的觀念。
MOBILE01有類似的討論文章 --> Here
所以,擷取了 ycweng 的文件,筆記起來好糾正自己的錯誤。
發送私人訊息 引用連結 載入圖片
這個問題...說真的...即使是正在念資訊 科系的,搞不清相關理論跟實務背景資訊的,所在多有,絕對不要用2^N次方這種計概所學的基本二進位算數來解釋N位元作業系統能夠管理的實體記憶體的問 題...廿幾年前的16位元DOS為何能夠管理1MB(2^20)的空間,而不是只有2^16=64KB?最早版本、基於(也是16位元)80286處理 器的OS/2作業系統,為何能夠管理16MB(2^24)的實體記憶體?同樣是16位元處理器,為何在8086/8088之後,還要推出80286?

一些最常見關於32位元處理器/作業系統的誤解一定要先破除,錯誤觀念才不會一傳再傳:

32位元處理器並非一定只能有32條位址線
例:Pentium Pro(36條)、Motorola/Freescale PowerPC e500(36條)

32位元處理器並非一定只能有32條資料線
例:Pentium(64條)、80386SX(16條)、Motorola 68000(16條)

32位元作業系統並非一定只能管理2^32=4GB的實體記憶體/實體定址位址
例:32-bit的Linux、FreeBSD、Solaris、Win Server 2003/2008 Enterprise、移除封印後的Vista/Win7(都可到64GB)

32位元處理器/作業系統所提供的定址模式,並非一定只能讓32位元程式存取2^32=4GB的定址空間
例:透過IA-32的Selector:Offset定址模式,能提供予每個程式的虛擬定址空間上限是2*8192*4GB=64TB

2^32=4GB是IA-32作業系統在Flat定址模式每個執行中的process所能擁有的虛擬定址空間上限,拿來解釋IA-32作業系統能夠管理的實體記 憶體總量?一整個張冠李戴....32位元Linux、FreeBSD、Solaris、Windows Server 2003/2008 enterprise版這些身心健全的IA-32作業系統,都可以管理到遠超過4GB、最高到64GB的實體記憶體,這些並非全部都是伺服器作業系統。

32-bit WinXP SP1雖然安全性極差,但純就能管理的記憶體來說,在啟動PAE以及Memory re-mapping的情形下,絕對可以管理超過4GB以上的實體定址位址,不信的人弄一版親自裝裝看作個實驗吧!從32位元WinXP SP2之後一直到最新的Win 7,才都被微軟加上了一道只能管理4GB實體位址的封印。

這是之前回給audiofan兄解釋類似問題的一些資料:

http://www.mobile01.com/topicdetail.php?f=174&t=926985&p=9#10202809
=============================================================
我想問題來自於您似乎把PAE視為伺服器作業系統專用的模式,跟IA-32架構是分開來看的,但是從PAE作為IA-32架構的重要延伸被定義出來後一直 到今天,早已經比從IA-32誕生到PAE被定義還來得久了(沒有PAE的386、486、Pentium、Pentium MMX,有PAE的Pentium Pro、Pentium II、Pentium !!!、Pentium M、Pentium 4、Pentium D、Core Duo、Core 2 Duo、Core 2 Quad、i7、i5、Celeron、Xeon家族、Pentium Dual-Core),另外從AMD Athlon處理器也早早就提供了PAE模式,所以今天幾乎都不特別強調是"Intel" PAE mode了。

另外您似乎認為今天的作業系統大多還預設處在IA-32最原始的32條位址線實體定址、而啟用PAE模式是很稀有的事。事實上PAE模式的運用也比您認為 的來得普及,在今天最普遍、絕大多數人在用的主流32位元XP/Vista系統上,PAE模式都已經預設被啟用了,這是因為目前所有的處理器幾乎都支援 eXecute Disable(XD, Intel)/No eXecute(NX, AMD)功能,配合從XP SP2開始提供的Data Execution Prevention(DEP),提供軟硬體協同的防止緩衝溢位攻擊安全防護。

但是對於處理器來說,在IA-32模式下要提供硬體XD/NX支援,處理器本身必須先被設定處於PAE模式。而從XP SP2以後到Vista SP2,預設值都是啟動軟硬體協同DEP(安全性功能應該沒人不要吧!),因此除非您刻意從BIOS關閉處理器的XD功能(沒事不建議這樣玩,地球的網路 是很危險的),不然作業系統都會預設先啟用PAE模式。您去看絕大多數人的Windows XP系統基本資訊那一頁,就算只有512MB記憶體,也幾乎都會看到"實體位置延伸"字樣,這表示XP已經處於PAE模式了,如果是Vista/Win 7,可以用Everest這個工具去確認。

問題來了:既然PAE已經被預設啟動了,為何32位元XP/Vista/Win7還是定址不到4GB以上的 實體位址?這是微軟自己本身刻意的技術性市場區隔,事實上處理器跟晶片組都已經被XP/Vista/Win7設定為能夠處理36條位址線實體定址的狀態 (PAE啟動),只是XP/Vista/Win7卻又很彆扭的拒絕去處理任何定址在4GB以上的實體定址位址,前面才會有網友提到利用Gavotte RAMdisk這種自力救濟方案:既然處理器跟晶片組已經處於能夠處理36條位址線定址的狀態,但是XP/Vista鬧彆扭,那就讓Gavotte去存取 那些XP/Vista/Win7拒絕承認、被定址在4GB以上實體位址的記憶體做成RAMdisk,以物盡其用。

Gavotte已經有很多網友快樂的使用中了,因此不用懷疑在32位元模式下絕對是可以存取到超過4GB的實體記憶體的。另一個範例是微軟幾乎刻意絕口不 再提起的XP SP1,啟動PAE後,也是可以定址到4GB以上的實體位址。您想想看,XP SP1是哪一年推出的?另一個知名的商業軟體SuperSpeed RAMdisk Plus,也已經提供類似Gavotte的功能了。


因此問題出在微軟對於已經預設啟動PAE模式的消費性32位元XP/Vista/Win7、卻又加上一道額外的封印,並非PAE本身是什麼奇怪、非正規的 模式。即使是64位元的Vista、理論上可以管理多到目前主機板上插不下的記憶體,其Basic版也被限制在"只能"用8GB的實體記憶體。而同樣充分 支援PAE的32位元Windows Server作業系統,低階版本能夠管理的記憶體也被微軟刻意限制在4GB,而中高階版可以管理到64GB的實體記憶體。

綜合上述,PAE早就是IA-32架構以及IA-32作業系統密不可分的一部份了,因此不用將IA-32跟PAE刻意分開來看

關於PAE啟動後的效能損失,也不用刻意去放大它,因為如前面所提,PAE預設幾乎都是會被Windows啟動的,不需要去改什麼 boot.ini(XP)、或用bcdedit強制啟動(Vista/Win7),就算PAE有效能損失,微軟也已經幫你預設打開了。但是有所失必有所 得,啟動PAE後存取多一層分頁表的效能損失(啟動PAE後,分頁表的查詢由兩層變三層,而64位元Vista/Win7的分頁表的查詢,原本便是三層, 如果要講效能損失,32/64一樣都是三層),透過如Gavotte Ramdisk這種應用方式,由於能夠被充分運用的記憶體變多了、因而少去存取硬碟這種相對慢很大的儲存媒體,絕對能夠將其彌補回來。已經很多網友將 Page file、Temp folder、Internet temp files...指向Gavotte作出的RAMdisk,用過的人絕大多數對效能改進都是滿意的。

同理,如果32位元XP/Vista沒有被封印,能夠自力管理的記憶體因預設開啟PAE變多了、 因而能少去硬碟存取page file、多將程式保持在記憶體中不swap出去到硬碟、多一些記憶體作為SuperFetch的快取,也是能夠將多存取一層分頁表的效能損失彌補回 來。(3月更新:最近還真的有將32-bit Vista/Win 7的封印解除的方法出現,詳見257樓、219樓,XP不適用)

今天問題根源在於微軟的心態,而非PAE有何原罪....

沒有留言:

搜尋此網誌

本站大事記

這個部落格(網站)內容以分享LINUX和延伸出的技術文章為主!
特別是為了工作和進修需要,搜集了不少網站連結。
希望對來這裡觀文的朋友們,有提供一些有用的資訊或文章。
但這裡的文章中,也包含個人的心情扎記和隨興言談……
若是當中沒有對上你的口味,請多包涵!

原「琳娜絲與希斯寇的邂逅」,改名為「愛上琳娜絲」!

原「琳娜絲與希斯寇的邂逅」,改名為「愛上琳娜絲」!
--原序文--
就是當LINUX遇上CISCO啦!他們的結合還能作什麼事…不就是讓這個世界的網路,串…串起來啊…不然你們那能上這網站看部落格!