Käskysykli¶
y86-prosessorista esitellään kurssilla kaksi versiota, joista ensimmäinen perustuu sekventiaaliseen laskentaan. Tämä tarkoittaa sitä, että prosessorissa jokainen käsky suoritetaan alusta loppuun yhden kellojakson aikana.
Suoritus jaetaan pienempiin vaiheisiin prosessorin osajärjestelmissä, jotka suoritetaan peräkkäin samassa kellojaksossa. Käskystä riippuen prosessorin eri osajärjestelmät ovat aktiivisia eri vaiheissa osan kellojaksosta. Tämä on moderneissa tietokoneissa hidas tapa suorittaa koodia, mutta sen toiminta on oleellista ymmärtää.
Prosessorin sisäisen arkkitehtuurin suunnittelussa on edullista, että käskysykli on sama kaikille käskyille. Tällöin sisäinen toteutus yksinkertaistuu ja komponenttien määrä saadaan minimoitua. Sen sijaan, että lisättäisiin hardikseen komponentteja tai digitaalilohkoja, on halvempaa tehdä sama operaatio ohjelmallisesti. Ohjelmistolla on myös helpompi hoitaa käskyihin liittyviä erikoistilanteita.
Käskyn suorittamisessa, käskysyklissä on sekventiaalisessa y86:sessa kuusi vaihetta. Käytämme vaiheista (paremman puutteessa) niiden englanninkielisiä nimityksiä:
- Fetch Käsky noudetaan muistista PC-rekisterin osoittamasta paikasta ja se tulkitaan, ts. kaivetaan operaatiokoodi ja operandit.
- Decode Luetaan arvot operandien viittaamista rekistereistä ALU:lle valmiiksi.
- Execute Suoritetaan käskyn operaatiokoodin mukainen aritmeettis-looginen operaatio operandeille tai lasketaan muistiosoite muistiviittausta varten tai päivitetään pino-osoitin.
- Memory Jos käskyssä on muistiosoitus, luetaan tai kirjoitetaan annetusta muistiosoitteesta.
- Write back ALUn operaation tulokset kirjoitetaan rekistereihin.
- PC Update Päivitetään PC-rekisteriin seuraavan käskyn muistiosoite.
Tätä käskysykliä sitten meidän prosessorimme siis jauhaa loputtomiin, ellei poikkeusta tule. Kaikki käskyt eivät aina suorita kaikkia näitä vaiheita, esimerkiksi jos käskyssä ei ole muistiosoitusta, niin sitä vaihetta ei suoriteta. Paitsi Execute-vaihe on pakollinen jokaisessa käskyssä.
Yleiskuva käskysyklistä.
Seuraavaksi esitetään yleinen kuvaus mitä käskysyklin jokaisessa vaiheessa tapahtuu. Tarkempi kuvaus kaikkine signaaleineen löytyy oppikirjasta, mutta tämä taso riittää meille nyt.
Kuvauksen rinnalla materiaalissa esitetään mitä esimerkkikäskyissä
addq %rbx,%rcx
tapahtuu, kun oletetaan PC=0x2c
sekä %rbx=0x3
ja %rcx=0x4
. R[x]
tarkoittaa, että luetaan rekisterin x arvo / kirjoitetaan arvo rekisteriin xM[x]
tarkoittaa, että luetaan muistpaikan x arvo / kirjoitetaan arvo muistipaikkaan x
Fetch¶
Tässä vaiheessa käsky noudetaan muistista PC-rekisterin näyttämästä paikasta. Sen jälkeen kontrolliosa tulkitsee käskyn:
icode
: operaatiokoodinifun
: toiminto, operaatiokoodin tarkennus- Operandit kytke
rA
jarB
ovat (0x0-0xE) jos operandit ovat rekistereitä tai 0xF jos operandi ei ole rekisterivalC
sisältää arvon, jos operandi on vakioarvo tai muistiosoitevalP
Seuraava PC-rekisterin arvo, eli nykyinen PC + käskyn pituus tavuina- Jos operaatiokoodi tai muistiosoite ovat virheellisiä, asetetaan poikkeustilat
INS
taiADR
ja ohjelman suoritus päättyy.
Esimerkkikäsky.
# Käsky muistista: kaksi tavua 0x6031 icode:ifun <- M[PC] = 60 icode = 6 # Aritmeettiset operaatiot ifun = 0 # Funktio 0, yhteenlasku # Operandit muistista rA:rB <- M[PC+1] = 31 rA = 3 # Rekisterin %rbx numerokoodi rB = 1 # Rekisterin %rcx numerokoodi # Seuraava PC:n arvo valP <- PC + 2 valP = 0x2e
Decode ja Write-back¶
Decode- ja Write back-vaiheet suoritetaan samalla digitaalilogiikan toteutuksella, koska molemmissa vaiheissa käsitellään rekistereitä.
Kontrolliosassa on 4 I/O porttia, joihin asetetaan luku- ja kirjoitusoperaatioiden kohderekisterit.
- Input
srcA
: käskyn 1. operandirA
- Input
srcB
: käskyn 2. operandirB
- Output
dstE
: käskyn suorituksen tulosrekisterirB
- Output
dstM
: muistiin kirjoitettava arvorA
Decode-vaiheessa asetetaan (
icode
:sta riippuen) ALU:lle input-arvot valA
ja valB
käskyn rekisterien rA
ja rB
arvoista. Write back-vaiheessa (
icode
:sta riippuen) käskyn tulos valE
kirjoitetaan rekisteriin rB
tai tai muistiosoitteesta haettu arvo valM
rekisteriin rA
. Esimerkkikäsky Decode-vaiheessa.
valA <- R[rA] valA = 0x3 valB <- R[rB] valB = 0x4
Esimerkkikäsky Write back-vaiheessa.
R[rB] <- valE R[rB] = 0x7
Execute¶
Edellisessä vaiheessa asetimme operandien arvot valmiiksi ALUlle. Nyt sen ei tarvitse tietää mitä ja mistä arvot, ovat vaan se voi vain suorittaa niille halutun operaation.
y86-64:sen ALU osaa vain neljä operaatiota: yhteenlasku, vähennyslasku, JA-operaatio ja ERI-operaatio. Yhteenlasku on käytetyin operaatio, jolla toteutetaan monta eri käskyä yllättävilläkin tavoilla. ALUn suoritettava operaatio on kerrottu
icode:ifun
-inputeissa Fetch-vaiheesta. Tarvitaan vielä kontrolliosa asettamaan varsinaiset sisääntulot ALU:lle
aluA
ja aluB
, koska inputit voivat olla rekistereitä (valA
ja valB
) tai vakioarvo (valC
vakioarvo Fetch-vaiheesta). Kontrolliosa valitsee kytkettävät inputit icode
:n arvosta riippuen. Kun ALU:n operaation on suoritettu, operaation tulos tallentuu
valE
:hen, jossa voi käskystä riippuen olla myös muistiosoite. Lisäksi ALU asettaa tilabittien arvot jos tarvitsee tilarekisteri CC
:hen. Esimerkkikäsky.
valE <- valB + valA valE = 0x4 + 0x3 = 0x7 cnd <- CC
Memory¶
Tässä vaiheessa joko luetaan tai kirjoitetaan dataa muistista / muistiin. Operaatio kerrotaan jälleen kerran
icode
:ssa. Kontrolliosa asettaa muistiosoitteen joko:
- Yleisesti
valE
:sta, eli kun se laskettiin Execute-vaiheessa - Pinoa käyttävissä käskyissä (pushq, popq ja ret)
valA
:sta (eli %rsp-rekisteristä)
Kirjoitettava data valitaan joko:
- Yleisesti
valA
:sta - Aliohjelmassakutsussa
call
valP
:stä, koska kirjoitetaan ohjelman paluuosoite pinoon
Muistista luettu data tallentuu
valM
:ään. (Kuvassa KL=kontrollilogiikka).
Esimerkkikäskymme ei tee muistivaiheessa mitään. Materiaalin lopussa muita esimerkkejä.
PC Update¶
Tämän jälkeen tarvitsee enää päivittää
PC
-rekisterin arvo, josta seuraava käsky noudetaan Fetch-vaiheessa. Uusi osoite voi olla joko:
- Yleisesti
valP
ret
-käskyssävalM
, koska osoite haettiin pinosta- Ehdollisissa hypyissä joko
valC
taivalP
.icode
jacnd
(tilabitti) kertoo vaatiiko uusi osoite hypyn.
(Kuvassa KL=kontrollilogiikka)
Esimerkkikäsky.
PC <- valP PC = 0x2e
Käskyn suoritusesimerkkejä¶
Kuvasta nähdään miten ALU:n neljää operaatiota käytetään eri käskyissä:
- Aritmeettinen laskutoimitus ja asetetaan tilabitit (addq)
- Siirto-operaatio yhteenlaskun kautta (irmovq)
- Lasketaan muistiosoite, josta luetaan / kirjoitetaan dataa (esim. rmmovq)
- Muutetaan pino-osoitetta (popq)
- Luetaan tilabitit (jne-hyppykäsky)
Lopuksi¶
Prosessorin toiminnan ymmärtäminen on avain koko tietokoneen toiminnan ymmärtämiseen. Tässä kappaleessa esittelimme yleisesti sekventiaalisen y86-64:sen toiminnan käskyjen suorituksessa. Suoritus on kuvattu vielä yksityiskohtaisemmin oppikirjassa, mukaanlukien erilaiset kontrolliosan signaalit.
Sekventiaalisen suorittimen heikkoutena on, ettei siinä käskyn suoritusaikaa voi optimoida, vaan kaikki käskyt suoritetaan hitaimman mukaan. Seuraavassa kappaleessa esitetään toinen tehokkaampi toteutustapa y86-prosessorille.
Anna palautetta
Kommentteja materiaalista?