百科解釋
x86或80x86是英代爾Intel首先開(kāi)發(fā)制造的一種微處理器體系結(jié)構(gòu)的泛稱(chēng)。
該系列較早期的處理器名稱(chēng)是以數(shù)字來(lái)表示,并以“86”作為結(jié)尾,包括Intel 8086、80186、80286、80386以及80486,因此其架構(gòu)被稱(chēng)為“x86”。由于數(shù)字并不能作為注冊(cè)商標(biāo),因此Intel及其競(jìng)爭(zhēng)者均在新一代處理器使用可注冊(cè)的名稱(chēng),如Pentium,F(xiàn)時(shí)Intel把x86-32稱(chēng)為IA-32,全名為“Intel Architecture, 32-bit”。不過(guò),由于x86包括16位元的處理器,這樣的命名也出現(xiàn)麻煩。
x86架構(gòu)于1978年推出的Intel 8086中央處理器中首度出現(xiàn),它是從Intel 8008處理器中發(fā)展而來(lái)的,而8008則是發(fā)展自Intel 4004的。8086在三年后為IBM PC所選用,之后x86便成為了個(gè)人電腦的標(biāo)準(zhǔn)平臺(tái),成為了歷來(lái)最成功的CPU架構(gòu)。
其他公司也有制造x86架構(gòu)的處理器,計(jì)有Cyrix(現(xiàn)為VIA所收購(gòu))、NEC集團(tuán)、IBM、IDT以及Transmeta。Intel以外最成功的制造商為AMD,其Athlon系列處理器的市場(chǎng)份額僅次于Pentium。
8086是16位元處理器;直到1985年32位元的80386的開(kāi)發(fā),這個(gè)架構(gòu)都維持是16位元。接著一系列的處理器表示了32位元架構(gòu)的細(xì)微改進(jìn),推出了數(shù)種的擴(kuò)充,直到2003年AMD對(duì)于這個(gè)架構(gòu)發(fā)展了64位元的擴(kuò)充,并命名為AMD64。后來(lái)Intel也推出了與之兼容的處理器,并命名為Intel 64。兩者一般被統(tǒng)稱(chēng)為x86-64或x64,開(kāi)創(chuàng)了x86的64位時(shí)代。
值得注意的是Intel早在1990年代就與HP合作提出了一種用在安騰系列處理器中的獨(dú)立的64位架構(gòu),這種架構(gòu)被稱(chēng)為IA-64。IA-64是一種嶄新的系統(tǒng),和x86架構(gòu)完全沒(méi)有相似性;不應(yīng)該把它與x86-64或x64弄混。
x86架構(gòu)是重要地可變指令長(zhǎng)度的CISC(復(fù)雜指令集電腦,Complex Instruction Set Computer)。字組(word, 4字節(jié))長(zhǎng)度的內(nèi)存存取允許不對(duì)齊內(nèi)存位址,字組是以低位字節(jié)在前的順序儲(chǔ)存在內(nèi)存中。向前相容性一直都是在x86架構(gòu)的發(fā)展背后一股驅(qū)動(dòng)力量(設(shè)計(jì)的需要決定了這項(xiàng)因素而常常導(dǎo)致批評(píng),尤其是來(lái)自對(duì)手處理器的擁護(hù)者和理論界,他們對(duì)于一個(gè)被廣泛認(rèn)為是是落后設(shè)計(jì)的架構(gòu)的持續(xù)成功感到不解)。但在較新的微架構(gòu)中,x86處理器會(huì)把x86指令轉(zhuǎn)換為更像RISC的微指令再予執(zhí)行,從而獲得可與RISC比擬的超標(biāo)量性能,而仍然保持向前兼容。
在這篇簡(jiǎn)短的文章中出現(xiàn)的指令和暫存器助憶符號(hào)的名稱(chēng),都在Intel文件中有所指定以及使用在 Intel組譯器中(和相容的,比如微軟的MASM、Borland的TASM、CAD-UL的as386 等等)。一個(gè)以Intel語(yǔ)法指定的指令"mov al, 30h"與AT&T語(yǔ)法的"movb $0x30, %al"相當(dāng),都是會(huì)被轉(zhuǎn)譯為兩個(gè)位元的機(jī)器碼"B0 30"(十六進(jìn)制)。你可以發(fā)現(xiàn)在這段程式中的"mov"或 "al",都是原來(lái)的Intel助憶符號(hào)。如果我們想要的話(huà),我們可以寫(xiě)一個(gè)組譯器由程式碼''''move immediate byte hexadecimally encoded 30 into low half of the first register''''(移動(dòng)立即值位元十六進(jìn)制編碼30到第一個(gè)暫存器的低半部位),來(lái)產(chǎn)生相同的機(jī)器碼。然而,傳統(tǒng)上匯編器一直使用Intel的助憶符號(hào)。
x86組合語(yǔ)言會(huì)在x86 組合語(yǔ)言文章中有更詳細(xì)的討論。
實(shí)時(shí)模式
Intel 8086和8088有14個(gè)16位元暫存器。其中四個(gè)(AX, BX, CX, DX)是通用目的(盡管每個(gè)暫存器都有附加目的;舉個(gè)例子:只有CX可以被用來(lái)當(dāng)作loop(循環(huán))指令的計(jì)數(shù)器。)每個(gè)暫存器可以被當(dāng)成兩個(gè)分開(kāi)的字節(jié)存。ㄒ虼薆X的高位元可以被當(dāng)成BH以及低位元BL)。除了這些暫存器, 還有四個(gè)區(qū)段暫存器(CS、DS、SS、ES)。他們用來(lái)產(chǎn)生內(nèi)存的尋址。還有兩個(gè)指標(biāo)暫存器(SP是指向堆棧的底部, BP可以用來(lái)指向堆;騼(nèi)存的其它地方)。兩個(gè)指標(biāo)暫存器(SI和DI)可以用來(lái)指向陣列的內(nèi)部。最后,有旗標(biāo)暫存器(包含狀態(tài)旗標(biāo)比如進(jìn)制、溢位、結(jié)果為零,等等)。以及IP是用來(lái)指向目前執(zhí)行指令的位址。
在真實(shí)模式下,內(nèi)存的存取是被區(qū)段開(kāi)來(lái)。為了得到最后20位元的內(nèi)存位址,要將區(qū)段的位址往左移動(dòng)4位元,并且加上偏移的位址。因此,真實(shí)模式下總共可以尋址的空間是220字節(jié), 或者是1MB,于1979年是相當(dāng)讓人印象深刻的象征。在真實(shí)模式下有兩種尋址模式:near和far。在 far模式,區(qū)段跟偏移都需要被指定;在near模式,只需要偏移模式被指定,而內(nèi)存區(qū)段是由適當(dāng)?shù)膮^(qū)段暫存器獲得。以資料而言是使用DS暫存器,程式碼是CS暫存器,堆棧是SS暫存器。舉個(gè)例子,如果DS是A000h且SI是5677h,DS:SI會(huì)指向計(jì)憶體的絕對(duì)位址DS × 16 + SI = A5677h
在這種架構(gòu)下,兩對(duì)不同的區(qū)段/偏移可以指向一個(gè)相同的絕對(duì)位址。因此如果DS是A111h且SI是4567h,DS:SI會(huì)指向跟上一段相同的A5677h。除了duplicity之外,這種架構(gòu)無(wú)法同時(shí)一次擁有4個(gè)以上的區(qū)段。此外,CS、DS和SS是為了程式正確功能而必須的,因此僅僅只有ES可以被用來(lái)指向其它的地方。這種模式原本是為了與Intel 8085相容,導(dǎo)致程式設(shè)計(jì)師永無(wú)止盡的痛苦。
除了以上所說(shuō)的,8086也擁有8-bit的64K(另一種說(shuō)法是16-bit的32K)輸出輸入(en:I/O)空間,以及一個(gè)由硬件支援的64K(一個(gè)區(qū)段)內(nèi)存堆棧。只有words(2字節(jié))可以被推入到堆棧中。堆棧是由內(nèi)存的上端往下成長(zhǎng),他的底端是由SS:SP指向。有256個(gè)中斷(interrupts),可以由硬件或是軟件同時(shí)組成。中斷是可以串連在一起,使用堆棧來(lái)儲(chǔ)存返回被中斷的程式位址。
16位元保護(hù)模式
Intel 80286可以在不改變?nèi)魏螙|西下支援8086的真實(shí)模式16位元軟件,然而它也支援額外的工作模式稱(chēng)為保護(hù)模式,可以將可尋址的實(shí)體內(nèi)存擴(kuò)充到16MB,可尋址的虛擬內(nèi)存最大到 1GB。這是使用節(jié)區(qū)暫存器來(lái)儲(chǔ)存在節(jié)區(qū)表格中的索引值。處理器中有兩個(gè)這樣的表格,分別為GDT和LDT,每一個(gè)可以?xún)?chǔ)存最多8192個(gè)節(jié)區(qū)的描述子,每一個(gè)節(jié)區(qū)可以給予最大到64KB的內(nèi)存存取。節(jié)區(qū)表格提供一個(gè)24位元的基底位址(base address),可以用此基底位址增加想要的偏移量來(lái)創(chuàng)造出一個(gè)絕對(duì)位址。此外,每一個(gè)節(jié)區(qū)可以被賦予四種權(quán)限等級(jí)中的一種(稱(chēng)為 "rings")。
盡管這個(gè)推出的功能是一項(xiàng)進(jìn)步,但是他們并沒(méi)有被廣泛地使用,因?yàn)楸Wo(hù)模式的操作系統(tǒng)無(wú)法執(zhí)行現(xiàn)有的真實(shí)模式軟件。這樣的能力只有在隨后80386處理器的虛擬86模式中出現(xiàn)。
在同時(shí),操作系統(tǒng)比如OS/2嘗試使用類(lèi)似乒乓的方法,讓處理器在保護(hù)和真實(shí)模式間切換。這樣都會(huì)讓電腦變慢且不安全,像是在真實(shí)模式下的程式可以輕易地使電腦當(dāng)機(jī)。OS/2也定義了限制性的程式設(shè)計(jì)規(guī)則允許"Family API"或"bound"程式可以在真實(shí)模式或保護(hù)模式下執(zhí)行。然而這是給原本為保護(hù)模式下設(shè)計(jì)的程式有關(guān),反之則不然。保護(hù)模式程式并不支援節(jié)區(qū)選擇子和實(shí)體內(nèi)存之間的關(guān)系。有時(shí)候會(huì)錯(cuò)誤地相信在16位元保護(hù)模式下執(zhí)行真實(shí)模式的程式,導(dǎo)致IBM必須選擇使用Intel保留給BIOS的中斷呼叫。事實(shí)上這類(lèi)的程式使用任意的選擇子數(shù)值和使用在上面提到的“節(jié)區(qū)運(yùn)算”的方式有關(guān)。
這個(gè)問(wèn)題也在Windows 3.x上出現(xiàn)。這個(gè)推出版本想要在16位元保護(hù)模式下執(zhí)行程式,而先前的版本只能在真實(shí)模式下執(zhí)行。理論上,如果Windows 1.x或2.x程式是寫(xiě)得“適當(dāng)”且避免使用節(jié)區(qū)運(yùn)算的方式,它就有可能在真實(shí)和保護(hù)模式兩者下執(zhí)行。Windows程式一般來(lái)說(shuō)都會(huì)避免節(jié)區(qū)運(yùn)算,這是因?yàn)閃indows實(shí)作出軟件的虛擬內(nèi)存方式,及當(dāng)程式不執(zhí)行時(shí)候,搬移內(nèi)存中的程式碼和資料,所以操作絕對(duì)位址的方式是很危險(xiǎn)的;當(dāng)程式不執(zhí)行時(shí),被認(rèn)為要保持內(nèi)存區(qū)塊的“handles”,這樣的handles已經(jīng)非常相當(dāng)于保護(hù)模式的選擇子。在保護(hù)模式下的Windows 3.0執(zhí)行一個(gè)舊的程式,會(huì)觸發(fā)一個(gè)警告對(duì)話(huà)盒,建議在真實(shí)模式下執(zhí)行Windows(推測(cè)還是仍然可以使用擴(kuò)充內(nèi)存,可能是在80386機(jī)器用EMM386模擬,因此它并不被局限于640KB)或是從廠商那更新到新的版本。好的行為之程式可能可以使用特別的工具來(lái)避免這樣的對(duì)話(huà)盒。不可能有些GUI程式在16位元保護(hù)模式下執(zhí)行,且其它GUI程式在真實(shí)模式執(zhí)行,可能是因?yàn)檫@會(huì)需要兩個(gè)分開(kāi)的環(huán)境且會(huì)依于前面所提到的處理器在兩個(gè)模式間的乒乓效應(yīng)。從Windows 3.1版開(kāi)始,真實(shí)模式就消失了。
32位元保護(hù)模式
Intel 80386推出后,也許是到目前為止x86架構(gòu)的最大躍進(jìn)。除了需要值得注意的Intel 80386SX是32位元架構(gòu)但僅只有24位元尋址(和16位元資料總線)。除此之外其他架構(gòu)都是32位元 - 所有的暫存器、指令集、輸出輸入空間和內(nèi)存尋址。為了能夠在后者所說(shuō)的功能工作,要使用32位元擴(kuò)充的保護(hù)模式。然而不像286,386所有的區(qū)段可以使用32位元的偏移量,即使內(nèi)存空間有使用區(qū)段,但也允許應(yīng)用程式存取超過(guò)4GB空間而不需要區(qū)段的分隔。此外,32位元保護(hù)模式提供分頁(yè)的支援,是一種讓虛擬內(nèi)存得以實(shí)現(xiàn)的機(jī)制。
沒(méi)有新的通用暫存器被加入。所有16位元的暫存器除了區(qū)段暫存器外都擴(kuò)充為32位元。Intel在暫存器的助記符號(hào)上加入“E”來(lái)表示(因此擴(kuò)充的AX變成EAX,SI變成ESI,依此類(lèi)推)。因?yàn)橛懈嗟臅捍嫫鲾?shù)量、指令、和運(yùn)算單元,因此機(jī)器碼的格式也被擴(kuò)充。為了提供與先前的架構(gòu)相容,包含執(zhí)行碼的區(qū)段可以被標(biāo)示為16或是32位元的指令集。此外,特殊的前置符號(hào)也可以用來(lái)在16位元的區(qū)段包含32位元的指令碼,反之亦然。
分頁(yè)跟區(qū)段的內(nèi)存存取是為了支援現(xiàn)在多工操作系統(tǒng)所必須要的。Linux、386BSD、Windows NT和Windows 95都是一開(kāi)始為386所發(fā)展,因?yàn)樗堑谝活w提供可靠地程式分離內(nèi)存空間的支援(每個(gè)程式擁有自己的尋址空間)以及可以在必要的情況下打斷他們程式的執(zhí)行(使用ring,一種x86保護(hù)模式下權(quán)力分級(jí)的名稱(chēng))。這種386的基本架構(gòu)變成未來(lái)所有x86系列發(fā)展的基礎(chǔ)。
Intel 80386數(shù)學(xué)輔助運(yùn)算處理器也在整合到這個(gè)CPU之后的x86系列中,也就是Intel 80486。新的FPU可以幫助浮點(diǎn)數(shù)運(yùn)算,對(duì)于科學(xué)計(jì)算和圖形設(shè)計(jì)是非常重要。
MMX和之后
1996年Intel的MMX(AMD認(rèn)為這是矩陣數(shù)學(xué)擴(kuò)充Matrix Math Extensions的縮寫(xiě),但大多數(shù)時(shí)候都被當(dāng)成Multi-Media Extension,而Intel從來(lái)沒(méi)有官方宣布過(guò)詞源)技術(shù)出現(xiàn)。盡管這項(xiàng)新的科技得到廣泛宣傳,但它的精髓是非常簡(jiǎn)單的:MMX定義了八個(gè)64位元SIMD暫存器,與Intel Pentium處理器的FPU堆棧有相重疊。不幸的是,這些指令無(wú)法非常簡(jiǎn)單地對(duì)應(yīng)到由原來(lái)C編譯器所產(chǎn)生的指令碼中。MMX也只局限于整數(shù)的運(yùn)算。這項(xiàng)技術(shù)的缺點(diǎn)導(dǎo)致MMX在它早期的存在有輕微的影響。現(xiàn)今,MMX通常是用在某些2D影片應(yīng)用程式中。
3DNow!
1997年AMD推出3DNow!,是對(duì)于MMX的SIMD的浮點(diǎn)指令增強(qiáng)(針對(duì)相同的 MMX 暫存器)。盡管這些也沒(méi)有解決編譯器的難題,但這項(xiàng)技術(shù)的推出符合了PC上的3D休閑娛樂(lè)應(yīng)用程式之崛起。3D游戲開(kāi)發(fā)者和3D繪圖硬件制造商在AMD的AMD K6和Athlon系列處理器上,使用3DNow!來(lái)幫助增加他們的效能。微軟后來(lái)也在其開(kāi)發(fā)的Direct X7.0中加入針對(duì)3DNow!的最佳化,使當(dāng)時(shí)的Athlon處理器在3D游戲效能上首次全面超過(guò)對(duì)手 Intel 的Pentium 3處理器。
SSE
在1999年Intel推出SSE指令集,增加了八個(gè)新的128-bit暫存器(不跟其他的暫存器重疊使用)。這些指令類(lèi)似于AMD的3DNow!,主要是增加浮點(diǎn)數(shù)運(yùn)算的SIMD指令。
SSE2
2001年Intel推出SSE2指令集,增加了:
完整地補(bǔ)充了整數(shù)指令(與MMX相似)到原來(lái)的SSE暫存器。
64位元的SIMD浮點(diǎn)運(yùn)算指令到原來(lái)的SSE暫存器。
第一個(gè)的增加導(dǎo)致MMX幾乎是過(guò)時(shí)可以舍棄的,第二個(gè)則允許這些指令可以讓傳統(tǒng)的編譯器現(xiàn)實(shí)地產(chǎn)生。
SSE3
于2004年隨著Pentium 4處理器的改版Prescott核心推出。SSE3增加特定的內(nèi)存和thread-handling指令來(lái)提升Intel超執(zhí)行緒的效能,在科學(xué)計(jì)算方面也有增強(qiáng)。
SSE4
2007/01,Intel公開(kāi)發(fā)表使用其45納米制程Penryn芯片家族的PC和服務(wù)器。Penryn是這一系列依據(jù)英特爾Core微架構(gòu)之筆記型電腦、桌上型電腦和服務(wù)器芯片家族的代號(hào);旧螾enryn是繼Merom之后的縮小版Core 2 Duo,再加上47條新的SSE4指令集等額外配備。SSE4指令集之首次發(fā)表時(shí)間為 2006/09 開(kāi)發(fā)員論壇(Intel Developer Forum)。
另外,x86處理器制造廠商AMD也在該公司最新K10架構(gòu)的Phenom處理器中,加入4條新的SSE4A指令集。注意,SSE4與SSE4A無(wú)法彼此相容
64位元
到2002年,由于32位元特性的長(zhǎng)度,x86的架構(gòu)開(kāi)始到達(dá)某些設(shè)計(jì)的極限。這個(gè)導(dǎo)致要處理大量的資訊儲(chǔ)存大于4GB會(huì)有困難,像是在數(shù)據(jù)庫(kù)或是影片編輯上可以發(fā)現(xiàn)。
Intel原本已經(jīng)決定在64位元的世代完全地舍棄x86相容性,推出新的架構(gòu)稱(chēng)為IA-64技術(shù)作為他的Itanium處理器產(chǎn)品線的基礎(chǔ)。IA-64與x86的軟件天生不相容;它使用各種模擬形式來(lái)執(zhí)行x86的軟件,不過(guò),以模擬方式來(lái)運(yùn)行的效率十分低下,并且會(huì)影響其他程序的運(yùn)行。
AMD主動(dòng)把32位元x86,或稱(chēng)為IA-32擴(kuò)充為64位元。它與一個(gè)稱(chēng)為AMD64的架構(gòu)出現(xiàn)(在重新命名前也稱(chēng)為x86-64),且以這個(gè)技術(shù)為基礎(chǔ)的第一個(gè)產(chǎn)品是Opteron和Athlon 64處理器家族。由于AMD64處理器產(chǎn)品線的成功,Intel采取AMD64指令集且增加某些新的擴(kuò)充到他們自己的產(chǎn)品,命名為EM64T架構(gòu)(顯然地他們不想承認(rèn)這些指令集是來(lái)自它的主要對(duì)手),EM64T后來(lái)被Intel正式更名為Intel 64。
這是由非Intel的制造商所發(fā)起和設(shè)計(jì)的第一次重大的x86架構(gòu)升級(jí)。也許更重要的,它也是第一次Intel實(shí)際上從外部來(lái)源接受這項(xiàng)本質(zhì)的技術(shù)。
虛擬
虛擬x86是很困難的,因?yàn)樗募軜?gòu)并無(wú)達(dá)到Popek and Goldberg virtualization requirements。然而,有好幾個(gè)商業(yè)的虛擬x86產(chǎn)品,比如VMware和微軟的Virtual PC。Intel和AMD兩者都有公開(kāi)宣布未來(lái)的x86處理器將會(huì)有新的增強(qiáng)來(lái)容易達(dá)到更有效率的虛擬。Intel針對(duì)這項(xiàng)虛擬特性的代號(hào)稱(chēng)為"Vanderpool"和"Silvervale";AMD則使用"Pacifica"這個(gè)代號(hào)。
有多間公司設(shè)計(jì)、生產(chǎn)并售賣(mài)x86處理器及其兼容產(chǎn)品,其中包括:
英特爾
AMD
Chips and Technologies
Cyrix被VIA收購(gòu)
IBM
IDT
國(guó)家半導(dǎo)體(National Semiconductor)
日本電氣(NEC)
NexGen被AMD收購(gòu)
Rise Technology被硅統(tǒng)科技收購(gòu)
SGS-Thomson
硅統(tǒng)科技(SiS)
德州儀器
全美達(dá)(Transmeta)
聯(lián)華電子(UMC)
威盛電子(VIA)
Movtalvo