You are on page 1of 12

Istorija

MIPS procesorske jedinice se klasifikuju kao procesori sa redukovanim setom


instrukcija (RISC), nastali akademskim razvojem i istraživanjem. Nove arhitekture
procesora, ostvaruju visoke performanse, koristeći rezultate istraživanja na temu
RISC arhitektura, sredinom osamdesetih godina prošlog veka. Često se navodi da je
svaka arhitektura procesora posle 1984.-e godine RISC arhitektura.
Jedan od projekata je bio MIPS projekat na Stenford univerzitetu. Projekat deli ime sa
jedinicom za brzinu procesora, milion instrukcija po sekundi, a u stvari označava
Microcomputer without Interlocked Pipeline Stages. Istrazivanje Stenford grupe je
pokazalo da pipelining, već poznata teknika ubrzanja rada procesora, nije efikasno
izkorištena u ranijim arhitekturama.

Pregled arhitekture

Procesor sa pipeline arhitekturom funkcioniše deleći proces izvršavanja instrukcija na


više manjih, nezavisnih celina. Obzirom da su celine nezavisne, više instrukcija se
može izvršavati paralelno, sa međusobno različitim trenutnim stanjima izvršenja.
Takođe, za ovakvu arhitekturu je karakteristično da teži većim brzinama rada,
obzirom da se kompleksne operacije mogu razbiti na proste celine. Rezultat je
izvršavanje više instrukcija paralelno sa velikom brzinom inicijalizacije i samog
izvršavanja.
SLIKA MIPS pipelining
Brzina pipeline arhitekture zavisi od uspešnosti tehnike keširanja. MIPS R3000A
arhitektura koristi posebnu keš memoriju za podatke i instrukcije, tako da u istoj
periodi takta, procesor može da ažurira promenljivu iz memorije i da učita instrukciju
programa. Uparujući rad na visokim učestanostima sa velikim propusnim opsegom
memorije, postižu se visoke performanse.
RISC arhitektura podrazumeva dualnu keš memoriju kao deo procesora. Program se
regularno izvršava iz keš memorije, a promašaj keša, kada se zahteva učitavanje
instrukcije van keš memorije, se smatra izuzetkom.
Za R3000A i njegove derivate, izvršavanje instrukcije je podeljeno na 5 faza, koje se
nazivaju pipestages. Svaka se faza izvršava u fiksnom vremenskom intervalu.
Podrazumeva se izvršavanje instrukcija iz keš memorije i rad iste na taktu
procesora.Sve instrukcije su definisane tako da prate sekvencu pipestages -a, čak
iako ne rade ništa u određenoj fazi izvršavanja.
Ukupan rezultat je učitavanje nove instrukcije sa svakom periodom takta, sve dok se
dešava pogađanje keša.
Faze izvršavanja instrukcije (pipestages) su:
•IF (instruction fetch) - učitavanje nove instrukcije iz keš memorije instrukcija (I-
cache),
•RD (read registers) - dekodovanje instrukcije i dohvat vrednosti zahtevanih
registara,
•ALU (arithmetic/logic unit) - izvršava aritmetičko/logičke operacije u jednoj periodi
takta,
•MEM - faza u kojoj instrukcija može učitati ili ažurirati promenljivu u keš memoriji
podataka (D - cache). Za tipične programe, tek jedna od četiri instrukcije koristi
ovu fazu.
•WB (write back) - skladištenje rezultata instrukcije u registar.
Ova arhitektura ima stroga ograničenja u vidu:
•Sve instrukcije moraju biti širine 32 bita, što onemogućava kompleksne instrukcije.
Tako je nemoguće realizovati instrukcije sa kmpleksnijim adresnim modovima,
usled nedostatka bita.
•Nema aritmetičkih operacija direktno nad promenljivim iz memorije. Operacije nad
memorijom su u četvrtoj fazi izvršavanja instrukcije, što je prekasno za
aritmetičko/logičke operacije.
Tokom projektovanja, arhitekte MIPS jezgra su nameravali da naprave procesor koji će
biti laka meta za efikasne optimizacione kompajlere. Zbog toga MIPS procesori sadrže
32 registra opšte namene, 3 - operandske aritmetičko/logičke instrukcije. Izbegnute
su kompleksne funkcije koje kompajleri najčešće ne mogu da generišu.

R3xxx familija procesora

MIPS korporacija je formirana 1984. godine sa ciljem realizacije Stanfordskog MIPS


procesora. Komercijalna, procesorska jedinica je unapređena sa jedinicom za
upravljenje memorijom. Prva verzija je izdata 1985. godine kao R2000. Poznati spoljni
matematički koprocesor za rad sa pokretnim zarezom R2010 FPA je izasao na tržište
1987. - e godine. R3000, centralna procesorska jedinica je izasla na tržiste 1988. - e
godine. Sa programerske tačke gledišta, R3000 je skoro identičan R2000 iako je
dodat hardver za unapređenje performansi. Sledeće godine je predstavljena revizija
procesora kao R3000A. Povećana je radna frekvencija.
R2000/R3000 procesorske jedinice imaju integrisan kontroler keša. Implementacija
keša je eksterna, sa industrijski standardnim SRAM modulima i par adresnih lečeva.
Matematički koprocesor deli magistralu keša paralelno sa celobrojnom matematičkom
jedinicom procesora, tumači instrukcije i vrši transfer operanada između jedinice za
rad sa pokretnim zarezom, memorije i celobrojne aritmetičke jedinice.
Podela funkcija procesorske jedinice je jako praktična, dozvoljavajući R2000/R3000
generaciji fabrikaciju bez ekstremnih kućišta i ogromnog broja pinova. Ali ipak,
povećavanjem radnog takta, brzi signali interfejsa keš memorije su povećali
kompleksnost dizajna. Pokazalo se da ovaj interfejs ograničava radni takt procesora.
Dodatno, ukupan broj čipova pri realizaciji mikroračunarskih sistema je ograničavao
dimenzije sistema i povećavao potrošnju, čime je sprečena upotreba u sistemima gde
je ovo predstavljalo problem. Derivati R3000A procesora imaju integrisan keš i
eventualno aritmetičku jedinicu za rad sa pokretnim zarezom, čime su smanjene
ukupne dimenzije i cena, a i sam procesor je postao jednostavniji za upotrebu.
Zasnovan na Hardvard arhitekturi, MIPS procesor ima jednu, za CISC neobičnu
karakteristiku, nema direktno implementiran pokazivač steka niti stek.

