x86

Allikas: Vikipeedia
Intel Core 2 Duo – x86-ühilduv, 64-bitine mitmetuumaline protsessor

x86 on käsustike perekond, mis põhineb protsessoril Intel 8086.

8086 protsessorit hakati tootma aastal 1978. See laiendas Inteli eelnevaid protsessoreid 16-bitiste käskudega. Nimi x86 tuleneb sellest, et mõnede Inteli hilisemate protsessorite nimed lõppesid samuti numbrikombinatsiooniga „86”. Aastate jooksul on x86 käsustikku oluliselt täiustatud ja laiendatud, kuid peaaegu alati tagasiühilduvalt. x86 arhitektuuri kasutavad Intel, AMD, Cyrix, VIA ja paljud teised protsessoritootjad.

Kuna nimetust x86 hakati kasutama pärast 80386 tulekut, siis viitab x86 tavaliselt ühilduvusele 32-bitise käsustikuga, mida 80836 kasutas. Mõnikord kasutatakse tähistust x86-32, et eristada seda 16-bitisest x86-16 käsustikust ja 64-bitisest x86-64 käsustikust. Kuigi enamik x86 protsessoritest uutes personaalarvutites ja serverites toetavad 64-bitist käsustikku, kasutatakse vanemate süsteemidega ühilduvusprobleemide vältimiseks tähistust x86-64 (või x64). Tähistust x86 kasutatakse seejuures ainult 32-bitiste võimalustega protsessorite puhul.

8086 loodi peamiselt manussüsteemides ja väiksemates personaalarvutites kasutamiseks, vastuseks edukale 8080-ühilduvale Zilog Z80-le[1]. Hiljem tulid x86 arhitektuurile uued võimalused ja kasvas arvutusvõimsus. Tänapäeval on x86 üldlevinud nii personaalarvutites kui ka serverites ja tööjaamades. x86-põhist riistvara toetab suur hulk tarkvara, sealhulgas operatsioonisüsteemid Windows, Linux, BSD, Solaris ja Mac OS X.

Moodsaid x86 süsteeme kasutatakse manussüsteemides suhteliselt harva. Patareitoitega seadmetes eelistatakse lihtsamaid 16-bitised x86 protsessoreid. 32- ja 64-bitised süsteemid selles valdkonnas on näiteks VIA C7, VIA Nano, AMD Geode, Athlon Neo ja Intel Atom.

„Kohmakat” x86 arhitektuuri, mis sisaldab igandeid esimestest 8-bitistest protsessoritest, on korduvalt üritatud asendada, ka Inteli enda poolt. Selle näideteks on iAPX 432, Intel 960, Intel 860 ning Inteli ja Hewlett Packardi Itanium arhitektuur. Siiski on pideva mikroarhitektuuride ja tootmisprotsessi täiustamise tõttu x86 arhitektuuriga raske konkureerida. Kui AMD tuli välja x86 64-bitiste laiendustega, siis vastas Intel ühilduva lahendusega. Lisaks annavad 8-tuumane Intel Xeon ja 12-tuumane AMD Opteron tunnistust x86 hea skaleeruvuse kohta.

Kronoloogia[muuda | redigeeri lähteteksti]

Allolevas tabelis on levinumad [2] tarbijale suunatud protsessorid, mis kasutavad x86 käsustikku. Tabel on jaotatud põlvkondadesse, mis tõstavad esile tähtsaid muutuseid x86 ajaloos. Märkus: CPU põlvkonnad ei ole rangelt määratletud.

Põlvkond Esmalt avalikustatud Tuntumad Protsessorid Lineaarne/füüsiline addressiruum Märkimisväärsed uued muutused
1 1978 Intel 8086, Intel 8088 16-bitine / 20-bitine (segmenteritud) esimesed x86 mikroprotsessorid
2 1982 Intel 80186, Intel 80188, NEC V20/V30 riistvara kiirete arvutuste tarvis, nt. kiire korrutamine ja jagamine
Intel 80286 16-bitine (30-bitine virtuaalne) / 24-bitine (segmenteritud) MMU (inglise keeles memory managment unit) ja suurem aadressiruum
3 (IA-32) 1985 Intel 80386, AMD Am386 32-bitine (46-bitine virtuaalne) / 32-bitine 32-bitine käsustik, MMU koos paging´uga
4 1989 Intel486, AMD Am486, Cyrix III-Samuel, VIA C3-Samuel2 / VIA C3-Ezra (2001) risc-laadne pipelineimine, integreeritud FPU ja vahemälu
5 1993 Pentium, Pentium MMX, Rise mP6 kasutab superscalarit, 64-bitine andmesiin, kiirem FPU, MMX käsustik
5/6 1996 Cyrix 6x86, Cyrix MII, Cyrix III-Joshua (2000)
6 1995 Pentium Pro, AMD K5, Nx586 (1994) nagu eelmine / 36-bitine füüsiline (PAE) PAE (Pentium Pro), integreeritud L2 cache (Pentium Pro)
1997 AMD K6/-2/3, Pentium II/III, IDT/Centaur-C6 L3-cache tugi, 3DNow!, SSE (Streaming SIMD Extensions)
7 1999 Athlon, Athlon XP superscalarne FPU
2000 Pentium 4 kõrge sagedus, SSE2, hyper-threading
6-M/7-M 2003 Pentium M, VIA C7 (2005), Intel Core (2006) optimeeritud madalaks voolutarbeks
8 (x86-64) 2003 Athlon 64, Opteron 64-bitine / 40-bitine x86-64 käsustik, hypertransport
2004 Pentium 4 Prescott väga kõrge sagedusega, SSE3, 64-bit võimekus on ainult saadaval LGA 775 socketites
9 2006 Intel Core 2 madal voolutarve, mitu tuuma, madalam taktsagedus, SSE4 (Penryn)
10 2007 AMD Phenom nagu eelmine / 48-bitine quad-core, 128-bitised FPUd, SSE4a, HyperTransport 3 või QuickPath, L3 cache, modulaarne disain
2008 Intel Core i3, Intel Core i5, Intel Core i7
Intel Atom väga madal voolutarve
VIA Nano
11 2010 Intel Sandy Bridge, AMD Bulldozer SSE5/AVX (Advanced Vector Extensions)


Arhitektuur[muuda | redigeeri lähteteksti]

x86 on muutuva instruktsioonipikkusega CISC arhitektuur, mille käsustik on välja arenenud lihtsamate 8-bitiste arhitektuuride, nt. 8008, 8080 ja 8085, järjestikusel laiendamisel. Toetatud on baidi kaupa adresseerimine. Andmesõnade paigutus on peeneotsaline. Iga andmesõna suuruse puhul on lubatud ligipääs joondamata mäluaadressilt. Suurim täisarv ja mäluaadress võib sõltuvalt arhitektuuri põlvkonnast olla 16, 32 või 64 biti pikkune. Uuemad protsessorid toetavad ka väiksemaid andmesõnasid. SIMD võimaldab üheaegselt töödelda mitut skalaari.

Ujukomaarvutus ja SIMD[muuda | redigeeri lähteteksti]

8086 protsessorile loodi kaasprotsessorina lisaks ujukomaprotsessor 8087. Hiljem sai sellest 80387. Järgnevatel protsessoritel on ujukomaprotsessori funktsionaalsus tagasiühilduvalt sisse ehitatud. Lisaks on uuematel protsessoritel SIMD plokk, milles saab töödelda korraga ühte või kahte 128-bitist andmesõna, milles mõlemas võib olla 2, 4, 8 või 16 ühesuurust täisarvu. See tähendab, et protsessor saab mälust laadida või mälusse salvestada korraga 128-bitise andmesõna ning teha mitme 128-bitise andmesõnaga paralleelselt loogilisi operatsioone. Tulevased x86 protsessorid toetavad ka 256-bitised SIMD operatsioone.

Segmenteerimine[muuda | redigeeri lähteteksti]

1970. aastatel muutus mälu odavamaks, kuid 16 biti abil sai adresseerida vaid 64 kB. 8086 võttis kasutusele lihtsa segmendiregistri, mis suurendas mäluaadressi pikkust 4 biti võrra. Korrutades mäluaadressi 16-ga, oli võimalik adresseerida 1 MB (1 048 576 baiti), mis oli sellel ajal väiksema arvuti jaoks suur mälukogus. See oli suhteliselt keeruline lahendus, kuid vähendas riistvara keerukust ja tootmiskulusid.

Reaalrežiimis saadakse 20-bitine mäluaadress nihutades segmendi aadressi 4 biti võrra vasakule ja liites sellele nihke. Näiteks, kui segmendiregister DS on väärtusega A000h ja register SI väärtusega 5677h, siis DS:SI viitab absoluutsele aadressile DS × 10h + SI = A5677h. Seega saab reaalrežiimis adresseerida 220 baiti ehk 1 MB. Vaikimisi kasutatakse koodi jaoks segmendiregistrit CS, andmete jaoks DS-i ja pinu jaoks SS-i. Instruktsiooni eesliite abil saab määrata, millist neljast segmendiregistrist kasutada.

Kaitserežiimis ei viita segmendiregister füüsilisele aadressile, vaid sisaldab „selektorit“, mis viitab süsteemitaseme struktuurile, milleks on segmendi deskriptor (kirjeldus). Deskriptor sisaldab segmendi alguse füüsilist mäluaadressi, segmendi pikkust ja ligipääsuõigusi. Mälu kasutamisel kontrollitakse, kas nihe vastab segmendis asuvale aadressile. Kui nihe asub segmendist väljaspool, siis tekitatakse erand (exception).

Adresseerimine[muuda | redigeeri lähteteksti]

Adresseerimine 16-bitistel x86 protsessoritel näeb välja järgmine:


\begin{Bmatrix}CS:\\DS:\\SS:\\ES:\end{Bmatrix}
\begin{bmatrix}\begin{Bmatrix}BX\\BP\end{Bmatrix}\end{bmatrix} + 
\begin{bmatrix}\begin{Bmatrix}SI\\DI\end{Bmatrix}\end{bmatrix} +
\rm [nihe]

32-bitise aadressiruumi adresserimine 32- või 64-bitisel x86 protsessoril:


\begin{Bmatrix}CS:\\DS:\\SS:\\ES:\\FS:\\GS:\end{Bmatrix}
\begin{bmatrix}\begin{Bmatrix}EAX\\EBX\\ECX\\EDX\\ESP\\EBP\\ESI\\EDI\end{Bmatrix}\end{bmatrix} + 
\begin{bmatrix}\begin{Bmatrix}EAX\\EBX\\ECX\\EDX\\EBP\\ESI\\EDI\end{Bmatrix}*\begin{Bmatrix}1\\2\\4\\8\end{Bmatrix}\end{bmatrix} +
\rm [nihe]

64-bitises koodis adresseerimine 64-bitisel x86 protsessoril:


\begin{Bmatrix}:\\FS:\\GS:\end{Bmatrix}
\begin{bmatrix}{\rm \ddot{u}ldotstarbeline\;register}\end{bmatrix} + 
\begin{bmatrix}{\rm \ddot{u}ldotstarbeline\;register}*\begin{Bmatrix}1\\2\\4\\8\end{Bmatrix}\end{bmatrix} +
\rm [nihe]

ja


RIP + \rm [nihe]

x86 registrid[muuda | redigeeri lähteteksti]

16-bitised[muuda | redigeeri lähteteksti]

Esimestel Inteli x86 protsessoritel 8086 ja 8088 on neliteist 16-bitist registrit. Neli neist (AX, BX, CX, DX) on üldotstarbelised registrid (GPRGeneral Purpose Register). Need registrid on jaotatud kaheks. Näiteks registri BX ülemine osa on kättesaadav registri BH ja alumine osa registri BL kaudu. Registreid SP ja BP kasutatakse pinusse viitamiseks. SP ehk pinuviit (Stack Pointer) viitab pinu pealmisele elemendile, BP (Base Pointer) viitab tavaliselt lokaalmuutujate alale. Registreid SI (Source Index) ja DI (Destination Index) kasutatakse järjendite indekseerimiseks.

