Recent Comments

2008年2月23日 星期六

[轉自iThome]IT自救術-x86處理器的結構

IT自救術-x86處理器的結構

文/嚴立群 (記者) 2008-01-10

既然是要研究處理器的「原理」,所以我們得找個「簡單的」來開刀。就類似可憐的青蛙總是要在生物課被解剖一樣,你總不好一開始就解剖大野狼吧!

要了解個人電腦的運作原理,我們決定先研究處理器的原理。而為了研究處理器的原理,我們挑選了所謂的「Intel x86」處理器作為研究的對象。

為何不挑別種處理器?x86處理器是個好的研究對象嗎?

從「幾乎人手一臺」這個角度看,x86是個很讚的研究對象。

有人會說,「x86的架構不夠優雅」、「x86就像是用膠水、剪刀等工具去拼貼出來的怪物」、「x86的概念很落後」、「x86有很多歷史的包袱」。老實說,他們說的都對。

但是,so what?

又沒人要你跟它結婚?我們只是研究一門學問而已。x86處理器雖然不夠完美,可看在它可是目前地球上數量最多的處理器的份上,就用它來當作研究的對象,實在很方便。所以,關於「美學」和「神學」的部份,暫時就不要理會了。

x86的「由來」
處理器早期並不是一顆晶片。早期的電腦,CPU是由一大堆晶片組成,專司「運算」的功能。一大堆晶片,占用很大的空間,真空管閃爍著奇異的光芒並發出高熱,計算的結果用燈號顯示。不過,這種畫面我只看過照片,沒有親眼見過,也許某些紀錄片上出現過吧!

直接跳到近代,Intel製造了所謂的「微處理器」。Intel在處理器市場算是先驅,第一個產品稱為4004,後來又陸續推出了8008、8080、 8086、8088……。不過,真正讓Intel大紅大紫的產品,當然是首先被IBM選用,拿去製造IBM PC的「8088」。

Intel 在8088之後,陸續推出了很多後繼產品,像是80186/188、80286、80386和80486。這些產品(除了 80186/188以外)都大量使用在IBM 相容PC電腦上。由於太受歡迎了,因此有許多公司就開始了「仿製」的工程。幾個比較有名的,包括了NEC(V20、V30)、AMD(AMD的286、 386和Am486等等)、Cyrix……。臺灣的聯電也做過,不過很快就收掉了這個事業(原因很難說,但是很快就收得一絲痕跡都不留)。

使用編號來命名晶片,是電子業的慣例。電子產品使用各家的晶片組裝,而相同(或是類似)編號的晶片會有幾乎一模一樣的性能,也就成為眾所周知的事情。所以,大家仿製Intel的處理器,也會刻意(如果膽子夠大)使用x86的編號。但這對Intel來說,可不是件令他們開心的事情。不幸的是,由於編號不能註冊,Intel也無法主張他們有80x86的商標使用權。因此,80486系列處理器之後,Intel幫處理器改名為Pentium,沿用至最近。目前 Pentium處理器已經陸續被更高階的「Core」系列所取代,但Pentium名稱仍在中、低階產品中繼續使用。

不過,由於80x86這名稱被使用得太廣泛,因此,這系列處理器就被廣泛的稱為x86處理器。相關的產品(作業系統、編譯程式……)也都會冠上x86字眼。舉例來說,Windows Vista其中一個就是「x86版本」。

處理器的「名稱」和「相容」間的關係
多年以前,當Intel把當時他們最新推出的處理器命名為Pentium,並註冊為商標之後,其他廠商就不「方便」再抄了。有一種方法是:那使用原本應該用的「586」當處理器名字(反正你Intel不用,那我用)。另外的方式則是:我也取個自己的名字,但是設法讓大家知道,我的處理器和 Intel相容。

當年市場上的兩個主要x86相容處理器製造廠商,一個是Cyrix,它就曾經推出過所謂的Cyrix 5x86和6x86處理器;另一個就是現在還頗知名的AMD,它當年則推出過所謂的5K86。你可以說,因為競爭激烈,廠商無所不用其極地想玩出自己的一片天。

這時,我們可以給各位一個很重要的概念,稱為處理器的「相容」。

處理器只是個晶片,接收電子訊號,然後傳出電子訊號。這些電子訊號通常有代表意義,送進來的是程式和資料,傳出去的是運算結果。Intel設計出一個處理器,能夠做訊號的處理(也就是接受「輸入」並提供「輸出」);你如果能做出一個處理器,能夠達到和模仿對象一樣的輸入/輸出結果,那就是「相容」。

請各位先複習一下上期講的,構成處理器的兩個元素,一個是「暫存器」,一個是「指令」。然後,請各位再看看這期的程式範例,一樣的印字程式。

通常,處理器有它的暫存器和專屬的指令,程式得使用該處理器專屬的暫存器結構和指令,才能正常運作。以印字程式為例,「MOV AH, 02」這行程式碼,執行時會變成「電子訊號」送到處理器裡面。「相容處理器」有什麼特色?很簡單,它們只要能處理一樣的程式碼,能夠輸入相同的電子訊號並得到一樣的程式碼執行效果,那就是「相容」。

不過,硬體是個很複雜的東西,老實說要做到「100%相容」真不是件容易的事。只不過利之所趨,還是有人有辦法可以做出相容處理器,並且執行各種程式,真是很厲害。

x86與x64的簡單說明
當然,在競爭者環伺的情況下,Intel只有設法不斷推出更新、更快、更好的產品以設法擊敗競爭者。所以早期的處理器有所謂的16位元處理器,像是8086/8088和80286。

所謂16位元,這「位元」指的是暫存器的寬度(一般說法是如此)。暫存器是「暫存資料,供處理器用在運算用途的空間」,因此它的寬度(空間大小),會影響資料處理的速度和精密程度。一般而言,16位元處理器的暫存器寬度,實在是太小了,因此在80386推出時,Intel使用的是32位元暫存器架構,整個指令集也因此大幅翻新。

這個架構,到現在仍是所有x86處理器和應用程式使用的主要架構,可說是夠偉大囉!

所以,目前只要提到x86架構,大多是指這個32位元的Intel處理器架構,Intel自己則是使用「IA-32」這樣的名稱。

AMD 為了要贏過Intel,並提供自己的處理器一個更優的特點,在幾年前則推出了所謂的64位元架構,使用在自己的AMD Athlon處理器上。只是後來Intel處理器也全面支援這個架構,並使用自己的「IA-64」或是「EM64T」的名稱。目前新出世的處理器,大多支援此架構了。而Microsoft最新推出的Windows Vista,也因此有所謂的Vista x86和Vista x64兩個版本。簡而言之,「x86」就是32位元架構,而「x64」則是指64位元架構。這樣的說法不算精確,乃是「約定俗成」,但是一般都是如此稱呼,各位知道一下並無壞處。

此外就是,x86處理器升級到64位元之後,通常在設計上就是「雙模」,既可以跑32位元程式,也可以跑64 位元程式。不過,這都得在64位元作業系統下才能發揮。這部份的課題稍微複雜,我現在僅簡單跟各位宣布:目前64位元的應用程式主要都是「專業的繪圖、數學軟體」,一般應用軟體就很少了。

那有沒有128位元處理器?

我聽過一個說法,64位元處理器就夠地球人移民到織女星了,所以128位元處理器應該是不用想太多。

x86暫存器架構
當你在命令列使用DEBUG,無論你的處理器是Pentium III、Pentium 4還是Core/Core 2 Duo,這時它的行為都會像是個8086。
太好了,因為這樣夠單純,所以我們來看看8086的暫存器架構。

再次強調,所謂的「暫存器」就是可以「暫時地記住數字」,方便處理器進行演算用的空間而已,「暫存一下數字」就對了。早期的處理器暫存器數量很小,寬度也不寬。8086已經算是先進的產品!有十四個主要的暫存器,並有六種不同的種類:

一般用途暫存器
8086 共有四個General Purpose Register,稱為AX、BX、CX、DX。不過,ABCD可不是因為「它們是英文的前面四個字母」而已,A可以視為是「Accumulator」,累積器(就是最一般、最常用的用途的意思);B可視為是「Base」,基底的意思(基底是什麼意思?先別管好了);C通常用來當作「Counter」,計數器;D通常表示「Data General」,「一般存放資料用途」的意思。

一般用途暫存器雖然是「可以萬用」,但實際上不是每個都可以的,像是CX,大多就真的用來做計數器,並不會隨便亂用之,所以8086的一般用途暫存器其實很少的。

節區暫存器
執行程式時,x86的設計是讓程式碼中分區存放程式、資料等等,其中的管理會依靠所謂的「Segment Register」。8086共有CS、DS、SS和ES等四個節區暫存器。

堆疊暫存器
SP和BP是Stack Pointer暫存器,通常是用在「程式碼堆疊的控制」上頭。

喔,堆疊是啥?呵呵,也一樣,先別管吧!等你寫程式時,用到了才能比較理解。

索引暫存器
SI和DI是所謂的Index暫存器,可以用來當作像是大量記憶空間(程式裡面的陣列)中,像是A[1]、A[2]的索引指示用。

旗標暫存器
Flag Register主要是記錄程式執行的一些「狀態」,很像是「信號機」。利用這些旗標狀態的變化,程式設計師才得以控制程式的流程。

程式計數器
IP(Instruction Pointer)主要就是記錄程式碼目前執行位址的暫存器。

本期結語:只能從實踐中漸漸了解
其實,從「文字說明」中,各位很難了解處理器運作的原理。你得從程式的「實作」中,才能真正了解到底暫存器是怎麼一回事?堆疊、指標又是怎麼運用?老實說,無論是文書處理還是該死的病毒,都是用這些程式原理去撰寫的,不了解之,你就無法了解電腦的運作原理了。

下期我想先從DEBUG的教學,來教各位認識x86處理器的簡單架構。

0 意見: