[raivo alla] - utkodu.ut.ee/~raivoa/cpu.pdf · rf(resume) ehk resümee.kasutatakse koos...

15
MIKROPROTSESSORID [Raivo Alla] [Arengulugu. ] Mikroprotsessorite 1. põlvkond(Generation 1) 8086(1978a)-l on 16-bitised registrid ja 16-bitine väline andmesiin, 20-bitine adresseerimine annab 1MB adresseeritavat mälu. Siit sündis kuulus 640K RAM limiit DOS-is, kuna 384K järelejäänud mälu jäi riistvara ja video kasutada. 8088-l on 8 bitine väline andmesiin. 16-bitine register viitab mälusegmendile, mille suurus saab olla kuni 64kB. Kasutades nelja sellist registrit samal ajal, olid 8086/8088 protsessorid võimelised adresseerima 256kB mälu, ilma segmente vahetamata(trikk mida kutsuti registrite segmenteerimiseks). Motorola 68000 kiip sisaldas 16 32-bitist registrit, seega oli 32- bitine protsessor(!) Need esimese põlvkonna protsessorid jooksid 4 kuni 8MHz sagedusel.Neil nõudis ühe masinkeelse instruktsiooni täitmine mitu protsessori takti(clock cycles). Samuti puudus cache mälu. 2.põlvkond(Generation 2) 80286(1983a.) ehk lihtsalt 286 oli esimene protsessor, mis kasutas protected mode’i.See võimaldas mälu kaitsa nii, et erinevad programmid saavad joosta samaaegselt üksteist segamata. Protected mode kasutas registrite sisu viitadena descriptor table' le, mis võimaldas 24-bitist adresseerimist, seega võimaldades maksimaalse adresseeritava mälu suuruseks 16MB. Nagu eelpool mainitud,lubas ka virtuaalset mälukasutust ja sisaldas mitmeid kaitsemehhanisme. 286 jooksis sagedustel 8-16MHz. Motorola 68020 kiip oli õige 32-bitine versioon 68000 protsessorist, suutes adresseerida 4GB mälu. 3.põlvkond(Generation 3) 386(1986.a) oli IA-32 arhitektuuri esimene 32-bitine protsessor, registrid 32-bitised, adreseeritav mälu 4GB. 32-bitise registri alumine pool sisaldas 16-bitist registrit nagu eelnevatel generatsioonidel, et kindalustada ühilduvus vanemate programmidega. Võimaldas virtuaalset mälukasutust(paging) swap faili näol, mis lisas füüsilisele RAM-ile lisamälu kõvakettamahust.Rakendustele jäi selline trikk märkamatuks ja nad kasutasid nende käsutuses olevat RAMi nagu oleks see füüsiliselt olemas. Uuendus oli ka code-cache lisamine, mis puhverdas kuni 256 baiti koodi kiibis eneses.

Upload: others

Post on 20-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

MMIIKKRROOPPRROOTTSSEESSSSOORRIIDD

[Raivo Alla]]

[Arengulugu. ] Mikroprotsessorite 1. põlvkond(Generation 1) 8086(1978a)-l on 16-bitised registrid ja 16-bitine väline andmesiin, 20-bitine adresseerimine annab 1MB adresseeritavat mälu. Siit sündis kuulus 640K RAM limiit DOS-is, kuna 384K järelejäänud mälu jäi riistvara ja video kasutada. 8088-l on 8 bitine väline andmesiin. 16-bitine register viitab mälusegmendile, mille suurus saab olla kuni 64kB. Kasutades nelja sellist registrit samal ajal, olid 8086/8088 protsessorid võimelised adresseerima 256kB mälu, ilma segmente vahetamata(trikk mida kutsuti registrite segmenteerimiseks). Motorola 68000 kiip sisaldas 16 32-bitist registrit, seega oli 32-bitine protsessor(!) Need esimese põlvkonna protsessorid jooksid 4 kuni 8MHz sagedusel.Neil nõudis ühe masinkeelse instruktsiooni täitmine mitu protsessori takti(clock cycles). Samuti puudus cache mälu. 2.põlvkond(Generation 2)

80286(1983a.) ehk lihtsalt 286 oli esimene protsessor, mis kasutas protected mode’i.See võimaldas mälu kaitsa nii, et erinevad programmid saavad joosta samaaegselt üksteist segamata. Protected mode kasutas registrite sisu viitadena descriptor table' le, mis võimaldas 24-bitist adresseerimist, seega võimaldades maksimaalse adresseeritava mälu

suuruseks 16MB. Nagu eelpool mainitud,lubas ka virtuaalset mälukasutust ja sisaldas mitmeid kaitsemehhanisme. 286 jooksis sagedustel 8-16MHz. Motorola 68020 kiip oli õige 32-bitine versioon 68000 protsessorist, suutes adresseerida 4GB mälu. 3.põlvkond(Generation 3)

386(1986.a) oli IA-32 arhitektuuri esimene 32-bitine protsessor, registrid 32-bitised, adreseeritav mälu 4GB.

32-bitise registri alumine pool sisaldas 16-bitist registrit nagu eelnevatel generatsioonidel, et kindalustada ühilduvus vanemate programmidega. Võimaldas virtuaalset mälukasutust(paging) swap faili näol, mis lisas füüsilisele RAM-ile lisamälu kõvakettamahust.Rakendustele jäi selline trikk märkamatuks ja nad kasutasid nende käsutuses olevat RAMi nagu oleks see füüsiliselt olemas. Uuendus oli ka code-cache lisamine, mis puhverdas kuni 256 baiti koodi kiibis eneses.

Page 2: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

Motorola 68030 hõlmas endas samuti virtual memory, memory protection, 256 byte code cache , lisaks veel uuendus, mida kutsuti pipeline' ks, mis suutis mitut instruktsiooni korraga täita. Selle põlvkonna protsessorid jooksid 16-40MHz ja täitsid 10MIPS(10 milj. instruktsiooni sekundis). 4.põlvkond(Generation 4)

Inteli 486(1989.a) ja Motorola 68040. Täiendatud pipeline- ühe instruktsiooni täitmiseks kulus kokkuvõttes üks protsessoritakt. Iga üksiku instruktsiooni täitmiseks läks ikka mitu takti, ent täites selle aja jooksul mitu käsku, on resultaadiks 1 instruction per clock cycle. Lisati 8K cache mälu, mis võimaldas protsessori kiirust tunduvalt tõsta. Esmakordselt lisati protsessorisse FPU(floating-point unit) ujukomaarvutusteks.Lisati ka uusi instruktsioone tulemaks toime uue keerulisema süsteemiga. Hilisematele 486-le lisati voolusäästlikuse funktsioonid. 5.põlvkond(Generation 5) Selle põlvkonna protsessorid saavutasid selle, et täitsid ühe protsessori takti jooksul rohkem kui ühe instruktsiooni. Motorola ja Intel valisid erineva tee saavutamaks kiirusevõitu: Motorola valis RISC(Reduced Instruction Set) ja Intel CISC(Complex Instruction Set) protsessori tee. RISC plussiks oli see, et ta sisaldas lihtsaid käske, mis olid täidetavad väheste protsessori taktide jooksul.Kuid praktikas ei andnud RISC võitu, sest mingi asja tegemiseks kulus RISCil mitu käsku, samal ajal kui CISC sai hakkama ühega.

Inteli Pentium(1993.a) sarnanes väga 486-e, kuid suutis täita 2instruktsiooi takti jooksul.

Oluline uuendus oli superskalaarsuse printsiip. Selle põhimõte: -võetakse kaks instruktsiooni mälust või code cachest -dekodeeritakse need -täidetakse esimene instruktsioon -kui teine instruktsioon ei sõltu esimese tulemusest, täidetakse teine Intel andis nimed kahele "torule", kus need täideti:u-pipe(u-toru) ja v-pipe(v-toru). v-pipe:paraleelselt täidetavad käsud(ühe käsu täitmise tulemusest ei sõltu teise käsu täitmine),parallel order u-pipe:serial order. Superskalaarsus nõudis programmeerijatelt uut tüüpi koodi kirjutamist.Kuna aga superskalaarsuse printsiip oli enamikule programmeerijale uus, andis Pentium kiip vaod 20% kiiruse kasvu võrreldes 486-ga(mitte 100% nagu oodati) Cache mälu oli nüüd 16KB - 8K koodi jaoks ja 8 andmetele. Data cache kasutas MESI protokolli, et kasutada effektiivset write-back mode'i. Uue ja huvitava asjana lisati branch prediction: if-then-else konstruktsioonide täitmise etteennustamine.

Page 3: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

Välise andmesiini laiust suurendati 64bitini, protsessorisiseselt liigutati andmeid isegi 128 ja 256 bitisel siinil. APIC(Advanced Programmable Interrupt Controller) näol saadi mitme protsessori tugi. Pentiumi hilisele versioonile lisati ka MMX - tehnoloogia, mis oma 64-bitiste registritega pidi hõlbustama multimeedia jooksutamist. Selgub, et isegi kui suurendada protsessori kiirust 2X, jääb mälu kiirus siiski samaks. Et RAMist midagi välja lugeda, magab prose piltlikult maha näiteks 100 prose takti, jääb täitmata ligi 200 instruktsiooni.Lahendusena leiti, et L1 cache oma 16K ei suuda üksi täita seda funtsiooni ja lisati ka 256K L2 cache, mis oli L1 kordi aeglasem, ent siiski 10X kiirem kui RAM. Motorola PowerPC 601 kiip suutis samuti täita 2 instr. takti jooksul.PowerPC 603 ja hilisemad lisasid veel ühe arithmetic execution uniti. 6.põlvkond(Generation 6) Inteli P6 arhitektuur ja Motorola G3/G4 Kuna mitte alati ei kirjutanud programmeerijad effektiivset koodi ja prose ootas mälu taga või ootas käsklusi, et viia tegevus lõpuni, leiutasid Intel ja Motorola paar trikki. Kiip suutis ise koodi oprimeerida, kui programmeerija seda ei teinud. Veel mõned uuendused: -L1 mälu.P6 prosedel 32K(16K data/16K code) AMD Athlon suutis128K(64 data/64 code) -laiendati dekooderit, mis suutis nüüd hallata 3 instruktsiooni üheaegselt. Programmeerijale jälle õlule kohustus: kirjutada kood 3stes gruppides. -dekodeeritud instruktsioone suudetakse täita järjekorrast sõltumatult(out-of-order) -AMD Athlon lisas veel ühe FPU, mis lubas täita kuni 3 ujukomaarvutust korraga. -täiendatud branch prediction -trikk nimega "register renaming" .Kui mingit sama registrit kasutatakse järjest, siis nimetatakse sama registri kaks erinevat sisu ümber erinevateks registriteks, et saaks toimuda superskalaarsuse või out-of-order printsiip. P6 arhitektuuri põhiveaks oli piirang dekooderil ehk nende 4-1-1 süsteem, mis lubab dekooderil dekodeerida korraga vaid ühe CISC-tüüpi instruktsiooni(complex instruction) ja kaks RISC-tüüpi(simple instruction). Tavaliselt kirjutati koodi complex-simple-complex, nüüd sunniti seda kirjutama complex-simple-simple. P6 arhitektuuri perekonda kuuluvad sellised Inteli protsessorid nagu: Pentium Pro, Pentium II, Pentium II Xeon,Celeron, Pentium III ja Pentium III Xeon. Jõudlust piiravaks teguriks oli protsessori pöördumine RAM-i poole.Sedagi probleemi rünnati, suurendades FSB Pentium II-l ja Celeronil 66MHz, Pentium III 100 ja 133MHz, AMD Athlonil aga kuni 200MHz-ni. Pentium II ja III vändatud versioon Xeon erines vaid suure L2 cache poolest- seda oli koguni 1 või siis 2MB.

Page 4: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

Teoreetiliselt suudaks 1GHz P III protsessor täita 3 miljardit käsku sekundis ehk 3000MIPS. Kuid praktikas, kui programmeerijad pole arvetanud dekooderi 4-1-1 printsiipi, siis 2000MIPS.P6 arhitektuuril on vaid üks mälulaadimis üksus ja üks FPU. 7.põlvkond?(Generation 7) Selle üks väidetavaid esindajaid on Pentium IV kiip, mis omab küll 2 ALU(arithmetic-logic unit), kuid millel on vaid olematu 8K L1 cache!!! L1 cache asemel 12K trace cache-cache dekodeeritud micro-op-ide jaoks. Transistori suurus on vaid 0,13 mikromeetrit, uus arhitektuur:NetBurst.400MHz-ne system bus.

[Mikroprotsessori arhitektuur.]

Sissejuhatus Järgnevalt käsitleme mikroprotsessorit kui programmeeritavat seadet, kõigepealt uurides tema programmeerimismudelit ja kuidas ta adresseerib mälu. Põhiliselt vaatleme Inteli protsessoreid. On kirjeldatud nii programmeerimist protected kui real mode’s. Real mode mälu paikneb 00000H-FFFFFH, kasutades vaid esimest 1MB mälust ja on olemas kõikidel mikroprotsessoritel. Protected mode memory asetseb ükskõik millisel aadressil mälusüsteemis ja ta on olemas alates 80286 protsessoritest. Protected mode mälu suurus oleneb, mitmebitilise protsessoriga on tegemist.32-bitiste protsessorite puhul on see tavaliselt 4GB . Programmeerimismudel.

Joonis illustreerib 8086 programmeerimismudelit läbi Pentium II protsessori.Varasemad protsessorid sisaldasid 16-bitiseid registreid, mis on 32-bitiste registrite alamhulgad nagu võite jooniselt näha. See programmeerimismudel sisaldab 8,-16-, ja 32-bitiseid registreid. 8-bitised registrid on AH,AL,BH.BL,DH,DL.16-bitised registrid on AX,BX,CX,DX,SP.BP,DI,SI,IP,FLAGS, CS,DS,ES,SS,FS,GS.Laiendatud 32-bitised registrid on EAX,EBX,ECX,EDX, ESP,EBP,EDI,ESI,EIP ja EFLAGS. Liigitatakse ka general purpose registriteks ja multipurpose registriteks.

Page 5: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

Mitme-ja üldotstarbelised registrid. EAX(accumulator) on 32-bitine register, sisaldades 16-bitist AX registrit, mis omakorda sisaldab 8-bitiseid AH ja AL registreid. Kui muudetakse vaid 16- või 8-bitist registrit, ei mõjuta see ülejäänud bitte EAX registrist. Seda registrit kasutatakse arvude korrutamiseks , jagamiseks ja mõningateks erieesmärgilisteks instruktsioonideks. EBX(base index) adresseeritakse kui EBX,BX,BH või BL registrit. See register hoiab mõnikord offset-i aadressit, mis näitab mälusegmendi paiknevust mälusüsteemis.Adresseeritakse ka andmete hoidmiseks. ECX(count) on general-purpose register, mida kasutatakse enamasti loendurina, võib hoida ka offset-aadressit.Instruktsioonid, mis kasutavat loendurit on näiteks stringinstruktsioonid REP/REPE/REPNE või shift-rotate instruktsioonid ja LOOP/LOOPD käsud.Shift,rotate kasutavad loendurina CL registrit, stringinstruktsioonid CX registrit ja LOOP/LOOPD CX või ECX registrit. EDX(data) on general-purpose register, mis hoiab andmeid või

rutus/jagamistehete väärtusi. korEBP(base pointer) ehk baasosundaja viitab asukohale mälus andmete liigutamiseks mälus. EDI(destination index) ehk lähteindeks hoiab tihti stringide sihtkoha aadresse stringinstruktsioonide jaoks. ESI(source index) ehk sihtindeks adresseerib stringide source-asukoha-

resse stringinstruktsioonide jaoks. aadEIP(instruction pointer) viitab järgimise käsu aadressile mälus, mida kutsutakse code segment. Adresseeritakse IP(16-bitti)-registrina kui

grammeeritakse real mode’s ja EIP(32-bitti) kui protected mode’s. proESP(stack pointer) ehk pinuosundaja adresseerib mäluosa, mida kutsutakse pinuks (stack).Pinumälu salvestab andmeid läbi pinuosundaja. Lipuregistrid. EFLAGS kontrollib mikroprotsessori tegevust. Lipuregistrid muudavad oma väärtust mitmete aritmeetiliste-loogiliste instruktsioonide täitmisel mikroprotsessori poolt.Andmesiirdamiskäskude itmisel ei muutu. tä

C(carry) ehk ülekandelipp. P(parity) ehk paarsuslipp.Väärtus on 0, kui näiteks numbris on paaritu arv 1-sid, väärtus on 1, kui 1-sid on paarisarv. Kui numbris 1-sid pole, on even parity ehk siis väärtus on 1. Paarsuslippu kasutatakse ka modemi programmeerimisel. A(auxilary carry) ehk lisaülekandelipp. Z(zero) ehk null-lipp näitab, kas aritmeetilise või loogilise tehte tulemus on null. Kui Z=1, siis on null, kui Z=0, siis ei ole null. S(sign) ehk märgilipp näitab, kas arv on positiivne või negatiivne.

Page 6: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

Kui S=1, siis negatiivne, S=0 positiivne. T(trap) ehk lõks. Kui lipp on püsti(1), siis rakendatakse debuggerit, et leida vigu programmi käigus.Kui T=0, siis debugging disabletud. I(interrupt) ehk katkestuslipp kontrollib INTR(interrupt request) sisendit.Kui I=1, siis INTR lubatud. I lipu olekut seatakse käskude STI(set I flag) ja CLI(clear I flag) poolt. D(direction) ehk suunalipp valib kas suurendamismooodi (increment) või vähendamismoodi(decrement) DI/SI registrite jaoks stringinstruktsioonide täitmise ajaks. Kui D=1, siis decrement,D=0, siis increment. D lippu sätitakse käskudega STD(set direction) ja D(clear direction). CL

O(overflow) ehk ületäitumislipp tähistab registri ületäitumist mingi arvutusoperatsiooni tagajärjel. IOPL(I/O privilege level) kasutatakse protected mode operatsioonidel et valida I/O seadmetele õige prioriteet.00 on kõrgeim IOPL prioriteet, 11 madalaim. NT(nested task) ehk lipp pesitsevate ülesannete tarbeks(ülesanded üksteise sees).Lipp on püsti, kui käesolev ülesanne on mingi teise ülesande “sees”. RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida ogrammi käiku peale järgnevat instruktsiooni. pr

VM(virtual mode) ehk virtuaalne mood.Kasutatakse protected mode süsteemis, et kasutada virtual mode , ehk siis mitut 1MB segmenti rraga. ko

AC(aligment check) ehk reastamiskontrolli lipp. VIF(virtual interrupt flag) ehk virtuaalne katkestuslipp. On koopia

kestuslipust, olemas Pentium ja Pentium II protsessoris. katVIP(virtual interrupt pending) ehk virtuaalse katkestusseisu lipp.Pakub infot katkestuste kohta virtuaalmoodis ,Pentium ja Pentium II otsessoris. pr

ID(identification) ehk identifikatsioon. Tähistab, et mikroprotsessor sisaldab CPUID instruktsiooni, mis võimaldab tuvastada tootjat ja versiooni numbrit. Segmendiregistrid. Segmendiregistrid määravad aadressid mälus teatud ülesannetele. Real ja protected mode’s töötavad segmendiregistrid erinevalt. CS(code segment) ehk koodisegment on osa mälus, kus hoitakse koodi, mida kasutab mikroprotsessor.See register määrab algusaadressi mälus, kust algab koodi hoidev sektsioon.Real moodis defineerib see 64K bloki. Kaitstud moodis aga valib see kirjeldaja(descriptor), mis kirjeldab algusaadressit ja vajatava mälusektsiooni pikkust. Kaitstud moodis saab odisegmendi piikus olla max. 4GB. ko

DS(data segment) ehk andmesegemnt on mälusegment, kus hoitakse andmeid, mida programm kasutab. Nagu CS, nii ka DS suurus on vastavalt moodile is kas 64K või 4G. si

ES(extra segment) ehk lisasegment on lisa andmesegment mida kasutatakse mõnede stringinstruktsioonide puhul. SS(stack segment) ehk pinusegment defineerib mälupiirkonna, mida kasutatakse pinumälu jaoks. FS ja GS on täiendavad segmendiregistrid kasutusel alates 386 mikroprotsessorist ja mida programmid võivad kasutada.

Page 7: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

Real mode mälu adresseerimine. Real mode võimldab adresseerida vaid 1MB mälu. Segment-ja offsetregistrid. Segmentregister defineerib mälu algusaadressi 64Kb blokil,

lise koha selle segmendi sees.

offsetregister valib ükskõik mil

soluutaadressi saamiseks tuleb iti

a ongi

lu osundada 16

lgusaadress, lt

dades

resseeritav kui HIMEM.SYS

fault segment and offset registers.

Absegmentregistri sisu nihutada 4 bavasakule (korrutada 16-ga ehk lisada lõppu 0H) ja siis liita offset. Nii moodustub 20-bitine aadress jvõimalik adresseerida 1MB mälu(220B=1MB) Kui näiteks segmentregister sisaldab 1201H, siis see adresseerib mälu, mis hakkab 12010H kohalt. Segmentregister saab mäbaidiste blokkide, nn. paragrahvide (paragraph) täpsusega. Kui on teada 64K bloki asiis lõpuaadressi saab, lisades lihtsaFFFFH.Segment-ja offsetregister kirjutatakse mõnikord, eralkooloniga, näiteks: 1FFFF:2000

286 alates on ekstra 64K miinus 16baiti ad driver on installitud.Seda mälupiirkonda(0FFFF0H-10FFEFH) nimetataksehigh memory. De

kroprotsessoril on teatud reeglid, mis vaikimisi määravad

ti koos IP

egister määrab code segment’i

s

siis mälu

sioonid andmetele DS:BX(või

mi

Misegmentregistrite ja offsetregistrite kombinatsioonid. Näiteks koodisegmenti määravat registrit kasutatakse ala

registriga, et adresseerida järgmist käsku programmis.See kombinatsioon on CS:IP või kaCS:EIP, sõltuvalt mikroprotsessori töörežiimist. Koodisegmendi ralguskoha ja instruction pointer määrab järgmise instruktsiooni koodisegmendis. Kui näiteks CS=1400H ja IP/EIP=1200H, siimikroprotsessor saab järgmise instruktsiooniaadressilt 1400H+1200H ehk 15200H Järgmine kombinatsioon onSS:SP(SS:ESP) või SS:BP(SS:EBP). Kui näiteks SS=2000H ja BP=3000H, mikroprotsessor adresseerib vastava pinukohalt 23000H. Veel on kombinatDS:DI või DS:SI) ja stringidele ES:DI. 8086-80286 lubavad 4 mälusegmenti ja 386ülespoole 6 mälusegmenti. Muidugi, programkäsutuses saab olla tunduvalt rohkem kui 4 või6 mälusegmenti, kuid vaid 4/6 segmenti saab

Page 8: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

kasutuses olla korraga.Juuresolev joonis illustreerib 4-segmendilist süsteemi. Oletame, et rakendusprogramm nõuab 1000H baiti mälu koodi jaoks, 190H baiti andmetele ja 200H baiti pinumäluks(stack).Rakendus ei nõua lisasegmendi(ES) kasutust. Kui selline programm on DOS-i poolt mällu laaditud, paikneb see esimeses vabas mäluruumis, mis järgneb draiveritele ja teistele TPA programmidele.(Vt. joonist)

SegmentAndOffsetAddressingAllowsRelocation. Segment-ja offsetregistrite adresseerimine tundub küllalt keeruline. Kuid seevastu lubab selline skeem programmil mälus ümberpaikneda(relocate).Relocatable programm on programm, mis võib paikneda ükskõik millises mäluosas ja relocatable andmed(data) on andmed, mis võivad paikneda ükskõik millises mäluosas ilma selleks programmis muutusi tegemata.See on ideaalne kasutuseks arvutisüsteemides, kus mitte kõik masinad ei sisalda samu mäluruume. Mälusegmenti saab liigutada ükskõik kuhu mälusüsteemis ilma et oleks vaja offset-registrite sisu muuta.See teostatakse nii, et liigutatakse kogu programm, blokina, uude piirkonda, muutes vaid segmentregistrite sisu. Mälu adresseerimine kaitstud režiimis (protected mode). Kaitstud režiimis mälu adresseerimine lubab ligipääsu andmetele ja programmidele, mis paiknevad kõrgemal kui see 1MB, mis oli real mode kasutada. Erinevus reaalmoodist on selles, kuidas mikroprotsessor tõlgendab segmentregistrit mälu adresseerimisel. Segmentregister sisaldab selektorit, mis valib kirjeldaja (descriptor) kirjeldajate tabelist (descriptor table). Alates 80386-st on offset 32 bitine, mis võimaldab adresseerida kuni 4GB suuruste segmentide sees(reaalmoodis 16-bitine ehk siis 64KB segment). Selektor (mis on segmentregistris) valib välja ühe 8192-st kirjeldajast vastavast tabelist. Kirjeldaja kirjeldab piirkonda, pikkust ja juurdepääsu õigusi mälusegmendi kohta. On 2 kirjeldajate tabelit, globaalsed kirjeldajad ja lokaalsed kirjeldajad. Globaalne kirjeldaja on opsüsteemi kirjeldaja (system descriptor), lokaalne aga rakendusprogrammi kirjeldaja (application descriptor). Iga programm saab siis kasutada kuni 16384 mälusegmenti samal ajal. Iga

Page 9: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

kirjeldaja on 8 baiti lai, kirjeldajate tabelid on kumbki 64 Kb suurused. Baasaadress osundab mälusegmendi algust.286 on see 24-bitine aadress, seega segment sai alata ükskõik millisel baidil 16M mälupiirkonnas. (segmentidele viitamisel ei kehti enam paragraph ehk 16baidiste blokkide täpsusega asukoha määramine.)386 ja kõrgemad MP-d(mikroprotsessorid) kasutavad 32-bitist aadressi.

Segmendi limiit (segment limit) näitab viimast offseti aadressi, mis eksisteerib antud segmendis. 80286-s on 16 bitine limiit, 386-st alates 20 bitine. Alates 386-st lisandub G bitt (teralisuse bitt, granularity bit). Kui G=0, siis segmendi limiit on 00000H kuni FFFFFH, kui G=1, siis segmendi limiit korrutatakse 4Kb(liidetakse XXXH;XXXH võib olla ükskõik mis väärtus 000H ja FFFH vahel), saadakse 4Kb segmendi samm. AV näitab, kas segment on kättesaadav (AV=1) või mitte (AV=0). D näitab kas käsud ja registrid on 16 või 32 bitised (D=0 - 16 bitised, D=1 - 32 bitised). Juurdepääsu õiguste baidi (access rights byte) bitid on kirjeldatud joonisel. Need bitid võimaldavad kontrolli üle kogu segmendi. Kontroll

sõltub, kas tegemist on andme- või koodsegmendiga. Kirjeldajad litakse kirjeldajate tabelist segmentregistri abil. va

Näide1: Baasaadress(Base)=10000000H,G=0,Limit=001FFH, End=Base+Limit=10000000H+001FFH=100001FFH Näide2: Baasaadress(Base)=10000000H,G=1,Limit=001FFH, End=Base+Limit=10000000H+001FFXXXH=101FFFFFH

Joonisel on toodud, kuidas segmentregister töötab kaitstud moodis. Lisaks 13 bitisele

Page 10: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

selektorile (valib ühe 8192-st kirjeldajast) on TI bitt (TI=0, globaalne kirjeldaja; TI=1, lokaalne kirjeldaja) Soovitud privileegi tase (reguested privilege level, RPL) määratakse ära 2-e bitiga. Kõrgeim on 00 ja madalaim 11. Kasutatakse mitmekasutaja keskkondades. Kõrvaloleval joonisel on näidatud, kuidas segmentregister, mis sisaldab selektorit valib kirjeldaja globaalsest kirjeldajate tabelist. Globaalsed ja lokaalsed kirjeldajate tabelid on mälusüsteemis olemas. Et neile ligi pääseda ja muuta nende tabelite aadresse, sisaldab MP programmselt nähtamatuid registreid. Neid registreid ei saa otseselt adresseerida(ehkki mõned neist on siiski programmselt juhitavad).

Järgnev joonis illustreerib programmselt nähtamatuid registreid 286-PII MP-tes.

Need registrid kontrollivad MP tööd kaitstud moodis. Osa nendest pole programselt juhitavad. Iga segmentregister sisaldab lisaks 16 bitisele nähtavale osale veel 64 bitti (alates 80386-st, 80286-l on see 50 bitti) infot mis sisaldab baasaadressi (32 bitti), limiiti (20 bitti) ja juurdepääsuõigusi (12 bitti). Need registrid laetakse kirjeldajate tabelist kui segmentregister muutub. Nii pole vaja iga mälupöördumisega lugeda infot kirjeldajate tabelist. Lisaks on nähtamatud GDTR (global descriptor table register) ja IDTR (interrupt descriptor table register).

Page 11: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

GDTR sisaldab kirjeldajate tabeli baasaadressi ja limiiti. Viimane on 16 bitti, seega tabeli suurus on 64 Kb. Kui MP läheb üle kaitstud moodi laetakse GDTR ja IDTR sisu. IDTR registris sisaldub info katkestustöötlusprogrammide aadresside kohta. LDTR (local descriptor table register) sisaldab vastavat infot lokaalse kirjeldajate tabeli kohta. TR (task register) hoiab selektorit, mille abil pääseb juurde kirjeldajale, mis defineerib ülesande. See register võimaldab mitmeülesande (multitasking) süsteemides lihtsalt lülituda ümber eri programmide vahel. Memory paging. Mälu tabuleerimine(memory paging) võimaldab virtuaalmälu kasutust. Muidu lineaarne aadress, mis genereeritakse programmide poolt konverteeritakse memory paging üksuse polt otse füüsiliseks. See tegevus, mida nimetataksegi mälu tabuleerimiseks, toimib nii reaal- kui ka kaitstud moodis. See mehhanism lubab mälul paikneda ka piirkondades, kus tegelikult