Neuobičajene osobine instrukcija

Sve instrukcije su 32 - bitne, kao što je pomenuto gore. Ovo znači da, na primer, nije
moguće uključiti 32 - bitne konstante u instrukcije. Instrukcija load immediate je
ograničena na 16 - bitnu vrednost. Specijalna instrukcija load uppper immediate
praćena sa or immediate mora biti upotrebljena da bi se u registar upisala 32 - bitna
vrednost.
Akcije instrukcije moraju odgovarati pipeline toku izvršavanja. Svaka akcija instrukcije
se mora izvršiti u tačno određenoj fazi sa tačnim redosledom, u jednoj periodi takta.
Na primer, WB faza se izvršava samo jednom, na kraju ciklusa izvršavanja instrukcije,
tako da je moguće ažurirati vrednost samo jednog registra.
Instrukcije su trooperandske. Aritmetičko/logičke operacije ne zahtevaju definisanje
memorijske lokacije, pa ostaje dovoljno mesta za definisanje dva operanda i odredišni
registar instrukcije. Kompajlerima odgovaraju ovakve instrukcije sa tri operanda, jer
im omogućava da unaprede kod, koji rukuje komplikovanim izrazima.
Trideset dva registra procesora (file registers) odgovaraju kompajlerima, sa tim da je
plaćena cena u vidu skupljeg enkodovanja registara koje se koriste u instrukcijama.
Nema statusnog registra. Ovo je urađeno, da bi se obezbedilo da se stanje izvršenja
instrukcije čuva na samo jednom mestu, file registru procesora. Instrukcije grananja
testiraju vrednost određenog registra. Testira se znak vrednosti, da li je 0 ili jednakost
vrednosti para registara.

Adresiranje i pristup memoriji

Reference prema memoriji su uvek tipa učitaj u/iz registra. Aritmetičke operacije nad
memorijskim lokacijama smetaju pipeline sistemu, tako da nisu implementirane u
tom obliku. 32 - bitni registri omogućavaju čuvanje više promenljivih u svakom od
njih.
Postoji samo jedan oblik adresiranja. Sve naredbe čitanja/upisa se odnose na adrese,
definisane osnovniom vrednošću registra i 16 - bitnim, označenim odstojanjem.
Set instrukcija podrazumeva skup za rad sa 8 - bitnim (byte) i 16 - bitnim (halfword)
podacima.
Podaci moraju biti pravilno složeni po adresama. Operacije nad memorijom, koje rade
sa rečima, pristupaju adresama, sa pravilno složenim četvorobajtnim podacima.
Instrukcije programskih skokova imaju 26 - bitnu adresu skoka. Obzirom da su sve
instrukcije 32 - bitne, dva bita adrese najnižeg značaja nisu od interesa, te su mogući
skokovi na memorijska odstojanja od 256 MB. Karakteristika je da vrednost
programskog skoka nije relativna prema vrednosti programskog brojača, već
predstavlja apsolutnu adresu u 256 MB segmentu programske memorije. Teorijski,
ovo bi trebalo da predstavlja problem, ali ga u praksi nije bilo.
Programski skok van segmenta je moguć koristeći jr instrukciju, koja za programski
skok koristi vrednost registra.
Uslovni skokovi, tj. instrukcije grananja imaju 16 - bitnu vrednost skoka, koja se
interpretira kao označena (pozitivna ili negativna) u odnosu na programski brojač.

Operacije koje nisu direktno podržane

Ne postoje aritmetičke operacije za rad sa jedno/dvo bajtnim podacima. Sve


aritmetičke operacije su predviđene za rad sa 32 - bitnim podacima. Pri
programirannju se kao celobrojni tip preporučuje int, koji je 32 - bitni, te je ovakva
aritmetika efikasna. Ukoliko se kao tip koristi short, kompajler ubacuje ekstra kod.
Ne postoji posebna podrška za stek. Konvencionalni MIPS asembler definiše SP
registar, ali ga hardver tretira kao bilo koji drugi registar. Postoji pravilo za
implementaciju stek strukture podataka koje se trebaju pridržavati programeri, ali to
nije podržano od strane hardvera.
Karakteristika je i minimalno opterećenje podprogramima (programskim funkcijama).
Svaki skok izaziva čuvanje povratne adrese u registru $31.
Takođe, MIPS procesor vrši minimum akcija pri radu sa izuzecima, dozvoljavajući brz
odziv i širok spektar softverskih metoda. U R30xx familiji procesora, lokacija restarta
se skladišti u poseban EPC registar, modifikuje se stanje mašine čisto da se signalizira
događaj i zabrane daljnji prekidi, te se izvrši programski skok na predefinisanu
lokaciju. Sve ostalo pri obradi prekida je na softveru. MIPS procesorska jedinica, ne
postavlja ništa na stek, ne ažurira memoriju, ne spašava sadržaj registara. Prema
konvenciji, dva registra ($k0, $k1) su rezervisana za prekidnu rutinu i ne smeju se
koristiti.

