Recent Comments

2008年2月25日 星期一

[轉自IThome]IT自救術-x86處理器的運作概念

IT自救術-x86處理器的運作概念

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

處理器並不是一開始就像今天這樣的、一顆晶片的樣子,工程師摸索了很久,才找到最有效率的處理器設計──現代處理器的「可程式」設計。

最早的電腦,使用的是「純電路」的設計。這種純電路設計的概念就是:一種用途,一種設計。如果你的電腦有了新的用途,就得有一個新的設計。

比方說,想要讓電腦計算圓周率的小數點後一千位,好的,工程師就會針對這件工作,用真空管和其他電子裝置做出一個電路,設法計算出圓周率小數點後的一千位數字。雖然早期電腦有著速度不快、不夠穩定、發熱量高、耗電量大以及佔用大量空間的問題,但這樣的工作應該還算是可以勝任。

但是,如果打算換個功能,像是,「讓電腦計算自然對數表」,好的,那工程師得另外設計一個全新的電路,重新組裝零件,以進行全新的運算。這當然不是一件很容易的事情,成本也高得驚人。

另外一個重要概念,則是「電腦乃是一種循序電路」的設計概念。
各位可以把電流想像成看得見的水流,並且以極慢極慢的慢動作流動,我們在電腦的這頭輸入電流,電流依序流經各晶片之後,會在另一頭跑出答案來。

處理器是個只接受電子訊號的可程式循序電路
專屬電路設計的電腦缺乏彈性,實用性不高,因此後來工程師們發現,設計一種萬用電路——也就是上期講的「處理器」,處理器裡面有著「暫存器」,這是可以用來進行各種運算的機構。記憶體裡面則存放等著被饋入暫存器裡面的程式碼和資料,依序執行各種運算。這樣的好處是:只要使用不同的指令和資料組合成「程式」,電腦將可以執行各種複雜的運算,大大提高實用性。

但是,就電路的角度來看,晶片只能接受高低電位不同的電流訊號輸入,並根據自身的設計,再輸出適當的電位訊號(運算結果)而已。

這概念很重要,請讓我重複再講清楚一點:

對處理器而言,它只是被設計成「接受電位變化不同的電流訊號之後,輸出對應的結果」。處理器其實並不懂所謂的「程式」、「數字」什麼的,那都是人類才懂的東西。工程師才是那個要設計處理器、晶片和電路,並設法讓代表程式的電位訊號輸入處理器後,跑出正確結果的人。

舉個例子,如果你對著Intel 8086說「MOV AH, 02」,它不懂的。但我們使用DEBUG這個小工具輸入這行指令時,這一小行字最後會化為電位高低不等的電流訊號,流到處理器裡面的電路,這段訊號會請處理器把02搬移到AH暫存器暫存著(當然,這些動作也是以一種電子訊號的形式被執行),並等待下一段指令的進行。

所以,「處理器是個只接受電子訊號的可程式循序電路」,是本期本欄內容的第一個重點,請牢記之。如果要廣義的引申,你認為「電腦就是個只接受電子訊號的可程式循序電路」也未嘗不可。

程式執行的「過程」簡介
所以,工程師設計處理器之時,一方面必須要想像,程式設計師會希望處理器有什麼樣的運算能力(通常就是「算術與邏輯運算」的能力啊!加、減、乘、除、且、反、或、互斥或……),一方面要想像,如何用循序電路做出這些運算的功能,讓程式設計師使用。

除此之外,整臺電腦還包括了其他附屬電路裝置。像是儲存待執行程式的「記憶體」,其實也只是將資料用電子訊號的方式存在晶片裡面,等待著往處理器「傳送」。有時候,處理器裡面暫存器的演算結果,也會寫回記憶體裡面儲存。這些「概念上」的演算,全都以電子訊號的方式,在組成電腦的電路裡面流動著。

反過來說,程式設計師不可能操作「電子訊號」來寫程式,所以早期的程式設計師大多只能熟記處理器的指令名稱和指令格式,用指令組合而成程式,再用「組譯器(Assembler)」將程式轉譯成「可執行檔」,這可執行檔就可由作業系統載入(處理器)並得到程式執行的結果(通常會顯示於螢幕上)。

DEBUG就是一個功能很少,但是還算夠用的迷你組譯器。

舉例來說,當你執行Windows,在「IE」瀏覽器的圖示上「連續按兩下滑鼠左鍵」時,程式會從硬碟載入到記憶體,然後部份程式碼會依序饋入處理器裡面,程式碼會由各種「處理器」能辨識的指令組成。等程式碼送入處理器中,利用暫存器執行完各種運算指令後,通常會有對應的結果顯示在螢幕上(通常是如此,只是程式有可能跑不出結果,或是當掉)。

不過,同樣的,其實這些運算,形式上都只是高低電位不同的電子訊號在電路上流動而已。

