2017年6月16日 星期五

淺談古代CPU:32bit與4G?(2)

32位元與4GiB的太平歲月從386問世(1985)開始,差不多有10年的時間,直到Pentium Pro問世,Pentium Pro有36條定址線,所以最大可以存取的記憶體範圍是64GiB,這下子又回到了暫存器小於定址線的老問題,更麻煩的是,當初因為8086/286「本來」暫存器就比定址小,所以對應的機制是一開始就設計好的,問題是Pentium Pro的36 bit定址是後來加上去的,如果改動原來的存取機制,前面十年來為386、486寫的眾多程式還要不要活命?所以Intel的決定是:不改動原來程式的定址方式,麻煩的事情交給作業系統搞定。

在介紹Pentium Pro對付4G問題的機制前,我想應該先解釋計算機結構和作業系統都會提到的兩個名詞:「虛擬記憶體位址」和「實體記憶體位址」。

上次提過,如果把CPU當作一個抽象的黑盒子,這個黑盒子對外的行為就只有「存取記憶體」而已,不過實際的狀況下,一顆CPU會輪流跑很多獨立的程式,這時候出現一個問題,對記憶體來說,它只知道對應送來的位址,準備好要存取的資料,但是不會分辨是哪個程式的,換句話說,整個記憶體對這些程式來說是完全一樣的,你的資料我看得到,我的資料你也可以改,這樣不太好。

所以後來有人想出一種解套的方法,簡單的說,就是在黑盒子外面再包上一層黑盒子,把裡層黑盒子放出來的記憶體位址「攔截」下來,經過另外轉換後才變成真正去存取記憶體的位址,對裡層黑盒子執行的程式來說,並不會感覺到有什麼不同,而控制外層黑盒子的程式,可以對每個裡層程式的位址做出適當的轉換,讓它們每個都覺得自己才是記憶體的唯一擁有者。

在這種機制下,每個程式自己所存取的記憶體位址,叫做「虛擬記憶體位址」,而實際上真正的記憶體位址當然就叫做「實體記憶體位址」,負責轉換這兩種位址的,是CPU裡面一個特別的單元,通常稱為Memory Management Unit,記憶體管理單元,簡稱MMU,不是每個CPU都有這種機制,舉個例子,Intel 8088/86就沒有;另外有些CPU是把MMU當作另外一種「副處理器」,要另外安裝或是當作選項;另外,控制MMU的相關程式,通常是作業系統的一部份,所以兩個名詞在作業系統教科書上也看得到。

為什麼要談這個?因為Intel在32位元系統上企圖解決4G問題時,並不是讓程式「直接」就可以定址超過4G記憶體,而是去修改MMU轉換位址的機制;換句話說,對「單一程式」來說,直接可以存取的記憶體定址空間還是只有4GBytes,但是作業系統可以讓多個程式在一個比4G大的記憶體空間上並存,所以虛擬記憶體位址還是只有4GBytes,但是實體記憶體位址擴大了。

Intel有提供兩套擴展記憶體定址的機制,一套叫「實體位址擴展 」(PAE,Physical Address Extension),另外一套叫PSE-36 (36-bit Page Size Extension),因為是淺談,所以詳細的機制就省略不提,有興趣的可以直接找維基百科或是Intel的官方文件;目前的作業系統多半支援PAE,支援PSE-36的比較少;32位元的ARM上面有類似的機制,稱作LPAE(Large Physical Address Extension)。

剛剛的MMU還有後續,回想上面提過的黑盒子,我們一直假設只有CPU會去存取記憶體,其實不一定,聽過「DMA」(Direct Memory Access)和「Bus Mastering」嗎?一般來說,CPU與I/O裝置溝通有兩類方法,一類是「CPU主動」,也就是程式主動去存取I/O裝置,就像是存取記憶體一樣;另外一類是「I/O裝置主動」,這時候I/O裝置就跟CPU一樣,可以主動存取記憶體;不過古早以前,I/O裝置在存取記憶體的時候是當作「實體記憶體定址」來做的,以前是沒有什麼問題,但是當大家引入「虛擬化」的時候就成了大問題,因為虛擬化的時候。這些I/O裝置一樣要被虛擬化,可是它們存取資料的時候就露餡了,所以後來AMD才提出IOMMU這個機制,其實也就是讓I/O裝置跟CPU裡面一樣,存取記憶體時另外有MMU轉換位址。

其實關於32bit和4G還有不少有趣的故事,不過現在大部分都進入64位元時代,只能當作考古,至於64 bit以後還會不會出現類似的狀況,我想有點難,畢竟64位元定址空間並不是32位元的兩倍,而是一個很大的天文數字,不過....誰知道呢?

所以回到一開始那個問題「 在 32 位元 CPU 中,如果單純以 CPU 做記憶體定址時,4GiB 為其極限。 」在x86上,這個敘述的確不能算錯,但是這不是因為「32位元 CPU做不到」,而是Intel和AMD不想做。

淺談古代CPU:32bit與4G?(1)

在 32 位元 CPU 中,如果單純以 CPU 做記憶體定址時,4GiB 為其極限。 」這是某個網站對新處理器「深入分析」文章中出現的敘述。

這句話倒底對不對呢?這就是以下要討論的,其實這些都是很基本的計算機結構常識;首先我們從定義開始:什麼是CPU的「bit數」?CPU的「記憶體定址」又是什麼?

雖然幾十年前對這個定義有不少爭論,不過現在一般來說,一個CPU架構裡的「bit數」,通常從程式觀點來看,指的是「整數暫存器的bit數」,也就是一個整數指令能夠運算的最大位元長度,舉例來說,以前8088/8086和286,整數暫存器最大就是16位元。所以是16位元處理器,80386/486暫存器可以到32位元,所以是32位元處理器,沒有任何問題。

可是「記憶體定址」是另外一回事, 什麼是「記憶體定址」?如果把裡裡外外所有繁瑣的細節都省略,當作一個抽象的個體來看,CPU就是一個可以輸入或輸出(為了方便,以下把輸出和輸入簡稱為讀寫,讀是輸入,寫是輸出)資料的黑盒子,而這個黑盒子從「哪裡」讀寫資料?這個「哪裡」就是記憶體,當然這是個抽象的描述,有些人可能會爭辯還有I/O等等,但是對程式或CPU來說那還是一種「記憶體」。

CPU讀寫資料的大小是有限的,更進一步來說,CPU能夠「從多大的範圍讀寫資料」也是有限制的,回到剛剛的黑盒子,CPU如何決定從「哪裡」存取資料?答案是:CPU會先寫出一串資料,這串資料稱為「位址(address)」,這串資料是有大小限制的,如果是32bit,表示CPU只能從2^32這麼大的範圍內選一段讀寫,一段的基本單位通常是byte(當然,也會有例外),古早的CPU通常會特別有一組訊號線來表示這串資料,這組訊號叫「定址線」,所以32條定址線,基本單位byte,表示這顆CPU只能從2^32 = 4 giga byte = 4GiB大小的空間中讀寫資料,也就是說記憶體定址空間是 4 GiB。

所以32位元CPU的記憶體定址就是4 GiB?

回答這個問題之前,請先容我反問一下,如果上面的敘述成立,請問16位元的CPU,記憶體定址應該是多大?2^16 = 64K byte?

別傻了,就拿剛剛舉過的例子,Intel 8088/8086有20條定址線,80286有24條定址線,所以一個是1MB,一個是16MB,隨便哪一個都超過64K。

問題出在哪裡?問題在於,整數暫存器的大小,跟記憶體定址線的大小,這兩個本來就是互相獨立的參數,上面的8086和286就是個例子,只是x86進入32位元時代後,剛好386、486到Pentium都是位元數等於定址線數,也就是暫存器32位元,定址線也剛好是32位元,如此而已。

問題又來了,如果一顆CPU的整數運算大小比定址線還小,那程式怎麼存取記憶體?這也是個好問題,答案是:看指令集怎麼規定;拿8086來說,它有幾個特別的暫存器,牽涉到記憶體存取的指令時,CPU真正計算位址的方法是:把這些暫存器的值,跟你的指令裡面指定位址的值拿來一起計算,最後產生的才是20位元的記憶體位址;到了286時比較複雜,某個暫存器會指到某張表,表裡面的數字跟暫存器的數字一起計算等等等等,其他處理器可能有其他方法,但是總而言之言而總之,有太多太多方法可以讓程式在存取記憶體時,可以不用受限於一個整數暫存器的大小。

所以一切的謎底都解開了嗎?也不盡然如此,在386之前,這種不太直觀的記憶體存取機制,對程式設計師來說其實很麻煩,所以從386開始,暫存器和定址線就一樣是32位元,程式可以擺脫那些麻煩的機制,就這樣過了很長的一段太平日子,因為太平日子過太久,所以大家都忘記了過去那段苦日子,以為32位元就等於4G記憶體定址。

不過太平日子其實也是會過去的,故事還沒完,我們下期待續。


2008年7月16日 星期三

2007年7月27日 星期五

黯然消魂好書大集合...(誤)

好書當然是要留下紀錄,不然以後看不到怎麼辦啊......

佛地魔是怎麼知道如何做出分靈體的? 簡單嘛,就是看這本

得道昇天的大師精通量子論.....能不能告訴我上帝到底丟不丟骰子?

眾人皆睡我獨醒,眾人皆醉我獨清,這位長弓聖大師一出就是三本:
揭發科學史上最大的錯誤
史上最大預言即將應驗
外星生命控制人類的命運

2007年6月27日 星期三

貓影


這張拍的很藝術,不過其實根本就是湊巧的...看起來像是在思考深奧的貓生哲學,不過養久了就知道,牠想的無非就是吃跟睡而已...XD

2007年6月19日 星期二

這才叫唱歌

對不起我就是對星光大道有偏見

這是英國的Britain's Got Talent,這位手機業務員後來第一名

業務員初登場
http://www.youtube.com/watch?v=1k08yxu57NA

業務員唱"Time To Say Goodbye"
http://www.youtube.com/watch?v=O-Pv-0vpxSc
http://www.youtube.com/watch?v=rDB9zwlXrB8 (連前面的開場,比較長的版本)

業務員決賽
http://www.youtube.com/watch?v=K_5W4t_CBzg
http://www.youtube.com/watch?v=qwkVnyfdGYQ (包含前面揭曉)

六歲小羅莉
http://www.youtube.com/watch?v=En0A8KGMgq8

2007年6月15日 星期五

偽科學網站大集合

收集一些偽科學奇葩網站....免得以後失傳....

台灣地區:
快變成登山聯誼社的... 台灣飛碟學會
不正常人類研究所: 新次猿人...不,是新次元人
前仆後繼永動機 : 世界能源投資控股有限公司

中華人民共和國地區:
超英趕美,追德逐日,拳打量子學,腳踢相對論: 中國挑戰相對論網

歐美地區:
量子加上太陽能再加上電腦,這簡直太有搞頭了: Atom Chip Corporation
(不過我懷疑這不叫偽科學,可能是詐騙集團)

連紫色乳牛...不,湯姆克魯斯都說好....貴的山達基
(好吧我知道有些人會抗議,不過麻煩看一下這個)