t kontrollivat MP kontrollregistrid. Register CR3 sisaldab

mingit mälu ei ole. Mälu tabuleerimis

lehekülje ja

che

suunaja (directory) baasaadressi PCD (page cache disable) ja PWT (page write through) bitte, mis kontrollivad MP vastavate pinnidetööd. Kui PCD=1 siis PCD pinn lähebkõrgeks siinitsükli ajaks. See võimaldab välisriistvaral kontrollida L2 vahemälu (camemory). Lineaarne aadress, mis genereeritakse programmide poolt jagatakse kolmeks sektsiooniks: page directory entry (lehekülje kausta sisend), page table entry (lehekülje tabeli sisend) ja page offset entry (lehekülje offseti

sisend). Alumisel joonisel on toodud näide, kuidas see jagamine toimub.

Et kiirendada mälu tabuleerimist, on alates 80486-st sisse viidud TLB (translation look-aside buffer) vahemälublokk. Selles hoitakse 32-e viimati külastatud mälulehekülje aadressi. Alates Pentiumist on oma TLB nii andme- kui ka käsustiku jaoks.

Page 12: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

Kõrvaloleval joonisel näidatakse, kuidas töötavad page directory, page tables ja memory pages.On ainult üks lehekülje suunaja(page directory) , mis sisaldab 1024 32-bitist aadressi, mis viitavad 1024-le võimalikule lehekülje tabelile(page table). Leheküljesuunaja ja iga lehekülje tabel on igaüks suurusega 4KB. Kui näiteks tabuleerida 4GB mälu, läheb vaja 4Kb suunaja jaoks ja 4Kb * 1024 = 4Mb lehekülje tabelite jaoks. DOS-is kasutab EMM386.exe leheküljetabeleid, et ümber defineerida mälupiirkond C8000H-EFFFFH kui ülemine

mälublokk.EMM386.exe lubab ligi 16MB lisamälule(extended memory) [MASINKEEL.] Masinkood on binaarne ehk kahendkoodis kirjutatud instruktsioonide jada, mis täidab teatud ülesannet ja on ainukene otsene viis MP-le öelda, mida me temast tahame. Masinkeelsed instruktsioonide pikkus varieerub vahemikus 8086-Pentium II ühest kuni 13 baidini.On üle 100 000 erineva masinkeelse instruktsiooni variatsiooni, võib öelda, et kindlat nimekirja pole olemas, see täieneb üha. 8086-80286 on 16-bitised instruktsioonid,386 ja kõrgematel 32-bitised. 386 ja kõrgemad MP-d eeldavad, et kõik reaalmoodi instruktsioonid on 16-bitised, kaitstud moodis võib olla valitud kas 16-bitine või 32-bitine instruktsioonide mood.

Esimesed kaht baiti 32-bitises moodis kutsutakse override prefix’ks(ülekattev eesliide) ja neid ei pruugi alati olemas olla. Esimene on operandi aadressi, mida instruktsioon kasutab, suuruse jaoks ja teine registri suuruse määramiseks.Kui 386-Pentium II opereerivad 16-bitises moodis(reaal-või kaitstud moodis) ja kasutatakse 32-bitist registrit, siis register-size-prefix(66H) lisatakse instruktsiooni ette.Kui opereeritakse 32-bitises moodis(protected mode only) ja kasutatakse 32-bitist registrit, register-size-prefix’it ei eksisteeri. Kui 32-bitises moodis kasutatakse 16-bitist registrit, on register-size-prefix olemas, et valida 16-bitist registrit.

Page 13: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

Address size-prefix(67H) kask opkood valib

utamine jne.), mida

llivad

Kui W=0, siis on andmed alati ühebaidilised.

iselt MOV

ärab adresseerimismoodi valitud

6-bitise tise moodi

i

valitakse 00(no displacement), tine

REG ja R/M väljade te

utamist vaatleme hiljem. Opcode ehoperatsiooni(liitmine,lahMP peab sooritama.Opkood on enamasti kas 1 või 2 baiti pikk.Siin, joonisel, on esimesed6 bitti opkoodi jaoks ja kaks järgijäänud bitti näitavad suunda D(direction).Mitte segi ajada instruktsiooni moodi bitiga võisuunalipu bitiga(kasutatakse stringinstruktsioonides). Need kaks suunabitti kontro

andmevoogu, näidates kas andmed on baitides või sõnades(word=16 bitti).386 ja kõrgemates MP-s valitakse word ja doubleword(DW), kui W=1.Instruktsioonimood ja registrisuuruse-eesliide(register-size prefix) otsustavad, kas W tähistab 16 või 32 bitti.

Kui D=1, siis andmed liiguvad väljalt R/M väljale REG, mis aseb instruktsiooni teisesbaidis.Kui D=0, siis andmed REG väljalt R/M väljale.W-bit on olemas enamustes instruktsioonides, D-bitt aga põhilja mõnes teistes instruktsioonides.

MOD-väli: MOD-väli mäinstruktsiooni jaoks ja kas displacement on olemas antud juhul. Kõrvalolev tabel on 1instruktsioonmoodi jaoks, 32-bitabel on sarnane, ainult et 10 tähistab 32-bitist displacementi.Kui MOD väljal on 11, siis valitakse registri adresseerimine mälu väljal 00,01,10, siis valitakse üks

mäluadresseerimismoodidest. MOV AL,[DI] on üks näide, kus

adresseerimise asemel.Ku

MOV AL,[DI+2] 8-bitine displacement ja MOV AL,[DI+1000H] 16-bidisplacement.

tähendused, registrivalimine:

Page 14: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

Üleval on toodud üks näide, kuidas MP loeb kahebaidilisest binaarsest käsust välja meile arusaadava instruktsiooni. Mälu adresseerimine.

Kui MOD väli sisaldab 00, 01,10, saab R/M väli teise tähenduse. Toodud tabel näitab 16-bitise instruktsioonimoodi R/M adresseerimismoode.

Special adressing mode. Näiteks MOV [1000H],DL ja MOV NUMB,DL on instruktsioonid, mis kasutavad spetsiaalset adresseerimismoodi.Esimene instruktsioon liigutab registri DL sisu mälukohale 1000H, teine liigutab registri DL sisu sümboolsesse andmesegment kohal NUMB. Spetsiaalne adresseerimine kasutab alati MOD=00(no displacement) ja R/M koodi 110.Ilma displacementita(andmete liigutamisega nende kohalt) ei saa tegelikult kasutada adresseerimismoodi [BP] (R/M code 110), st. et kasutatakse 8-bitist displacementi ja adresseerimismood kirjutab [BP] asemel [BP+0], kus vaja.

Kui spetsiaalset adresseerimist poleks, tõlgendataks seda kui käsku MOV [BP],DL, mis oleks kolme-, mitte neljabaidine instruktsioon. (jooniselt Byte 4 jääks ära)

Page 15: [Raivo Alla] - utkodu.ut.ee/~raivoa/cpu.pdf · RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida programmi käiku peale järgnevat instruktsiooni. VM(virtual mode)

32-bitine adresseerimismood. Järgnev joonis toob ära 32-bitise moodi R/M kooditabeli.Pane tähele, et

kui R/M=100, siis ilmub instruktsiooni lisabait, mida kutsutakse scaled-index byte(skaalaindeksi bait).Seda baiti kasutatakse peamiselt siis, kui kaks registrit liidetakse kokku et saada mäluaadress instruktsioonis.

a

Kuna see bait lisatakse instruktsioonile, on 7 bitti opkoodi jaoks ja 8 bitti skaalaindeksi baidis. St. et scaled-index instruktsioonil on 219(32K) erinevat variatsiooni.

Seega on üle 32 000 MOV instruktsiooni variandi.

Pildil on skaalaindeksi baidi formaat, valitud R/M koodi 100 poolt, vasemad kaks bitti valivad skaalaindeksi kordaja.Index ja Base väljad sisalavad mõlemad registri numbrit.

Instruktsioon MOV EAX,[EBX+4*ECX] on kodeeritult 67668B048BH.Pane tähele, et nii address size(67H) kui ka register size(66H) ülekatvad eesliidesed(override perfixes) on esindatud.Selline kodeerimine esineb kui 386 ja kõrgemad MP-d töötavad 16-bitises moodis. Kui MP opereeriks 32-bitises moodis, siis mõlemad eesliidesed jääks ära ja käsk näeks välja selline: 8B048BH.Skaalaindeksiga adresseerimine võib muidugi kasutada ka üksikute registrite korrutisi skaalaindeksi kordajaga. (Näide: MOV AL,[2*ECX], kahekordne ECX registrisisu kopeeritakse AL registrisse) Immediate instruction.(vahetu käsk) Olgu käsk MOV WORD PTR [BX+1000H],1234H 16-bitise vahetu adresseerimise näide.See instruktsioon liigutab 1234H sõna-suurusesse(16-bitti) mäluruumi, mis asub aadressil 1000H+BX+DX*10H. See kuuebaidine instruktsioon kasutab kaks baiti opkoodi,W-biti,MOD-ja R/M välja jaoks.Kaks baiti kuuluvad andmetele(1234H) ja kaks baiti displacementile 1000H. WORD PTR direktiiv tähendab, et see instruktsioon liigutab sõnasuurust andmehulka.Kui andmed oleksid baidisuurused, siis oleks WORD PTR asemel BYTE PTR.Võimalik on ka DWORD PTR(doubleword). See direktiiv on vajalik vaid siis, kui pole kindel kui suur on liigutatac andmekogus, instruktsioon MOV [BX],AL on kindel ühe-baidi liigutus, seal pole seda direktiivi mõtet kasutada. MOV [BX],I pole korrektne määrang, sest see võib olla nii baidi-,sõna,-kui ka topeltsõnasuurune liigutus.Õige oleks niisiis kirjutada MOV BYTE PTR [BX],I või MOV WORD PTR [BX],I või MOV DWORD PTR [BX],I.

Kui segmentregistri sisu liigutatakse MOV,PUSH või POP instruktsiooniga, siis REG väljalt valitakse register. Masinkeeles näeks instruktsioon MOV BX,CS välja selline:10001100 11001011.