Operacije množenja i deljenja

Operacije celobrojnog množenja i deljenja obavlja aritmetičko/logička jedinica


procesora. Relativno nezavisna je, sa sopstvenim izlaznim registrima.

Efekti pipeline arhitekture, vidljivi sa strane programera

Kao dodatak gornjim objašnjenjima, treba napomenuti karakteristike pipeline sistema


kojih programer mora biti svestan.
SLIKA The pipeline branch delay
Odložena grananja, su posledica arhitekture MIPS procesora. Naime, kada instrukcija
programskog grananja dodje u fazu izvršavanja, ona promeni vrednost programskog
brojača. U sledećoj periodi takta naredna instrukcija dolazi u fazu izvršavanja, iako ne
bi trebala da se izvršava, jer je obavljen programski skok. Rezultat ove instrukcije
ipak može biti koristan, zbog čega je usvojeno pravilo da instrukcija koja sledi u
programu posle instrukcije grananja se izvršava posle instrukcije grananja a pre
instrukcije na koju cilja rezultat instrukcije grananja. Pokazalo je se da pravilnim
rasporedom instrukcija, se može postići da instrukcija sa izvršavanjem u odloženom
grananju, zaista može da obavi koristan posao. Tamo gde sa ništa korisno ne može
odraditi, posle instrukcije grananja se postavlja nop (no operation) instrukcija. Mnogi
MIPS asembleri skrivaju ovu osobinu arhitekture od programera.
Učitani podatak nije dostupan instrukciji koja sledi. Ovo je još jedna posledica
arhitekture. Raspored faza izvršavanja instrukcija je takav, da se podatak iz memorije
učita tek posle početka ALU faze naredne instrukcije. Prema tome nije moguće u
instrukciji upotrebiti podatak koji je učitan predhodnom instrukcijom. I ovu osobinu će
većina asemblera sakriti od programera. Najčešće, asembler postavlja instrukciju koja
ne koristi predhodno učitane podatke iz memorije ili u najgorem slučaju nop
instrukciju.

Osvrt na mašinski i asemblerski jezik MIPS procesora

Da bi se pojednostavilo programiranje na nivou asemblera, MIPS asembler pruža


dodatni set sintetičkih instrukcija. Tipično, sintetička instrukcija je instrukcija koju
asembler realizuje pomoću više pravih (procesorskih) instrukcija. Ovakvo mapiranje
je produktivnije od makroa. Na primer, operacija učitavanja konstante u registar se
može prevesti kao jedna instrukcija, ako je podatak dovoljno mali ili dve u suprotnom.
Programer o tome ne vodi računa, već jednostavno unese naredbu za učitavanje
konstante. Ovo je očigledno korisno, ali može biti zbunjujuće.
Većina kompajlera omogućava sintetičke instrukcije i omogućava sledeće:
•Učitavanje 32 - bitne konstante. Programer može pisati kod koji učitava bilo koju
konstantu, a asembler će ovo da prevede na odgovarajuće instrukcije.
•Učitavanje memorijske lokacije. Programeru je omogućeno da piše kod koji vrši
operacije nad promenjivom iz memorije. Kompajler ovo prevodi na instrukcije koje
učitavaju promjenljivu iz memorije u registar, a potom izvršavaju operaciju nad
vrednošću registra.
•Efikasan pristup promenljivim u memoriji. C programi često imaju referencu prema
statičkim ili eksternim promenljivim. Par instrukcija za obavljanje operacija
učitavanja i skladištenja nad svakim od ovih podataka je neefikasno. Brza
manipulacija se postiže postavljenjem pokazivača (registra gp - $29) na sredinu
segmenta podataka, pri čemu se adresiranje obavlja navođenjem ofseta adrese
podatka.
•Više tipova programskog grananja. Asembler sintetizuje set instrukcija grananja
koristeći aritmetičke operacije nad vrednostima para registara.
•Jednostavne forme instrukcija. Unarne operacije kao not ili neg se realizuju
operacijama nor ili sub sa 0 vrednošću registra $0.
•Skrivanje kašnjenja grananja. Asembleri najčešće ne dozvoljavaju programeru
upotrebu instrukcija na mestima gde bi izkoristile kašnjenje grananja. Da bi ovo
samostalno izkoristili, asembleri su u stanju da reorganizuju kod. Asemblerska
direktiva .noreorder je na raspolaganju programeru, kako bi mogao samostalno
da izkoristi kašnjenje grananja.
•Skrivanje kašnjenja učitavanja promenljive. Većina asemblera je u stanju da
detektuje operacije nad predhodno učitanim vrednostima, nakon čega
reorganizuje kod ili ispred instrukcije obrade učitane vrednosti umetne nop.
•Transfer nesložennih podataka. Operacije za manipulaciju podacima iz memorije će
raditi korektno iako se njihove akcije odnose na memorijske lokacije koje nisu u
skladu sa dogovorom o slaganju promenljivih.
Pojedine instrukcije imaju dodatna ograničenja koja su specifična po implementaciji.
Mnogi asembleri ovo automacki razrešavaju ili u najgorem slučaju upozoravaju
programera o potencijalnoj grešci.
Asembleri mogu biti jako agresivni pri premeštanju instrukcija programa sa ciljem
postizanja što boljih performansi. Ovo treba imati u vidu pri debagovanju programa.

Programerski pogled na arhitekturu MIPS procesora

Registri

Procesori iz familije R30xx imaju implementirana 32 registra opšte namene ($0 -


$31). Samo dva od njih su specifična za hardver:
•$0 uvek vraća vrednost 0, bez obzira šta se pokušava upisati u registar.
•$31 je registar koji se koristi od strane rutine za poziv podprograma, jal, za
smeštanje povratne adrese.
U svakom aspektu, za procesor su svi ostali registi identični i mogu biti iskorišteni u
svakoj instrukciji. Instrukcije koje upisuju vrednost u registar, primenjene na registar
$0 su funkcionalno identične instrukciji nop.
U MIPS arhitekturi, programski brojač nije registar. Ne postoje uslovni kodovi niti
statusni registar dohvatljiv iz korisničkog programa. Dva registra označena sa HI i LO
su dodeljena jedinici za celobrojno množenje. Sadrže 64 - bitni rezultat celobrojnog
množenja ili količnik i ostatak pri celobrojnom delenju.
Jedinica za rad sa pokretnim zarezom (FPA, skraćenica od izraza Floating Point
Accelerator), ukoliko je implementirana, dodaje procesorskom sistemu još 32 registra.
U jednostavnom asemblerskom jeziku se označavaju sa $0 do $31. Ovim registrima
se može pristupati jedino posebnim instrukcijama za rad sa FPA jedinicom gde se
registri implicitno navode, zbog čega je moguće preklapanje u označavanju sa
osnovnim registrima procesorske jedinice. Realno se pristupa jedino parnim
registrima pri matematičkim operacijama nad brojevima jednostruke preciznosti (32
bita) ili dvostruke preciznosti (64 bita). Pri izvršavanju aritmetike nad brojevima
dvostruke preciznosti, registri označeni neparnim brojevima sadrže drugi bajt
predstavljenog broja.

Konvencionalni nazivi i upotreba registara opšte namene

Hardver nameće svega nekoliko pravila kojih se treba pridržavati pri upotrebi
registara opšte namene, ali njihova upotreba je ograničena većim brojem konvencija.
Ove konvencije omogućavaju razmenu softverskih alata i biblioteka među MIPS
okruženjima. TABELA konvencionalni nazivi registara
Sa konvencionalnim nazivim aregistara ide njihova konvencionalna upotreba.
Preporučuje se upotreba registara prema konvenciji.

Objašnjenje konvencionalne upotrebe registara

at je registar namenjen upotrebi od strane asemblera za realizaciju sintetičkih


funkcija. Ako programer koristi ovaj registar, mora da to naznači asembleru, da ga
ogradi od korišćenja istog, direktivom .noat .
v0 - v1 se koriste za povratnu vrednost podprograma, koje nisu tipa brojevi sa
pokretnim zarezom. Za povrat vrednosti koje zauzimaju više od 2x32 bita, mora biti
korištena memorija.
a0 - a3 se koriste za prosleđivanje prva 4 parametra (koja nisu brojevi sa pokretnim
zarezom) podprogramu.
t0 - t9 su registri koje podprogrami mogu da koriste bez predhodnog spašavanja
njihovog sadržaja.
s0 - s8 su registri čiji sadržaj mora biti očuvan posle poziva podprograma.
Podprogrami moraju spasiti vrednost registara, a po završetku restaurirati ili ih ne
smeju koristiti.
k0 - k1 su rezervisani za prekidne rutine. Sadržaj ovih registara nije očuvan posle
prekidne rutine, tako da ovi registri nisu od koristi u običnom programu.
gp je registar koji sadrži adresu sredine segmenta podataka. Ovo znači da bilo kojoj
promenljivoj u opsegu od 32k sa jedne i druge strane od adrese koju sadrži gp, može
da se pristupi jednom instrukcijom. Bez globalnog pokazivača, učitavanje podatka
obuhvata dve instrukcije, jedna da upiše konstantu, dva bajta najviše vrednosti
adrese, druga da učita promenljivu sa adrese, izračunate od strane linkera i
asemblera.
Da bi se koristio gp, kompajler mora znati da su podaci smešteni posle linkovanja u
64k segment. U praksi, kompajler ovo ne može znati, samo predpostavlja. Uobičajena
je praksa da se male globalne promenjive redaju oko mesta gde ukazuje gp, a da se
pokupe upozorenja linkera ako je ova oblast postala velika. Termin male se odnosi na
podatke veličine do 8 bajta.
sp se naziva pokazivač steka. Pošto rad sa stekom nije podržan hardverski, stek se
koristi samo pri pozivanju funkcija i povratku iz istih, te je na funkcijama odgovornost
za ispravan rad sa stekom. Definisana je konvencija za operacije nad stekom.
fp (frame pointer). Pozvane podrutine koriste fp da bi označile mesto na steku sa
podacima od značaja ili proširile oblast steka ako ga nameavaju aktivno da koriste.
ra sadrži povratnu adresu pri pozivu podrutina. Tipično se ovi delovi programa
završavaju instrukcijom jr ra. Podrutine koje pozivaju druge podrutine, moraju da
imaju implementirane metode za čuvanje sadržaja ra registra.

Jedinica za celobrojno množenje i registri

MIPS arhitekte su zaključile da je celobrojno množenje bitna operacija, pa su


