x86

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

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

Protsessorit 8086 hakati tootma aastal 1978. See täiendas Inteli eelmisi 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 käsustikust ja 64-bitisest käsustikust x86-64. 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 arhitektuur Itanium. Siiski on pideva mikroarhitektuuride ja tootmisprotsessi täiustamise tõttu x86-ga raske konkureerida. Kui AMD tuli välja x86 64-bitiste laiendustega, siis vastas Intel ühilduva lahendusega. Lisaks annavad 8-tuumaline Intel Xeon ja 12-tuumaline AMD Opteron tunnistust x86 hea skaleeruvuse kohta.

Kronoloogia[muuda | muuda 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 (segmenditud) 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 (segmenditud) 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) RISCi-laadne käsukonveier, 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-vahemälu (Pentium Pro)
1997 AMD K6/-2/3, Pentium II/III, IDT/Centaur-C6 L3-vahemälu tugi, 3DNow!, SSE (Streaming SIMD Extensions)
7 1999 Athlon, Athlon XP superskalaarne FPU
2000 Pentium 4 kõrge taktsagedus, SSE2, hüperhargtöötlus
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, HyperTransport
2004 Pentium 4 Prescott väga kõrge taktsageduse, SSE3, 64-bit võimekus on saadaval ainult pesaga LGA 775
9 2006 Intel Core 2 madal voolutarve, mitu tuuma, madalam taktsagedus, SSE4 (Penryn)
10 2007 AMD Phenom nagu eelmine / 48-bitine neljatuumaline, 128-bitised FPUd, SSE4a, HyperTransport 3 või QuickPath, L3-vahemälu, 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 | muuda 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 täiendamisel. 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 | muuda lähteteksti]

Protsessorile 8086 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.

Segmentimine[muuda | muuda lähteteksti]

1970. aastatel muutus mälu odavamaks, kuid 16 biti abil sai adresseerida vaid 64 kB mälu. 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 | muuda lähteteksti]

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

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

64-bitises koodis adresseerimine 64-bitisel x86 protsessoril:

ja

x86 registrid[muuda | muuda lähteteksti]

16-bitised[muuda | muuda 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. Register FLAGS 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 | muuda lähteteksti]

32-bitise protsessori 80386 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 register AX on uue 32-bitise registri EAX 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.

Protsessorile 80486 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 | muuda lähteteksti]

AMD Opteroni 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 | muuda 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 algusse, 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 | muuda lähteteksti]

PAE[muuda | muuda lähteteksti]

PAE (Physical Address Extension) ehk füüsilise aadressi laiendus lisati esmalt protsessorile Pentium Pro. 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 | muuda lähteteksti]

Mõned x86-protsessorid toetavad riistvaralist virtualiseerimist. Inteli lahendus kannab nime 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 | muuda lähteteksti]

  1. "Birth of a Standard: The Intel 8086 Microprocessor". Originaali arhiivikoopia seisuga 26. september 2010. Vaadatud 10. detsembril 2010.
  2. "Microprocessor Hall of Fame". Intel. Originaali arhiivikoopia seisuga 6.07.2007. Vaadatud 11.08.2007.
  3. 3,0 3,1 3,2 Intel 64 and IA-32 Architectures Software Developer's Manual, Vol. 1, p. 2-33 (2009)
  4. "Randall Hyde: The Art of Assembly Language 6.5.1.1". Originaali arhiivikoopia seisuga 27. juuli 2011. Vaadatud 13. detsembril 2010.
  5. "Randall Hyde: The Art of Assembly Language 6.9.6". Originaali arhiivikoopia seisuga 14. aprill 2010. Vaadatud 13. detsembril 2010.
  6. Physical Address Extension – PAE Memory and Windows
  7. Intel® Virtualization Technology (Intel® VT)
  8. "AMD Virtualization (AMD-V™) Technology". Originaali arhiivikoopia seisuga 25. veebruar 2012. Vaadatud 11. veebruaril 2012.

Välislingid[muuda | muuda lähteteksti]

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