不要再被誤導了,64位X86 CPU是沒有64位定址能力的!
本文轉載於:http://itbbs.pconline.com.cn/9769891.html
最近這幾天在CPU超頻版發了個懸賞貼,特意看看有多少人認為CPU的位寬意味著定址能力,結果發現也有相當一部分人被誤導!請注意:2^CPU位寬次方這種計算方法是明顯錯誤的!
系統上也是,一早就有技術支援64G記憶體,只不過微軟為錢,沒在32位的桌面級電腦上允許那項功能!
先講CPU定址能力!
一般廠商標示幾多位CPU是說CPU的運算位寬!
而CPU的位寬一般是以 min{ALU位寬、通用暫存器位寬、資料匯流排位寬}決定的!也就是說CPU由ALU、通用暫存器、資料匯流排三者之中最少的位寬決定!所以CPU位寬與其定址能力並不是掛鉤的!
就正如我上邊提示過的16位CPU能上1M的記憶體(這是本人一個筆誤,應該是寫8086 CPU),1M剛好是20位,這就已經說明CPU位寬與定址能力的關係!定址能力未必一定和CPU位寬相同!
因此某些媒體幾年前曾經說過(最近由於與網友中山狐討論開一些問題而講起PAE而記起來的),而且在網路上也流傳得比較廣泛的一個理論:現時CPU都是32位,所以定址能力是2^32=4G這種說法是存在偏差的!
再有!有的媒體曾經說64位CPU最大的好處是支援更大的記憶體這也是一個典型的錯誤!在AMD K8時代引入64位後,AMD的U定址位就達到物理定址40多位,而INTEL在p4 6系列之後物理定址定址能力亦達到40位,這大概是1TB,而如果是64位定址應該是16EB,所以,以CPU位寬衡量CPU定址能力是一個典型的錯誤!
有一個細心的人兄還發現其實我這篇文章中貌似是突出了32位這個詞而虛化了CPU這個詞!的確,我就是按當年那些文章那種說法而提出這問題的,目的就是想看看多少人被人誤導!結果在這貼中也看到比例也不在少數(雖然不佔大部分,但是人數也不少!)
事實上CPU定址能力因每種CPU設計不同而不同!就正如說32位的X86CPU,其實就在PentiumII是引入了36位的擴充套件PAE機制(Physical Address Extention)地址位來支援64G記憶體(源於當時伺服器的問題),正常情況下也是用32位定址,但通過設定相應的暫存器(沒記錯是cr4)的相應位啟用PAE就可以支援64位定址了!
所以,請記住:每個CPU的定址能力是看其設計的!而單純以CPU位寬來看待該CPU定址能力(就是上邊紅色字的那種定址能力為2的CPU位寬次方的說法是錯誤的!
上邊講到PentiumII通過設定控制暫存器來實現36位定址,而正常情況下就32位定址,而且能與前面的架構相容!
這樣不得不驚歎那些硬體設計人員那聰明的腦代,在設計時就想好了可擴充性,在一早就預想到將來會是一個高速、大容量的時代,為當時的奔騰CPU引入了一系列的東西!首先是32位運算能力,另外是為CPU引入32位地址匯流排,而且還引入MMU(分頁單元),使到CPU對實體記憶體進行段頁式管理!這種方式對記憶體的管理相比於傳統方式是更為安全、有效的!而這時,CPU是採用二級分佈制:頁目錄(線上性地址中佔10位)->頁表(10位)->記憶體頁表頁(12位),之後,再在頁表項入邊才是相應的空間!這樣CPU就訪問2^10*2^10*2^12=4GB的記憶體了。
但因為INTEL面臨伺服器方面記憶體容量問題,就開始想辦法了,於是,設計師開始想辦法,但由於前邊那設計的基礎,他們很快就想到了,加多一級頁表項,並加入相應控制暫存器,對其進行訪問控制!這樣,就可以對前的架構進行相容,又能夠在特殊情況滿足要求哦!這套機制到現時還在用哦,目前最新的X86 CPU(扣肉架構、K8的後代物理定址大概都在40位左右,但要相容32位系統,所以還在用這套機制!)。
講完硬體,當然要講軟體了,系統上一般是如何實現PAE呢,當然對硬體方面那聰明的設計是依樣畫葫了,最基本的手段是利用二進位制在高位上增加0對數的大小是沒影響這種想法,在演算法上就直接增加位數來頁表級數並實現虛存管理(這個與虛擬快取有關係,但不相同)!然後對利用嵌入彙編對相應暫存器進行判斷,一但發現不可用就將相應頁置0,嘿嘿,這招好使好用喔!就算64位定址都通殺!這是最基本的,還有其它方面的一些處理!例如設定一些狀態位之類的操作和開了PAE後那些頁的資料長度上是有變化的!LINUX核心就採用這種方法的,微軟的嘛因為非開源,不知道(即使你知道微軟的API,那也僅僅是函式介面,內部實現不可能太清楚)。
再說說關於32位系統開了PAE效能會下降這個話題吧!個人結合看過的相關資料認為:如果是4G以下(包含4G),如果開PAE,記憶體效能是很有影響的,因為開了PAE,在系統上要加多幾級頁目錄,這樣增加了對映次數,減低效能情況明顯!相對地,因為分頁單元和CPU是同速率執行,因此影響相對是極少極少的!記憶體2G比4G差最主要是因為在作業系統上的問題!