而且,其實程式設計師完全不懂所謂的電子訊號的流動也無妨,他們只需要研究「程式怎麼寫」就可以了。至於電子訊號怎麼流動才會跑出正確的結果,就是硬體工程師的事情了。

有哪些「基礎」得先打好
所以,從專業分工的角度來看,電腦工程師有兩種,一種是硬體工程師,一種是軟體工程師。

不過,各位並不是立志要當工程師而收看本欄內容(如果是,請不要看下去了,我不是工程師還能把你教到變成工程師,那我該改行當魔術師了),我們只是要研究處理器的原理而已。所以請各位看了上面的說明之後,來想想,要對處理器稍微有點了解,要學學哪些東西?

數碼系統的轉換
剛重複講了好幾次,處理器只能處理「電位高低不同的電子訊號」,也就是說,如果我們用0代表低電位,用1代表高電位,那處理器只能接受10110100這樣的電流訊號而已。

但是,一般人看到10110100這樣的符號,通常是看不懂的,所以一般的電腦專科教育,會教你做所謂的「10、16、8、2進位之間的互換」。通常來說, 2進位、8進位和16進位之間的互換相當容易,但偏偏人類是生了十根手指頭,所以為了要理解數位電路的常用符號,得學習不同數碼系統之間的轉換。

常用單位和常用符號
處理器用來處理大量的資料,但如果都只用2進位表示資料,紀錄時會變得相當冗長(你會看到諸如像是 10110100101010010100101010……的資料,看都看不完)。所以我們得用一些「科學記號」來表示資料。比方說,一個資料的最小單位(0或1)是Bit,8個Bit等於1個Byte,1000個Byte通常縮寫成1KB,1000個KB縮寫成1MB,1000個MB縮寫成1GB……,這些習慣寫法牢記之後才能搞清楚各種裝置的數量關係。

2進位算術運算
人類習慣用10進位演算,而電腦又只能接受2進位訊號,那我們能設計出一個方法,來二元的電腦電路模擬出10進位的演算嗎?

當然可以!

簡單的說,用電路模擬自然數的相加,方法倒是不難;但是如果要用電路設計出減法,就稍微困難一點了。乘法?除法?或是浮點數的四則運算?這些都可以用電路設計出來,但光是了解「理論上要怎麼做」就頗要費一番工夫就是。

數位邏輯運算
AND、OR、NOT、XOR……這些邏輯運算,也是電腦程式的運算中常用的。事實上,電腦能做的所有的其他運算,都是用幾個基本的邏輯運算去拼湊出來的。

一些基礎的原理
為何可以用數位邏輯運算模擬加法運算?甚至是模擬整個人類常用的四則運算,整數運算,以及浮點運算?因為這些都可說僅是機械運算,而根據「杜林機」的概念,這些演算都可以用模擬器的方法來完成,工程師會負責想出精巧、有效率的方式做出適當的電路模擬之,而我們要說明的就是這「工程」的部份。又或者,光是一個「數位」和「類比」的概念,很多人都還是分不清楚,這都是值得研究的內容。

電子電路設計
要怎樣才能實作出進行演算工作的電子電路?那就得學很多東西啦!從固態物理、電子學電路學、半導體與積體電路設計……,牽涉的相關專業學問可是不少。不過這門學問可說是臺灣的「顯學」(至少,在OEM或是Foundry的部份是吧!),好的電子電路設計(像是──iPod啊!)可以賺很多錢!

組譯器/編譯器使用
利用組譯器或編譯器工具,撰寫程式碼,並利用程式執行的反應,設法了解處理器的運作原理。

至少學習兩種語言
要寫程式,使用組譯器或是編譯器,你至少得學兩種語言,一種是組合語言,一種是高階語言(我會建議學C或C++語言)。不過,這裡不是要訓練你成為專業程式設計師,只是利用這些語言的執行結果去觀察處理器的行為模式。

本期結語:練拳不練功,到老一場空
我曾看過成龍的一部老電影,根據我殘缺不全的記憶,電影名喚《一招半式闖江湖》。電影裡面的老師父對成龍說,「你沒聽過嗎?『練拳不練功,到老一場空』。」呵呵,這話拿來對玩電腦的人來說,也是挺合適的。

要知道,今日這麼複雜的一臺電腦,像是家電一樣的電子產品,並非瞬間演化的結果,而是經過多年的進化而成。如今想要研究其原理,很多基本的「理論」往往不容易說的清楚──除非你有耐性慢慢學。

不過,老實說,如果真有耐心把上面講的這些單位、符號、演算、原理記熟了,面對於其他更複雜的產品問題,就會容易理解得多。因為,你已經知道這些產品的底層,也就是由這些元件和原理所組成。如果你願意「有耐性慢慢學」,這些原理有朝一日就可以變成你的「武器」。

不過,上期不是說要介紹DEBUG的用法嗎?很抱歉,我想,得等到適當的時間再介紹了!幸好,我們有得是時間呢!

0 意見: