歷史來源
X86架構中的第一塊32位CPUx86架構於1978年推出的Intel8086中央處理器中首度出現,它是從Intel8008處理器中發展而來的,而8008則是發展自Intel4004的。8086在三年後為IBMPC所選用,之後x86便成為了個人計算機的標準平台,成為了歷來最成功的CPU架構。其他公司也有製造x86架構的處理器,計有Cyrix(現為VIA所收購)、NEC集團、IBM、IDT以及Transmeta。Intel以外最成功的製造商為AMD,其早先產品Athlon系列處理器的市場份額僅次於IntelPentium。8086是16位處理器;直到1985年32位的80386的開發,這個架構都維持是16位。接著一系列的處理器表示了32位架構的細微改進,推出了數種的擴充,直到2003年AMD對於這個架構發展了64位的擴充,並命名為AMD64。後來Intel也推出了與之兼容的處理器,並命名為Intel64。兩者一般被統稱為x86-64或x64,開創了x86的64位時代。值得注意的是Intel早在1990年代就與HP合作提出了一種用在安騰系列處理器中的獨立的64位架構,這種架構被稱為IA-64。IA-64是一種嶄新的系統,和x86架構完全沒有相似性;不應該把它與x86-64或x64弄混。架構設計
x86架構是重要地可變指令長度的CISC(複雜指令集計算機,ComplexInstructionSetComputer)。字組(word,4位元組)長度的存儲器訪問允許不對齊存儲器地址,字組是以低位位元組在前的順序儲存在存儲器中。向前兼容性一直都是在x86架構的發展背後一股驅動力量(設計的需要決定了這項因素而常常導致批評,尤其是來自對手處理器的擁護者和理論界,他們對於一個被廣泛認為是是落後設計的架構的持續成功感到不解)。但在較新的微架構中,x86處理器會把x86指令轉換為更像RISC的微指令再予執行,從而獲得可與RISC比擬的超標量性能,而仍然保持向前兼容。x86架構的處理器一共有四種執行模式,分別是真實模式,保護模式,系統管理模式以及虛擬V86模式。[3]在這篇簡短的文章中出現的指令和暫存器助憶符號的名稱,都在Intel檔案中有所指定以及使用在Intel組譯器(Assembler)中(和兼容的,比如微軟的MASM、Borland的TASM、CAD-UL的as386等等)。一個以Intel語法指定的指令"moval,30h"與AT&T語法的"movbx30,%al"相當,都是會被轉譯為兩個位的機器碼"B030"(十六進制)。你可以發現在這段程式中的"mov"或"al",都是原來的Intel助憶符號。如果我們想要的話,我們可以寫一個組譯器由代碼'moveimmediatebytehexadecimallyencoded30intolowhalfofthefirstregister'(移動立即值位十六進制編碼30到第一個暫存器的低半部位),來產生相同的機器碼。然而,傳統上彙編器(Assembler)一直使用Intel的助憶符號。x86彙編語言會在x86彙編語言文章中有更詳細的討論。模式分類
實時模式
x86Intel8086和8088有14個16位暫存器。其中四個(AX,BX,CX,DX)是通用目的(儘管每個暫存器都有附加目的;舉個例子:只有CX可以被用來當作loop(循環)指令的計數器。)每個暫存器可以被當成兩個分開的位元組訪問(因此BX的高位可以被當成BH,低位則可以當成BL)。除了這些暫存器,還有四個區段暫存器(CS、DS、SS、ES)。他們用來產生存儲器的絕對地址。還有兩個指針暫存器(SP是指向堆疊的底部,BP可以用來指向堆疊或存儲器的其它地方)。兩個指針暫存器(SI和DI)可以用來指向數組的內部。最後,有標誌暫存器(包含狀態標誌比如進位、溢出、零標誌,等等)。以及IP是用來指向目前運行指令的地址。在實模式下,存儲器的訪問是被區段開來。為了得到最後20位的存儲器地址,要將區段的地址往左移動4位,並且加上偏移的地址。因此,實模式下總共可以定址的空間是2位元組,或者是1MB,於1979年是相當讓人印象深刻的象徵。在實模式下有兩種定址模式:near和far。在far模式,區段跟偏移都需要被指定;在near模式,只需要偏移模式被指定,而存儲器區段是由適當的區段暫存器獲得。以數據而言是使用DS暫存器,代碼是CS暫存器,堆疊是SS暫存器。舉個例子,如果DS是A000h且SI是5677h,DS:SI會指向計憶體的絕對地址DS×16+SI=A5677h在這種架構下,兩對不同的區段/偏移可以指向一個相同的絕對地址。因此如果DS是A111h且SI是4567h,DS:SI會指向跟上一段相同的A5677h。除了duplicity之外,這種架構無法同時一次擁有4個以上的區段。此外,CS、DS和SS是為了程式正確功能而必須的,因此僅僅只有ES可以被用來指向其它的地方。這種模式原本是為了與Intel8085兼容,導致程式設計師永無止盡的痛苦。除了以上所說的,8086也擁有8-bit的64K(另一種說法是16-bit的32K)輸入輸出(en:I/O)空間,以及一個由硬體支持的64K(一個區段)存儲器堆疊。只有words(2位元組)可以被推入到堆疊中。堆疊是由存儲器的上端往下成長,他的底端是由SS:SP指向。有256箇中斷(interrupts),可以由硬體或是軟體同時組成。中斷是可以串連在一起,使用堆疊來儲存返回被中斷的程式地址。16位保護模式
x86Intel80286可以在不改變任何東西下,支持8086的實模式16位軟體,然而它也支持額外的工作模式稱為保護模式,可以將可定址的物理記憶體擴充到16MB,可定址的虛擬記憶體最大到1GB。這是使用節區暫存器來儲存在節區表格中的索引值。處理器中有兩個這樣的表格,分別為GDT和LDT,每一個可以儲存最多8192個節區的描述子,每一個節區可以給予最大到64KB的存儲器訪問。節區表格提供一個24位的基底地址(baseaddress),可以用此基底地址增加想要的偏移量來創造出一個絕對地址。此外,每一個節區可以被賦予四種許可權等級中的一種(稱為"rings")。儘管這個推出的功能是一項進步,但是他們並沒有被廣泛地使用,因為保護模式的作業系統無法運行現有的實模式軟體。這樣的能力只有在隨後80386處理器的虛擬86模式中出現。在同時,作業系統比如OS/2嘗試使用類似桌球的方法,讓處理器在保護和實模式間切換。這樣都會讓計算機變慢且不安全,像是在實模式下的程式可以輕易地使計算機當機。OS/2也定義了限制性的程式設計規則允許"FamilyAPI"或"bound"程式可以在實模式或保護模式下運行。然而這是給原本為保護模式下設計的程式有關,反之則不然。保護模式程式並不支持節區選擇子和物理記憶體之間的關係。有時候會錯誤地相信在16位保護模式下運行實模式的程式,導致IBM必須選擇使用Intel保留給BIOS的中斷調用。事實上這類的程式使用任意的選擇子數值和使用在上面提到的“節區運算”的方式有關。這個問題也在Windows3.x上出現。這個推出版本想要在16位保護模式下運行程式,而先前的版本只能在實模式下運行。理論上,如果Windows1.x或2.x程式是寫得“適當”且避免使用節區運算的方式,它就有可能在真實和保護模式兩者下運行。Windows程式一般來說都會避免節區運算,這是因為Windows實現出軟體的虛擬記憶體方式,及當程式不運行時候,搬移存儲器中的代碼和數據,所以操作絕對地址的方式是很危險的;當程式不運行時,被認為要保持存儲器區塊的“handles”,這樣的handles已經非常相當於保護模式的選擇子。在保護模式下的Windows3.0運行一個舊的程式,會觸發一個警告對話盒,建議在實模式下運行Windows(推測還是仍然可以使用擴充存儲器,可能是在80386機器用EMM386模擬,因此它並不被局限於640KB)或是從廠商那更新到新的版本。好的行為之程式可能可以使用特別的工具來避免這樣的對話盒。不可能有些GUI程式在16位保護模式下運行,且其它GUI程式在實模式運行,可能是因為這會需要兩個分開的環境且會依於前面所提到的處理器在兩個模式間的桌球效應。從Windows3.1版開始,實模式就消失了。32位保護模式
Intel80386推出後,也許是到目前為止x86架構的最大躍進。除了需要值得注意的Intel80386SX是32位架構但僅只有24位定址(和16位數據匯流排)。除此之外其他架構都是32位-所有的暫存器、指令集、輸出輸入空間和存儲器定址。為了能夠在後者所說的功能工作,要使用32位擴充的保護模式。然而不像286,386所有的區段可以使用32位的偏移量,即使存儲器空間有使用區段,但也允許應用程式訪問超過4GB空間而不需要區段的分隔。此外,32位保護模式提供分頁的支持,是一種讓虛擬記憶體得以實現的機制。沒有新的通用暫存器被加入。所有16位的暫存器除了區段暫存器外都擴充為32位。Intel在暫存器的助記符號上加入“E”來表示(因此擴充的AX變成EAX,SI變成ESI,依此類推)。因為有更多的暫存器數量、指令、和運算單元,因此機器碼的格式也被擴充。為了提供與先前的架構兼容,包含運行碼的區段可以被標示為16或是32位的指令集。此外,特殊的前置符號也可以用來在16位的區段包含32位的腳本,反之亦然。x86分頁跟區段的存儲器訪問是為了支持現在多任務作業系統所必須要的。Linux、386BSD、WindowsNT和Windows95都是一開始為386所發展,因為它是第一顆提供可靠地程式分離存儲器空間的支持(每個程式擁有自己的定址空間)以及可以在必要的情況下打斷他們程式的運行(使用ring,一種x86保護模式下權力分級的名稱)。這種386的基本架構變成未來所有x86系列發展的基礎。Intel80386數學輔助運算處理器也在集成到這個CPU之後的x86系列中,也就是Intel80486。新的FPU可以幫助浮點數運算,對於科學計算和圖形設計是非常重要。系統管理模式
Intel首次在80386SL之後引入其x86體系結構。指令分類
MMX和之後
1996年Intel的MMX(AMD認為這是矩陣數學擴充MatrixMathExtensions的縮寫,但大多數時候都被當成Multi-MediaExtension,而Intel從來沒有官方宣布過詞源)技術出現。儘管這項新的技術得到廣泛宣傳,但它的精髓是非常簡單的:MMX定義了八個64位SIMD暫存器,與IntelPentium處理器的FPU堆疊有相重疊。不幸的是,這些指令無法非常簡單地對應到由原來C編譯器所產生的腳本中。MMX也只局限於整數的運算。這項技術的缺點導致MMX在它早期的存在有輕微的影響。現今,MMX通常是用在某些2D影片應用程式中。
3DNow!
1997年AMD推出3DNow!,是對於MMX的SIMD的浮點指令增強(針對相同的MMX暫存器)。儘管這些也沒有解決編譯器的難題,但這項技術的推出符合了PC上的3D休閒娛樂應用程式之崛起。3D遊戲開發者和3D繪圖硬體製造商在AMD的AMDK6和Athlon系列處理器上,使用3DNow!來幫助增加他們的效能。微軟後來也在其開發的DirectX7.0中加入針對3DNow!的最佳化,使當時的Athlon處理器在3D遊戲效能上首次全面超過對手Intel的Pentium3處理器。
SSE
在1999年Intel推出SSE指令集,增加了八個新的128-bit暫存器(不跟其他的暫存器重疊使用)。這些指令類似於AMD的3DNow!,主要是增加浮點數運算的SIMD指令。
SSE2
2001年Intel推出SSE2指令集,增加了:完整地補充了整數指令(與MMX相似)到原來的SSE暫存器。 64位的SIMD浮點運算指令到原來的SSE暫存器。第一個的增加導致MMX幾乎是過時可以捨棄的,第二個則允許這些指令可以讓傳統的編譯器現實地產生。
SSE3
於2004年隨著Pentium4處理器的改版Prescott核心推出。SSE3增加特定的存儲器和thread-handling指令來提升Intel超執行緒的效能,在科學計算方面也有增強。
SSE4
x862007年1月,Intel公開發表使用其45納米製程"Penryn"晶片家族的PC和伺服器。"Penryn"是這一系列依據英特爾Core微架構之筆記本電腦、台式機和伺服器晶片家族的代號,首次正式發布時共有16款處理器,除了一款IntelCore2ExtremeQX9650是針對普通台式機市場外,其餘的雙核Xeon5200系列和四核5400系列都是伺服器處理器。基本上Penryn是繼Merom之後的縮小版Core2Duo,再加上47條新的SSE4指令集等額外配備。SSE4指令集之首次發表時間為2006年9月的英特爾開發者論壇(IDF,IntelDeveloperForum)。另外,x86處理器製造廠商AMD也在該公司最新K10架構的Phenom處理器中,加入4條新的SSE4A指令集。注意,SSE4與SSE4A無法彼此兼容。
64位架構
到2002年,由於32位特性的長度,x86的架構開始到達某些設計的極限。這個導致要處理大量的信息儲存大於4GB會有困難,像是在資料庫或是影片編輯上可以發現。Intel原本已經決定在64位的時代完全地捨棄x86兼容性,推出新的架構稱為IA-64技術作為他的Itanium處理器產品線的基礎。IA-64與x86的軟體天生不兼容;它使用各種模擬形式來運行x86的軟體,不過,以模擬方式來運行的效率十分低下,並且會影響其他程式的運行。AMD主動把32位x86(或稱為IA-32)擴充為64位。它以一個稱為AMD64的架構出現(在重命名前也稱為x86-64),且以這個技術為基礎的第一個產品是單核心的Opteron和Athlon64處理器家族。由於AMD的64位處理器產品線首先進入市場,且微軟也不願意為Intel和AMD開發兩套不同的64位作業系統,Intel也被迫採納AMD64指令集且增加某些新的擴充到他們自己的產品,命名為EM64T架構(顯然他們不想承認這些指令集是來自它的主要對手),EM64T後來被Intel正式更名為Intel64。這是由非Intel的製造商所發起和設計的第一次重大的x86架構升級。也許更重要的,它也是第一次Intel實際上從外部來源接受這項本質的技術。
虛擬
虛擬x86是很困難的,因為它的架構並未達到波佩克與戈德堡虛擬化需求。然而,有好幾個商業的虛擬x86產品,比如VMware和微軟的VirtualPC。Intel和AMD兩者都有公開宣布未來的x86處理器將會有新的增強來容易達到更有效率的虛擬。Intel針對這項虛擬特性的代號稱為"Vanderpool"和"Silvervale";AMD則使用"Pacifica"這個代號。
架構處理
X86就是採用cisc(ComplexInstructionSet
Computer,複雜指令架構計算機)架構的處理器。大多數CPU廠商(如AMD,Intel)生產的就是這種處理器。與採用RISC(Reduced
…,精簡指令架構計算機)架構的PowerPC(如蘋果電腦)不同。
在CISC處理器中,程式的各條指令是按順序串列執行的,每條指令中的各個操作也是按順序串列執行的。順序執行的優點是控制簡單,但計算機各部分的利用率
不高,執行速度慢。諸如IA-32、x86-32、x86-64都是屬於x86架構的。如Intel的32位伺服器Xeon(至強)處理器系列、AMD的全系列,還有VIA的全系列處理器產品都屬於x86架構的。
指令集
1978年,Intel公司再次領導潮流,首次生產出16位的微處理器,並命名為i8086,同時還生產出與之相配合的數學協處理器i8087,這兩種晶片使用相互兼容的指令集,但在i8087指令集中增加了一些專門用於對數、指數和三角函式等數學計算指令。由於這些指令集套用於i8086和i8087,所以人們也這些指令集統一稱之為X86指令集。x86雖然以後Intel又陸續生產出第二代、第三代等更先進和更快的新型CPU,但都仍然兼容原來的X86指令,而且Intel在後續CPU的命名上沿用了原先的X86序列,直到後來因商標註冊問題,才放棄了繼續用阿拉伯數字命
名。至於在後來發展壯大的其他公司,例如AMD和Cyrix等,在486以前(包括486)的CPU都是按Intel的命名方式為自己的X86系列CPU
命名,但到了586時代,市場競爭越來越厲害了,由於商標註冊問題,它們已經無法繼續使用與Intel的X86系列相同或相似的命名,只好另外為自己的
586、686兼容CPU命名了。1979年,INTEL公司推出了8088晶片,它仍舊是屬於16位微處理器,內含29000個電晶體,時鐘頻率為4.77MHz,地址匯流排為20位,可使用1MB記憶體。8088內部數據匯流排都是16位,外部數據匯流排是8位,而它的兄弟8086是16位。1981年8088晶片首次用於IBMPC機中,開創了全新的微機時代。也正是從8088開始,PC機(個人電腦)的概念開始在全世界範圍內發展起來。為了保證電腦能繼續運行以往開發的各類應用程式以保護和繼承豐富的軟體資源,所以Intel公司所生產的所有CPU仍然繼續使用X86指令集,所以它的CPU仍屬於X86系列。另外除Intel公司之外,AMD和Cyrix等廠家也相繼生產出能使用X86指令集的CPU,由於這些CPU能運行所有的為Intel
CPU所開發的各種軟體,所以電腦業內人士就將這些CPU列為Intel的CPU兼容產品。由於Intel
X86系列及其兼容CPU都使用X86指令集,所以就形成了今天龐大的X86系列及兼容CPU陣容。當然在目前的台式(攜帶型)電腦中並不都是使用X86
系列CPU,部分伺服器和蘋果(Macintosh)機中還使用美國DIGITAL(數字)公司的Alpha61164和PowerPC
604e系列CPU。
生產商
有多家公司設計、生產並售賣x86處理器及其兼容產品,其中包括:英特爾(Intel)AMD
ChipsandTechnologiesCyrix(被VIA收購)IBMIDT國家半導體(NS,National
Semiconductor)日本電氣(NEC)NexGen(被AMD收購)RiseTechnology(被矽統技術收購)
SGS-Thomson矽統(SiS)德州儀器(TI,TexasInstruments)全美達(Transmeta)聯華電子(UMC)威盛電子(VIA)