realizovali instrukcije vezane za celobrojno množenje ožičenom logikom. Jedinica za
celobrojno množenje zauzima malo prostora na silicijumskoj pločici, ali zato primetno
unapređuje performanse sistema. Njena osnovna namena je množenje dva 32 - bitna
broja, što kao rezultat daje 64 - bitni rezultat. Rezultat se smešta u dva registra
nazvana hi i lo, koja su rezervisana za upotrebu samo od strane ove jedinice.
Instrukcije mfhi i mflo obezbeđuju kopiranje rezultata u registre opšte namene.
Za razliku od ostalih celobrojnih operacija, množenje je zaštićeno, tako da svaki
pokušaj pristupa rezultatu pre kraja množenja, izaziva pauziranje rada procesorske
jedinice.
Jedinica za celobrojno množenje takođe izvršava celobrojno delenje, pri čemu se
rezultat smešta tako da je količnik u lo registru, a ostatak u hi registru.
U R30xx familiji procesora, operacija množenja traje 12 perioda takta a deljenje 35.
Asembler ima sintetičku operaciju množenja koja pokreće množenje, a rezultat vraća
u običan registar. Pojedini asembleri su u stanju da izvrše manipulacije nad
konstantom pre množenja, kako bi se isto ubrzalo.
Rezutati množenja i delenja se smeštaju u hi/lo registre, čim je rezultat dostupan, dok
se instrukcije koje pristupaju rezultatu odlažu tek u poslednjoj, wb, fazi. Ako su mfhi
ili mflo poremećene prekidnom rutinom, a pri tome odmah posle ovih instrukcija
sledi instrukcija množenja, desiće se prepisivanje sadržaja hi/lo registara, a da nije
učitan predhodni sadržaj. Raspored instrukcija gde se mfh ili mflo nalazi između
instrukcija množenja, treba izbegavati.
Instrukcije množenja i delenja nikada ne izazivaju izuzetak, iako operacija delenja sa
0 ima nedefinisan rezultat. Najčešće se ubacuje kod koji proverava vrednost delioca,
a koji se postavlja posle instrukcije delenja, kako bi se konkurentno izvršavao i time
smanjio gubitak performansi.
Instrukcije mthi i mtlo su definisane da bi prekidna rutina mogla da vrati saržaj
registara pri povratku u predhodni kod. Inače nisu upotrebljive.

Instrukcije procesora

MIPS I ISA set instrukcija koristi tri formata kodovanja istih. Kodovanje instrukcija je
izabrano sa ciljem postizanja što većih brzina rada procesora.

Metode adresiranja

Kao što je napomenuto gore u tekstu, postoji samo jedan osnovni adresni mod
procesora. Ofset je označeni 16 - bitni celi broj (dakle vrednosti između -32768 i
32767). Adresa se dobija sabiranjem vrednosti registra procesora i ofset vrednosti.
Ovo je korisno u C sintaksi. Nizovima se pristupa prema indeksu. Ovakvo adresiranje
je dovoljno za prosleđivanje formalnih parametara funkcijama, pristup steku, kao i
efikasan pristup globalnim promenjivim, koristeći gp registar.
Asembler omogućava direktno adresiranje promenjivih. Ovo je prividno. Adresni mod
je naravno osnovni, a računanje adresese se obavlja u toku linkovanja programa.
Mnogo kompleksniji modovi, kao što je pristup dvoregistarskim promenjivim uzrokuje
umetanje složenijeg dodatnog koda.

Tipovi podataka

R3000 procesori mogu učitavati između 1 i 4 bajta jednom operacijom. Postoji


deklaracija o imenovanju tipa podataka, tabela TABELA DATA TYPES
Byte i halfword (dalje u tekstu bajt i polureč) tipovima podataka se manipuliše u dva
oblika:
•Označeno produženje. Koristeći lb i lh instrukcije, učitava se bajt ili polureč u 32 -
bitni registar, sa tim da se znak, tj. vrednost 7 - og (15 - og) bita kopira na
najznačajnije bite, da bi se dopunio registar. Ovim se korektno vrši konvertovanje
u tip word.
•Produženje nulama. Instrukcije lbu i lhu najmanje značajnim bitima registra
dodeljuju vrednost promenjive, dok ostatak registra se popunjava nulama. Ovim se
korektno konvertuje neoznačena vrednost promenjive u 32 - bitnu neoznačenu
vrednost.
Na primer vrednost neoznačenog bajta 254 se konvertuje u vrednost 254 neoznačene
reči instrukcijom lbu ili se konvertuje u vrednost -2 naredbom lb.

Osnovni adresni prostor

Način na koji MIPS procesori koriste i rukuju adresama je znatno drugačiji od


uobičajenog u CISC procesorima.
Adrese korištene u programu su retko iste fizičkim adresama kojima procesor adresira
podatke u memoriji. Označavaju se kao programske i fizičke adrese, respektivno. Čest
naziv za programske adrese je virtuelne adrese.
MIPS-1 procesorska jedinica ima dva moda rada, korisnički i kernel mod. U
korisničkom modu je svaka adresa iznad 2GB ilegalna i uzrokuje izuzetak programa.
32 - bitni adresni prostor je podeljen na 4 oblasti sa tradicionalnim nazivima kojima
su namenjene specifične uloge.
Oblast kuseg (0x0000 0000 - 0x7FFF FFFF). Ovo su adrese dozvoljene u korisničkom
modu. U mašinama sa MMU (Memory Menagment Unit) jedinicom, se ove adrese
uvek prevode. Softver nebi trebalo da proba dosegnuti ove adrese, sem ako postoji
MMU jedinica.
Oblast kseg0 (0x8000 0000 - 0x9FFF FFFF). Ove adrese se prevode u fizičke adrese
uklanjanjem bita najveće važnosti. Na ovaj način je segment mapiran u donjih 512MB
fizičke memorije. Često se ovaj segment označava kao unmapped.
Adresama u ovom regionu se uvek pristupa kroz keš, tako da se najčešće na mogu
koristiti pre pravilne inicijalizacije keša. Ove adrese se koriste od strane većine
programa i promenjivih.
Oblast kseg1 (0xA000 0000 - 0xBFFF FFFF). Ove adrese su mapirane uklanjanjem tri
bita najveće važnosti. Karakteristika ovoga memorijskog segmenta je da pristup
programa adresama u ovom opsegu ne upošljava keš memoriju.
kseg1 je jedini deo memorije za koji je garantovano da se ponaša pravilno posle
sistemskog reseta. Ovo je razlog zbog čega je početna adresa posle sistemskog
reseta postavljena unutar ovog segmenta (0xBFC0 0000, često nazivan i vektor reset
izuzetka). Fizička adresa početne tačke je 0x1FC0 0000, što znači da se ROM za
butovanje sistema treba postaviti na ovu fizičku adresu.
Prema tome, softver koristi ovaj region za inicijalni program u ROM - u, a takođe i za
U/I registre. Generalno, UI jedinice trebaju biti mapirane u okviru kseg1 segmenta
memorije.
Oblast kseg2 (0xC000 0000 - 0xFFFF FFFF) obuhvata 1GB adresnog prostora. Ovaj
segment je dostupan samo u kernel modu.

Sistemsko adresiranje

MIPS programske adrese su retko identične fizičkim, ali jednostavan ugrađeni softver
će verovatno koristiti adrese u segmentima kseg0 i kseg1, gde je očigledna relacija
među programskim i fizičkim adresama.

Kernel nasuprot korisničkog moda

U kernel modu (u koji procesor dolazi posle reseta) su dostupne sve programske
adrese.
U korisničkom modu važi:
•Programske adrese iznad 2GB su ilegalne i prouzrokuju izuzetak. Ukoliko procesorska
jedinica poseduje MMU, svako adresiranje od strane korisnika mora da se prevede
od strane MMU jedinice. Za procesore bez memorijske jedinice, kuseg adresni
prostor je mapiran u određenom delu memorije. Zbog toga se može desiti da su
resursi kernela (U/I jedinice koje su takođe memorijski mapirane, npr.) nedostupni
softveru u korisničkom modu bez zahteva operativnom sistemu za pristup ovim
jedinicama. Alternativno, hardver može izabrati da ignoriše bite najviše vrednosti
pri izvođenju dekodiranja adresa, pakujući segmente kuseg, kseg0, kseg1, kseg2
u jedan fizički, adresni prostor.
•Instrukcije van seta standardnih korisničih su ilegalne. Specifično, kernel može
zabraniti korisnčkom programu da pristupi CP0 kontrolnom koprocesoru koji
kontroliše izuzetke, stanja procesora te izvršava funkcije procesorskog
menadžmenta memorije.
Prema tome su osnovne razlike između korisničkog i kernel moda u tome da se
korisničkom programu može zabraniti pristup resursima kernel memorije, ovde
uključujući U/I uređaje i strukture podataka operativnog sistema. Ovo takođe
podrazumeva zaštitu pristupa resursima među različim korisničkim procesima. Bitna
razlika između programa u korisničkom i kernel modu je i to što se korisničkom
programu može zabraniti menjanje konfiguracije sistema, podešene od strane
kernela.

Memorijska mapa za procesore bez jedinice za upravljanje memorijom (MMU)

Za procesore, derivate R3000 procesora, bez MMU jedinice važi sistem fiksnog
prevođenja adresa. Na raspolaganju je sledeći sistem prevođenja adresa:
•kuseg segment se prevodi u kontinualni 2GB memorijski prostor između 1 i 3GB. Na
primer, adresa vezana za ovaj memorijski segment vrednosti 0x0000 0000 se
prevodi u fizičku adresu 0x4000 0000, dok adresa 0x7FFF FFFF u fizičku adresu
0xBFFF FFFF.
•kseg2 segment se ne prevodi, već adrese podataka u opsegu 0xC000 0000 do
0xFFFF FFFF odgovaraju stvarnim fizičkim lokacijama tih podataka.

Upravljanje izuzetcima

Izuzetci

U MIPS arhitekturi se prekidi, sistemski pozivi i sve što izaziva prekid normalnog
izvršavanja programa naziva izuzetkom. Upravljanje izuzetcima se vrši jednostavnim
mehanizmom. Događaji koji uzrokuju izuzetke su:
•Spoljni događaji kao što su spoljašnji prekidi ili greška na magistrali prilikom čitanja.
Izuzetci jedinice za rad sa brojevima sa pokretnim zarezom se svrstavaju u
spoljašnje prekide. Prekidi su jedini oblik izuzetaka koji se može zanemariti pod
softverskom kontrolom.
•Programske greške i neuobičajena stanja kao što su nepostojeća instrukcija,
prekoračenje celobrojnog tipa promenjive, greška uzrokovana neporavnavanjem
memorije, pristup memoriji van kuseg segmenta korisničkog programa.
•Izuzetci prevođenja mamorijskih adresa, nastali na primer neispravnim prevođenjem
adresa, prilikom pokušaja upisa u ROM lokacije.
•Sistemski pozivi i zamke, su namerni izuzetci, uzrokovani od strane korisničke
aplikacije sa ciljem pristupa kernel resursima na bezbedan način.
Određeni događaji ne izazivaju izuzetke, iako ih procesorska jedinica tako može
tretirati. Softver mora koristiti posebne metode za detekciju ovih događaja:
•greške na magistrali pri ciklusu upisa,
•greška parnosti detektovana u kešu.

Precizni izuzetci (precise exceptions)

