x86架構(gòu)于1978年推出的Intel 8086中央處理器中首度出現(xiàn),它是從Intel 8008處理器中發(fā)展而來的,而8008則是發(fā)展自Intel 4004的。8086在三年后為IBM PC所選用,之后x86便成為了個人計(jì)算機(jī)的標(biāo)準(zhǔn)平臺,成為了歷來最成功的CPU架構(gòu)。
其他公司也有制造x86架構(gòu)的處理器,計(jì)有Cyrix(現(xiàn)為VIA所收購)、NEC集團(tuán)、IBM、IDT以及Transmeta。Intel以外最成功的制造商為AMD,其早先產(chǎn)品Athlon系列處理器的市場份額僅次于Intel Pentium。
8086是16位處理器;直到1985年32位的80386的開發(fā),這個架構(gòu)都維持是16位。接著一系列的處理器表示了32位架構(gòu)的細(xì)微改進(jìn),推出了數(shù)種的擴(kuò)充,直到2003年AMD對于這個架構(gòu)發(fā)展了64位的擴(kuò)充,并命名為AMD64。后來Intel也推出了與之兼容的處理器,并命名為Intel 64。兩者一般被統(tǒng)稱為x86-64或x64,開創(chuàng)了x86的64位時(shí)代。
值得注意的是Intel早在1990年代就與HP合作提出了一種用在安騰系列處理器中的獨(dú)立的64位架構(gòu),這種架構(gòu)被稱為IA-64。IA-64是一種嶄新的系統(tǒng),和x86架構(gòu)完全沒有相似性;不應(yīng)該把它與x86-64或x64弄混。
x86架構(gòu)是重要地可變指令長度的CISC(復(fù)雜指令集計(jì)算機(jī),Complex Instruction Set Computer)。字組(word, 4字節(jié))長度的存儲器訪問允許不對齊存儲器地址,字組是以低位字節(jié)在前的順序儲存在存儲器中。向前兼容性一直都是在x86架構(gòu)的發(fā)展背后一股驅(qū)動力量(設(shè)計(jì)的需要決定了這項(xiàng)因素而常常導(dǎo)致批評,尤其是來自對手處理器的擁護(hù)者和理論界,他們對于一個被廣泛認(rèn)為是是落后設(shè)計(jì)的架構(gòu)的持續(xù)成功感到不解)。但在較新的微架構(gòu)中,x86處理器會把x86指令轉(zhuǎn)換為更像RISC的微指令再予執(zhí)行,從而獲得可與RISC比擬的超標(biāo)量性能,而仍然保持向前兼容。x86架構(gòu)的處理器一共有四種執(zhí)行模式,分別是真實(shí)模式,保護(hù)模式,系統(tǒng)管理模式以及虛擬V86模式。
實(shí)時(shí)模式
Intel 8086和8088有14個16位寄存器。其中四個(AX, BX, CX, DX)是通用目的(盡管每個寄存器都有附加目的;舉個例子:只有CX可以被用來當(dāng)作loop(循環(huán))指令的計(jì)數(shù)器。)每個寄存器可以被當(dāng)成兩個分開的字節(jié)訪問(因此BX的高位可以被當(dāng)成BH,低位則可以當(dāng)成BL)。除了這些寄存器,還有四個區(qū)段寄存器(CS、DS、SS、ES)。他們用來產(chǎn)生存儲器的絕對地址。還有兩個指針寄存器(SP是指向堆棧的底部,BP可以用來指向堆棧或存儲器的其它地方)。兩個指針寄存器(SI和DI)可以用來指向數(shù)組的內(nèi)部。最后,有標(biāo)志寄存器(包含狀態(tài)標(biāo)志比如進(jìn)位、溢出、零標(biāo)志,等等)。以及IP是用來指向目前運(yùn)行指令的地址。
在實(shí)模式下,存儲器的訪問是被區(qū)段開來。為了得到最后20位的存儲器地址,要將區(qū)段的地址往左移動4位,并且加上偏移的地址。因此,實(shí)模式下總共可以尋址的空間是2字節(jié),或者是1MB,于1979年是相當(dāng)讓人印象深刻的象征。在實(shí)模式下有兩種尋址模式:near和far。在 far模式,區(qū)段跟偏移都需要被指定;在near模式,只需要偏移模式被指定,而存儲器區(qū)段是由適當(dāng)?shù)膮^(qū)段寄存器獲得。以數(shù)據(jù)而言是使用DS寄存器,代碼是CS寄存器,堆棧是SS寄存器。舉個例子,如果DS是A000h且SI是5677h,DS:SI會指向計(jì)憶體的絕對地址DS × 16 + SI = A5677h
在這種架構(gòu)下,兩對不同的區(qū)段/偏移可以指向一個相同的絕對地址。因此如果DS是A111h且SI是4567h,DS:SI會指向跟上一段相同的A5677h。除了duplicity之外,這種架構(gòu)無法同時(shí)一次擁有4個以上的區(qū)段。此外,CS、DS和SS是為了程序正確功能而必須的,因此僅僅只有ES可以被用來指向其它的地方。這種模式原本是為了與Intel 8085兼容,導(dǎo)致程序設(shè)計(jì)師永無止盡的痛苦。
除了以上所說的,8086也擁有8-bit的64K(另一種說法是16-bit的32K)輸入輸出(en:I/O)空間,以及一個由硬件支持的64K(一個區(qū)段)存儲器堆棧。只有words(2字節(jié))可以被推入到堆棧中。堆棧是由存儲器的上端往下成長,他的底端是由SS:SP指向。有256個中斷(interrupts),可以由硬件或是軟件同時(shí)組成。中斷是可以串連在一起,使用堆棧來儲存返回被中斷的程序地址。
16位保護(hù)模式
Intel 80286可以在不改變?nèi)魏螙|西下,支持8086的實(shí)模式16位軟件,然而它也支持額外的工作模式稱為保護(hù)模式,可以將可尋址的物理內(nèi)存擴(kuò)充到16MB,可尋址的虛擬內(nèi)存最大到 1GB。這是使用節(jié)區(qū)寄存器來儲存在節(jié)區(qū)表格中的索引值。處理器中有兩個這樣的表格,分別為GDT和LDT,每一個可以儲存最多8192個節(jié)區(qū)的描述子,每一個節(jié)區(qū)可以給予最大到64KB的存儲器訪問。節(jié)區(qū)表格提供一個24位的基底地址(base address),可以用此基底地址增加想要的偏移量來創(chuàng)造出一個絕對地址。此外,每一個節(jié)區(qū)可以被賦予四種權(quán)限等級中的一種(稱為 “rings”)。
盡管這個推出的功能是一項(xiàng)進(jìn)步,但是他們并沒有被廣泛地使用,因?yàn)楸Wo(hù)模式的操作系統(tǒng)無法運(yùn)行現(xiàn)有的實(shí)模式軟件。這樣的能力只有在隨后80386處理器的虛擬86模式中出現(xiàn)。
在同時(shí),操作系統(tǒng)比如OS/2嘗試使用類似乒乓的方法,讓處理器在保護(hù)和實(shí)模式間切換。這樣都會讓計(jì)算機(jī)變慢且不安全,像是在實(shí)模式下的程序可以輕易地使計(jì)算機(jī)當(dāng)機(jī)。OS/2也定義了限制性的程序設(shè)計(jì)規(guī)則允許“Family API”或“bound”程序可以在實(shí)模式或保護(hù)模式下運(yùn)行。然而這是給原本為保護(hù)模式下設(shè)計(jì)的程序有關(guān),反之則不然。保護(hù)模式程序并不支持節(jié)區(qū)選擇子和物理內(nèi)存之間的關(guān)系。有時(shí)候會錯誤地相信在16位保護(hù)模式下運(yùn)行實(shí)模式的程序,導(dǎo)致IBM必須選擇使用Intel保留給BIOS的中斷調(diào)用。事實(shí)上這類的程序使用任意的選擇子數(shù)值和使用在上面提到的“節(jié)區(qū)運(yùn)算”的方式有關(guān)。
這個問題也在Windows 3.x上出現(xiàn)。這個推出版本想要在16位保護(hù)模式下運(yùn)行程序,而先前的版本只能在實(shí)模式下運(yùn)行。理論上,如果Windows 1.x或2.x程序是寫得“適當(dāng)”且避免使用節(jié)區(qū)運(yùn)算的方式,它就有可能在真實(shí)和保護(hù)模式兩者下運(yùn)行。Windows程序一般來說都會避免節(jié)區(qū)運(yùn)算,這是因?yàn)閃indows實(shí)現(xiàn)出軟件的虛擬內(nèi)存方式,及當(dāng)程序不運(yùn)行時(shí)候,搬移存儲器中的代碼和數(shù)據(jù),所以操作絕對地址的方式是很危險(xiǎn)的;當(dāng)程序不運(yùn)行時(shí),被認(rèn)為要保持存儲器區(qū)塊的“handles”,這樣的handles已經(jīng)非常相當(dāng)于保護(hù)模式的選擇子。在保護(hù)模式下的Windows 3.0運(yùn)行一個舊的程序,會觸發(fā)一個警告對話盒,建議在實(shí)模式下運(yùn)行Windows(推測還是仍然可以使用擴(kuò)充存儲器,可能是在80386機(jī)器用EMM386模擬,因此它并不被局限于640KB)或是從廠商那更新到新的版本。好的行為之程序可能可以使用特別的工具來避免這樣的對話盒。不可能有些GUI程序在16位保護(hù)模式下運(yùn)行,且其它GUI程序在實(shí)模式運(yùn)行,可能是因?yàn)檫@會需要兩個分開的環(huán)境且會依于前面所提到的處理器在兩個模式間的乒乓效應(yīng)。從Windows 3.1版開始,實(shí)模式就消失了。
32位保護(hù)模式
Intel 80386推出后,也許是到目前為止x86架構(gòu)的最大躍進(jìn)。除了需要值得注意的Intel 80386SX是32位架構(gòu)但僅只有24位尋址(和16位數(shù)據(jù)總線)。除此之外其他架構(gòu)都是32位 - 所有的寄存器、指令集、輸出輸入空間和存儲器尋址。為了能夠在后者所說的功能工作,要使用32位擴(kuò)充的保護(hù)模式。然而不像286,386所有的區(qū)段可以使用32位的偏移量,即使存儲器空間有使用區(qū)段,但也允許應(yīng)用程序訪問超過4GB空間而不需要區(qū)段的分隔。此外,32位保護(hù)模式提供分頁的支持,是一種讓虛擬內(nèi)存得以實(shí)現(xiàn)的機(jī)制。
沒有新的通用寄存器被加入。所有16位的寄存器除了區(qū)段寄存器外都擴(kuò)充為32位。Intel在寄存器的助記符號上加入“E”來表示(因此擴(kuò)充的AX變成EAX,SI變成ESI,依此類推)。因?yàn)橛懈嗟募拇嫫鲾?shù)量、指令、和運(yùn)算單元,因此機(jī)器碼的格式也被擴(kuò)充。為了提供與先前的架構(gòu)兼容,包含運(yùn)行碼的區(qū)段可以被標(biāo)示為16或是32位的指令集。此外,特殊的前置符號也可以用來在16位的區(qū)段包含32位的腳本,反之亦然。
分頁跟區(qū)段的存儲器訪問是為了支持現(xiàn)在多任務(wù)操作系統(tǒng)所必須要的。Linux、386BSD、Windows NT和Windows 95都是一開始為386所發(fā)展,因?yàn)樗堑谝活w提供可靠地程序分離存儲器空間的支持(每個程序擁有自己的尋址空間)以及可以在必要的情況下打斷他們程序的運(yùn)行(使用ring,一種x86保護(hù)模式下權(quán)力分級的名稱)。這種386的基本架構(gòu)變成未來所有x86系列發(fā)展的基礎(chǔ)。
Intel 80386數(shù)學(xué)輔助運(yùn)算處理器也在集成到這個CPU之后的x86系列中,也就是Intel 80486。新的FPU可以幫助浮點(diǎn)數(shù)運(yùn)算,對于科學(xué)計(jì)算和圖形設(shè)計(jì)是非常重要。
64位架構(gòu)
到2002年,由于32位特性的長度,x86的架構(gòu)開始到達(dá)某些設(shè)計(jì)的極限。這個導(dǎo)致要處理大量的信息儲存大于4GB會有困難,像是在數(shù)據(jù)庫或是影片編輯上可以發(fā)現(xiàn)。
Intel原本已經(jīng)決定在64位的時(shí)代完全地舍棄x86兼容性,推出新的架構(gòu)稱為IA-64技術(shù)作為他的Itanium處理器產(chǎn)品線的基礎(chǔ)。IA-64與x86的軟件天生不兼容;它使用各種模擬形式來運(yùn)行x86的軟件,不過,以模擬方式來運(yùn)行的效率十分低下,并且會影響其他程序的運(yùn)行。
AMD主動把32位x86(或稱為IA-32)擴(kuò)充為64位。它以一個稱為AMD64的架構(gòu)出現(xiàn)(在重命名前也稱為x86-64),且以這個技術(shù)為基礎(chǔ)的第一個產(chǎn)品是單內(nèi)核的Opteron和Athlon 64處理器家族。由于AMD的64位處理器產(chǎn)品線首先進(jìn)入市場,且微軟也不愿意為Intel和AMD開發(fā)兩套不同的64位操作系統(tǒng),Intel也被迫采納AMD64指令集且增加某些新的擴(kuò)充到他們自己的產(chǎn)品,命名為EM64T架構(gòu)(顯然他們不想承認(rèn)這些指令集是來自它的主要對手),EM64T后來被Intel正式更名為Intel 64。
這是由非Intel的制造商所發(fā)起和設(shè)計(jì)的第一次重大的x86架構(gòu)升級。也許更重要的,它也是第一次Intel實(shí)際上從外部來源接受這項(xiàng)本質(zhì)的技術(shù)。
虛擬
虛擬x86是很困難的,因?yàn)樗募軜?gòu)并未達(dá)到波佩克與戈德堡虛擬化需求。然而,有好幾個商業(yè)的虛擬x86產(chǎn)品,比如VMware和微軟的Virtual PC。Intel和AMD兩者都有公開宣布未來的x86處理器將會有新的增強(qiáng)來容易達(dá)到更有效率的虛擬。Intel針對這項(xiàng)虛擬特性的代號稱為“Vanderpool”和“Silvervale”;AMD則使用“Pacifica”這個代號。
內(nèi)容來自百科網(wǎng)