Nelja segmendiregistri (CS, DS, SS ja ES) abil moodustatakse mäluaadress. FLAGS register sisaldab erinevaid lippe, näiteks ületäituvuse lipp (overflow flag) ja ülekande lipp (carry flag). IP ehk instruktsiooniviit (Instruction Pointer) viitab instruktsioonile, mida hakatakse parajasti mälust lugema ja seejärel täitma.

32-bitised[muuda | redigeeri lähteteksti]

32-bitise 80386 protsessori tulekul laiendati enamikku registritest 32 biti suurusteks. Segmendiregistrid jäid endiselt 16-bitisteks. 32-bitilisust väljendab täht E (Extended) registrite nimede ees x86 assemblerkeeles. Näiteks AX register on uue 32-bitise EAX registri alumised 16 bitti, SI on ESI alumised 16 bitti jne. Lisati ka kaks uut segmendiregistrit FS ja GS.

Spetsiaalsete instruktsiooni eesliidete abil saab määrata, et 16-bitine kood sisaldab 32-bitist instruktsiooni või vastupidi.

80486 protsessorile lisandus ujukomaplokk koos kaheksa 80-bitise registriga.[3] Pentium II protsessorile lisandusid kaheksa 64-bitist MMX täisarvuregistrit (MMX0–MMX7). Need registrid jagasid alumisi bitte FPU pinuga (st(0)–st(7)).[3] Pentium III-st alates oli x86 protsessoritel 32-bitine SSE haldusregister MXCSR ja kaheksa 128-bitist ujukomaregistrit (XMM0–XMM7).[3]

64-bitised[muuda | redigeeri lähteteksti]

AMD Opteron protsessorist alates on registrid 64 biti suurused. Nende nimed on RAX, RBX, ECX, RDX, RSI, RDI, RBP, RSP, RFLAGS ja RIP. EAX on 64-bitise RAX registri alumised 32 bitti jne. Lisandusid kaheksa üldotstarbelist registrit (R8–R15), mida on võimalik kasutada vaid 64-bitises režiimis.

Kasutus[muuda | redigeeri lähteteksti]

Üldotstarbelisi registreid võib kasutada igaks otstarbeks, kuid tavaliselt eelistatakse mõnede operatsioonide puhul kindlaid registreid. EAX on sobilik aritmeetiliste tehete jaoks, sest instruktsioon, milles vähemalt üks operand on EAX, on üldjuhul baidi võrra lühem ja seega ka kiiremini mälust loetav.[4] EAX registrit nimetatakse ka akumulaatoriks (accumulator). EBX-i kasutatakse järjendi baasindeksina (base). ECX-i kasutatakse tihti loendurina (counter). Näiteks tsükli koostamise instruktsioon LOOP vähendab ECX registrit ühe võrra ja hüppab tsükli algusesse, kui ECX-i väärtus ei ole 0.[5] EDX on üldine register andmete (data) hoidmiseks.

64-bitistel registritel R8–R15 kindlat otstarvet ei ole.

Laiendused[muuda | redigeeri lähteteksti]

PAE[muuda | redigeeri lähteteksti]

PAE (Physical Address Extension) ehk füüsilise aadressi laiendus lisati esmalt Pentium Pro protsessorile. See lubab 32-bitises kaitserežiimis füüsilist aadressiruumi laiendada ja kasutada rohkem kui 4 GB mälu. Tavaliselt on aadressiruum kaitserežiimis 4 GB suurune.[6]

Virtualiseerimine[muuda | redigeeri lähteteksti]

Mõned x86 protsessorid toetavad riistvaralist virtualiseerimist. Inteli lahendus kannab nimetust Intel VT[7], AMD vastav tehnoloogia on AMD-V[8]. Emulaatorid x86 platvormil virtuaalmasinate jooksutamiseks on näiteks VMWare, Parallels, Microsoft Hyper-V ja Virtual PC. Avatud lähtekoodiga projektidest on tuntud QEMU, VirtualBox ja Xen.

Viited[muuda | redigeeri lähteteksti]

Välised lingid[muuda | redigeeri lähteteksti]

  • x86 registers — Yasm User Manual — Chapter 20. x86 architecture.