Luku 10

Emulointi suorittimen toteutustapana

Tässä aliluvussa esittelemme, kuinka tulkintaan perustuva suoritus voi olla järkevää myös ohjelman konekieliselle esitysmuodolle.

Ttk-91 emulaattori

Jos varsinaista suoritinta ei aiotakaan toteuttaa fyysisesti, niin ainoa tapa suorittaa sen konekielelle käännettyjä ohjelmia on rakentaa sille emulaattori tai simulaattori. Myös uuden suorittimen suunnittelussa on tapana toteuttaa sille hyvin laitteistoläheinen emulaattori, jonka avulla uutta suoritinta voi testata oikeilla ohjelmilla jo suunnitteluvaiheessa. Nykyisissä suorittimissa on hyvin vähän virheitä, koska suunnitelmaan jääneet virheet on yleensä löydetty testausvaiheessa emulaattorin avulla ennen piirien valmistamista.

Ttk-91 suorittimen määrittely on puutteellinen, eikä sen pohjalta voisi mitenkään toteuttaa todellista suoritinta. Määrittely on kuitenkin riittävän hyvä, jotta sille voidaan rakentaa konekäskytason emulaattori määrittelyssä mukana oleville käskyille.

Ttk-91 emulaattori sisältyy Titokone ohjelmistoon sen yhtenä komponenttina. Emulaattori lukee ttk-91 suorittimen konekielisiä käskyjä yksi kerrallaan ja tekee niiden määrittelemät muutokset emuloidun ttk-91 suorittimen rekistereihin ja muistiin. Emulaattorin koodi on kirjoitettu Javalla ja se on helposti luettavaa. Koodi on pitkähkö, koska siinä on mukana ohjelmankehitysympäristö ja suorituksen animaattori.

Transmetan emulointiin perustuva suoritin

Intelin x86-arkkitehtuuri sisältää eri kokoisia ja hyvin erilaisia konekäskyjä, joiden nopea suoritus on vaikea toteuttaa. Transmetan perusidea oli rakentaa x86-emulaattori ja sitä tukeva nykyteknologian nopea suoritin, joissa voisi emuloimalla suorittaa Intelin x86-koodia nopeammin kuin mihin Intelin omat suorittimet pystyivät.

Yleensä konekielen emulaattorien ongelmana on suorituksen hitaus, joka aiheutuu siitä, että konekäskyjä täytyy emuloida yksi kerrallaan. Transmetassa oli kuitenkin hoksattu, että sopivalla laitteistotuella myös emuloinnissa voisi hyödyntää usean konekäskyn suoritusta limittäin ja samanaikaisesti. Idea oli lennossa kääntää (JIT-kääntämällä) x86-konekäskyjen lohkot oman suorittimen konekielelle, jossa oli saman mittaisia yksinkertaisia konekäskyjä. Transmetan oma tätä tarkoitusta varten suunniteltu suoritin sitten pystyi suorittamaan näitä lyhyitä konekäskyjä limittäin ja rinnakkain hyvin nopeasti.

Transmeta sivuaa suomalaisia, koska se palkkasi Linux-käyttöjärjestelmän kehittäneen Linus Torvaldsin 1997 mm. porttaamaan Linux-käyttöjärjestelmän Transmetan suorittimille. Torvalds teki Transmetalla myös Linuxin kehitystyötä kuusi vuotta, jonka jälkeen hän muutti Kaliforniasta Oregoniin ja keskittyi puhtaasti Linuxin kehittämiseen.

Transmetan idea oli hyvä, mutta Intel vastasi siihen uudella suorittimella (ks. alla), joka lennossa muunsi jokaisen x86-konekäskyn rinnakkain suoritettaviin samanmittaisiin konekäskyihin. Näiden rinnakkainen suoritus oli vielä nopeampaa kuin Transmetan suorittimilla. Transmeta siirsi omien suorittimiensa markkinoinnissa painopisteen alhaiseen virrankulutukseen, millä alueella se saattoi vielä kilpailla kannettavissa laitteissa. Lopulta yhtiö lopetti toimintansa 2009.

Intel Pentium 4

Intel oli itsekin havainnut, että x86-arkkitehtuuri on vaikea sellaisenaan tehdä nopeaksi. Intelin x86-arkkitehtuuri juontaa juurensa jo vuoteen 1972. Vaikka se on kehittynyt paljon vuosien saatossa, niin Intel haluaa edelleen pitää uudet suorittimet sen kanssa yhteensopivina. Siitä ei siis haluta kokonaan luopua.

Intelin ratkaisu x86-koodin nopeaan suorittamisen Pentium 4 suorittimessa oli vähän saman kaltainen kuin Transmetalla, mutta kuitenkin merkittävästi erilainen. Kun Transmetan järjestelmässä x86-käskyt käännettiin JIT-kääntäjällä suurina lohkoina ennen suoritusta Transmetan suorittimen konekielelle, niin Pentium 4 suorittimessa kukin x86-konekäsky muunnettiin laitteistossa suoritusaikana käskyn noudon yhteydessä saman kokoisiin mikrokäskyihin.

Suorittimen sisällä varsinainen konekäskyjen suoritus perustui noihin mikrokäskyihin, joita oli helpompi suorittaa useaa limittäin ja samanaikaisesti. Tavallaan Pentium 4 siis emuloi x86-arkkitehtuuria puhtaalla laitteistoteutuksella.

Yhteenveto

Tässä kurssin viimeisen luvun viimeisessä aliluvussa esittelimme, kuinka ohjelmia voidaan suorittaa järjestelmässä välillisesti, tulkitsemalla ohjelman koodia jollakin toisella suorituksessa olevalla ohjelmalla (prosessilla). Tällainen prosessi voi olla komentotulkki, jolla suoritetaan käyttöjärjestelmälle annettavia hallintakomentoja. Se voi olla myös Java välikielen tulkki, joka emuloi hypoteettista Java virtuaalikonetta. Se voi olla myös jonkin suorittimen emulaattori, jolloin sen avulla voidaan yhdessä järjestelmässä suorittaa toisen järjestelmän konekielisiä ohjelmia.

Vastaa vielä alla olevaan kyselyyn, kun olet opiskellut tämän luvun asiat.

Pääsit aliluvun loppuun!

Muistathan tarkistaa pistetilanteesi materiaalin oikeassa alareunassa olevasta pallosta!