MIPS arhitektura implementira precizne izuzetke, korisnu metodu koja omogućava:


•Nedvosmislen dokaz uzroka. Posle izuzetka prouzrokovanog bilo kojom internom
greškom EPC registar ukazuje na instrukciju koja je uzrokovala grešku.
•Izuzetci se vide u instrukcijskoj sekvenci. Izuzetci se mogu pojaviti u više različitih
koraka izvršavanja, stvaranjem potencijalne opasnosti. Na primer, ako instrukcija
učitavanja uzrokuje promašaj keša, izuzetak neće biti signaliran sve do MEM faze
izvršavanja instrukcije. Ukoliko sledeća instrukcija uzrokuje promašaj keša u IF fazi
izvršavanja instrukcije koja je pre MEM faze, ovaj drugi izuzetak će biti prijavljen
prije prvog. Da bi se izbegao ovaj problem, rano detektovani izuzetci nisu
aktivirani dok ne bude sigurno da su ranije instrukcije uspešno izvršene.
Ustanovljenjem suprotnog, pristupa se obradi izuzetka te, uspešno ne izvršene
instrukcije.
•Nuliranje instrukcija. Zbog pipeline arhitekture procesora može se desiti da
instrukcije koje slede onu koja je izazvala izuzetak promene sadržaj registara
procesora. Dizajn procesora garantuje da instrukcije koje slede izuzetak, neće
promeniti sadržaj registara. Ova metoda se naziva nuliranje instrukcija. U realnim
programima, ovo nije sasvim tačno. Primer je koprocesor za celobrojno množenje,
gde će sledeća instrukcija prepisati sadržaj HI i LO registara. Ovo se izbegava
pravilnom konstrukcijom programa.
Implementacija pravila preciznih izuzetaka realizovana je orginalnim idejama i
izuzetnim tehnikama.
Trenutak nastupa izuzetka

Obzirom da su izuzetci precizni, arhitektura određuje uzrok izuzetka na mestu


instrukcije koja je pokrenuta neposredno pre izuzetka. Pozivanje rutine za obradu
izuzetka se obavlja najdalje jedan ciklus takta od trenutka događaja izuzetka, a u
realnosti najčešće pre toga. Pri prekidu, poslednja instrukcija koja je uspešno izvršena
je ona koja je bila u MEM fazi u trenutku kada je instrukcija, uzrok prekida bila u ALU
fazi izvršavanja. Adresa ove instrukcije, koja je poslednja uspešno izvršena se smešta
u EPC registar.

Vektori izuzetaka

Za razliku od CISC procesora, MIPS procesori ne vrše dodeljivanje posebnih rutina za


obradu svakom od izuzetaka. Razlog za ovo je dvostruk. Pokazuje se da u CISC
sistemima, mikrokodovi specijalizovani za svaki od prekida pojedinačno imaju
zajednički kod koji se poziva iz ovih mikrokodova, tako da rutine, iako su specifične za
svaki od prekida, nisu efikasne kako se to čini na prvi pogled. Drugi razlog je to što se
smatra da je obični RISC kod dovoljno brz da bi zamenio mikrokod CISC procesora.
Samo jednom izuzetku je posvećena posebna pažnja. Reč je o promašaju keša koji
može biti veoma česta pojava pri multiprocesorskom radu ili pri radu sa virtuelnom
memorijom. Realizovana je jaka podrška u arhitekturi ovom tipu izuzetka, sa ciljem
brzog i efikasnog punjenja keš memorije, koje se obavlja najdalje u roku od 13 ciklusa
takta.
Veoma je korisno posedovati dva načina za pozivanje prekidnih rutina. Prvi, gde je za
vreme pokrenute aplikacije efikasno imati dostupan vektor prekidne rutine u kešu za
upotrebu od strane operativnog sistema. Drugi način pristupa vektorima izuzetaka je
potreban za vreme butovanja sistema, kada se zahteva robustan sistem koji ima
mogućnost samotestiranja i koji po pravilu treba biti smešten u neizbrisivu memoriju.
Prema navedenom, sistem za obradu izuzetaka dodaje vektore izuzetaka na novim
adresama, pored onih koji su korišćeni pri podizanju sistema. Karakteristično je za
MIPS procesore da je reset sistema jako sličan mehanizmu obrade izuzetaka, pa se
ovaj događaj često naziva reset izuzetak. TABELA 4.1 VEKTORI IZUZETAKA
Prostor u memoriji od 128 MB između dva vektora izuzetaka je zbog uverenja
ahitekata MIPS jezgra, da su 32 instrukcije dovoljne za sistemsku rutinu obrade
događaja promašaja keša.
Dakle, pri događaju izuzetka, procesorska jedinica:
•upisuje vrednost adrese instrukcije izuzetka u EPC registar,
•postavljeni flegovi u sistemskom registru SR, vezani za dozvolu prekida i korisnički
mod rada se spašavaju na steku, posle čega se menjaju flegovi sa ciljem zabrane
prekida i obezbeđenja kernel moda rada,
•postavlja se vrednost Cause registra, kako bi uzrok izuzetka bio očigledan rutini za
obradu prekida, postavljaju se i parametri bitni za pravilan rad MMU jedinice,
•predaje se kontrola rutini za obradu izuzetaka.

Osnove obrade izuzetaka

Svaka rutina za obradu izuzetaka mora da prođe kroz sledeće faze:


•Butstrepovanje: pri pokretanju prekidne rutine, vrlo malo od stanja prekinutog
programa je spašeno, te je prvi korak obezbeđenje prostora za čuvanje
informacija o stanju prekinutog programa,
•Dodela izuzetaka: čita se vrednost Cause registra. Donosi se inicijalna odluka na
osnovu ExcCode polja registra, čija vrednost pada u opseg 0 do 31. Ova vrednost
se koristi za indeksiranje niza sa rečima, parametrima prekidne rutine.
•Konstrukcija okruženja za obradu izuzetka: kompleksne rutine za obadu izuzetaka
mogu biti napisane jezikom višeg nivoa što podrazumeva upotrebu funkcija
standardnih biblioteka. Da bi se ovo omogućilo, potrebno je upotrebiti stek
strukturu podataka, te spasiti sadržaj svih registara čiji sadržaj može biti
promenjen pozivom funkcija standardnih biblioteka.
•Obrada događaja: ovo je faza zavisna od sistema i samog uzroka izuzetka.
•Povratak iz rutine: povratna adresa je sačuvana u EPC registru. Ova vrednost mora
biti sačuvana u registru opšte namene, kako bi se upotrebila za povratak iz rutine.
Ovo nije pravilo jer se može desiti da se vrednost EPC registra čuva na steku,
odakle se vraća u registar opšte namene. Povratak kontrole se obavlja jr
instrukcijom, a povratak stanja iz kernel u korisnički mod se obavlja rfe
instrukcijom posle jr, sa zakašnjenjem zahvaljujući osobini odloženog
programskog skoka.

Ugneždeni izuzetci

U mnogo slučajeva rutina za obradu prekida dozvoljava da bude prekinuta novim,


ugneždenim izuzetkom.
Ukoliko je ovaj proces nepašljivo isplaniran, može doći do haosa u softveru te pada
sistema. Vitalni podaci o izuzetku se čuvaju u registrima EPC i SR. Uneždeni izuzetak
će promeniti sadržaj ovih registara. Da bi se dozvolili ugneždeni izuzetci mora se
sačuvati sadržaj ovih registara.
Uobičajen pristup ovome je da se definiše okvir izuzetka, struktura podataka
smeštena u memoriju sa poljima za čuvanje sadržaja registara, tako da njihova
vrednost po potrebi može biti povraćena. Okviri izuzetaka su najčešće realizovani kao
stek struktura podataka.
Resursi steka se koriste svakim izuzetkom, tako da se proizvoljni ugneždeni izuzetci
ne tolerišu. Većina sistema sortira izuzetke prema prioritetu, čime se postiže obrada
izuzetka koja može biti prekinuta samo izuzetkom visokog nivoa prioriteta. Ovakvi
sistemi zahtevaju onoliko okvira izuzetaka koliko ima nivoa prioriteta.
Softver može zabraniti određene izuzetke:
•Prekide, koji se mogu individualno maskirati od strane softvera sa ciljem zadovoljenja pravila
prioriteta.
•Privilegovane greške, koje se ne mogu dogoditi u kernel modu.
•Greške adresiranja i promašaji keša su događaji za koje softver mora obezbediti
takve uslove, da se nikada ne dese za vreme obrade izuzetaka.

Prekidi

MIPS procesori poseduju pet posebnih hardverskih bita prekida aktiviranih od strane
ulaznih pinova centralnog procesora, kao i dva bita koja se mogu postaviti softverski.
Aktivan nivo na svakom pinu se detekzuje svakim ciklusom takta, te izaziva izuzetak
ako je dozvoljen.
Dozvola prekida se izvršava iz dva poteza:
•Globalni bit dozvole prekida (IEc) u statusnom registru mora biti setovan da bi se
dozvolili prekidi. Ovo je jednostavan, obuhvatan i brz način da se zabrane prekidi
kada je to potrebno, npr. za vreme obrade izuzetaka, kada je softver ranjiv na
prekide. Ponovna dozvola prekida se najčešće obavlja pratećom instrukcijom
povratka iz obrade prekida.
•Individualno maskiranje prekida bitima IM koji pripadaju statusnom registru.
Postavljanjem bita se dozvoljava odgovarajući prekid. Manipulaciju maskiranja
prekida obavlja softver prema potrebama, pri čemu se mora voditi računa da se
izmene bita vrše u režimu sistemske zabrane prekida.
TABELA prekidni biti

Obrada prekida počinje u trenutku događaja izuzetka i ustanovljenja da polje Type


registra Cause ukazuje na prekid. Kada je ustanovljen prekid, obrada istog se obavlja
u sledećim fazama:
•konsultuje se polje IP Cause registra, zatim se logičkom I operacijom sa sadržajem
IM polja SR registra ustanovljavaju promene, tj. uzroci prekida. Moguć je
višestruk uzrok izuzetka.
•Jednom prekidu se poklanja pažnja. Selekcija se vrši jednostavno na osnovu
prioriteta.
•Sledeći korak je spašavanje sadržaja SR registra, ukoliko to nije urađeno u rutini
obtrade izuzetka.
•Promenom sadržaja IM polja se obezbeđuje da su trenutni prekid i svi prekidi istog
prioriteta zabranjeni.
•Ukoliko nije spašeno stanje sistema od strane rutine za obradu izuzetka, to se radi u
ovom koraku sa ciljem omogućenja ugneždenih izuzetaka.
•Omogućavaju se prekidi postavljanjem bita globalnog maskiranja prekida IEc. Ovim
se omogućavaju prekidi višeg prioriteta.
•Tek sada se poziva odgovarajuća prekidna rutina, selektovanog prekida.
•U povratku iz prekidne rutine, onemogućuju se prekidi postavljanjem IEc bita na 0,
pre povratka u osnovnu rutinu obrade izuzetaka.

You might also like