Tietokonejärjestelmien simulaattorit: tuttu täyden alustan simulaattori ja tuntematon myötäpäivään ja jäljet

Tietokonejärjestelmäsimulaattoreita käsittelevän artikkelin toisessa osassa jatkan puhumista yksinkertaisessa johdantomuodossa tietokonesimulaattoreista, nimittäin koko alustan simulaatiosta, jonka keskivertokäyttäjä useimmiten kohtaa, sekä kellosta. -kellomalli ja jäljet, jotka ovat yleisempiä kehittäjäpiireissä.

Tietokonejärjestelmien simulaattorit: tuttu täyden alustan simulaattori ja tuntematon myötäpäivään ja jäljet

В ensimmäinen osa Puhuin siitä, mitä simulaattorit yleensä ovat, sekä simuloinnin tasoista. Nyt ehdotan tämän tiedon pohjalta sukeltaa hieman syvemmälle ja puhua koko alustan simuloinnista, jälkien keräämisestä, mitä niille tehdä myöhemmin, sekä kello-kello-mikroarkkitehtuuri-emulaatiosta.

Koko alustan simulaattori eli "Yksin kentällä ei ole soturi"

Jos haluat tutkia yhden tietyn laitteen, esimerkiksi verkkokortin, toimintaa tai kirjoittaa laiteohjelmiston tai ohjaimen tälle laitteelle, tällainen laite voidaan simuloida erikseen. Sen käyttäminen erillään muusta infrastruktuurista ei kuitenkaan ole kovin kätevää. Vastaavan ohjaimen suorittamiseksi tarvitset keskusprosessorin, muistin, pääsyn tietoväylään jne. Lisäksi ohjain vaatii toimiakseen käyttöjärjestelmän (OS) ja verkkopinon. Lisäksi voidaan tarvita erillinen pakettigeneraattori ja vastauspalvelin.

Täyden alustan simulaattori luo ympäristön täydellisen ohjelmistopinon suorittamiseen, joka sisältää kaiken BIOSista ja käynnistyslataimesta itse käyttöjärjestelmään ja sen eri alijärjestelmiin, kuten samaan verkkopinoon, ohjaimet ja käyttäjätason sovellukset. Tätä varten se toteuttaa useimpien tietokonelaitteiden ohjelmistomalleja: prosessori ja muisti, levy, syöttö-/tulostuslaitteet (näppäimistö, hiiri, näyttö) sekä sama verkkokortti.

Alla on lohkokaavio Intelin x58-piirisarjasta. Täyden alustan tietokonesimulaattori tässä piirisarjassa vaatii useimpien lueteltujen laitteiden toteuttamisen, mukaan lukien IOH:n (Input/Output Hub) ja ICH:n (Input/Output Controller Hub) sisällä olevat laitteet, joita ei ole kuvattu yksityiskohtaisesti lohkokaaviossa. . Vaikka käytäntö osoittaa, että ohjelmisto, jota aiomme käyttää, ei käytä monia laitteita. Tällaisten laitteiden malleja ei tarvitse luoda.

Tietokonejärjestelmien simulaattorit: tuttu täyden alustan simulaattori ja tuntematon myötäpäivään ja jäljet

Useimmiten täyden alustan simulaattorit toteutetaan prosessorin käskytasolla (ISA, katso alla). edellinen artikkeli). Näin voit luoda itse simulaattorin suhteellisen nopeasti ja edullisesti. ISA-taso on myös hyvä, koska se pysyy enemmän tai vähemmän vakiona, toisin kuin esimerkiksi API/ABI-taso, joka vaihtuu useammin. Lisäksi käskytasolla toteutus mahdollistaa ns. muokkaamattoman binääriohjelmiston ajamisen, eli jo käännetyn koodin suorittamisen ilman muutoksia, täsmälleen sellaisena kuin sitä käytetään todellisessa laitteistossa. Toisin sanoen voit tehdä kopion ("vedos") kiintolevystäsi, määrittää sen mallin kuvana koko alustan simulaattorissa, ja voila! – Käyttöjärjestelmä ja muut ohjelmat ladataan simulaattoriin ilman lisätoimenpiteitä.

Simulaattorin suorituskyky

Tietokonejärjestelmien simulaattorit: tuttu täyden alustan simulaattori ja tuntematon myötäpäivään ja jäljet

Kuten edellä mainittiin, koko järjestelmän eli kaikkien sen laitteiden simulointi on melko hidasta. Jos toteutat kaiken tämän myös erittäin yksityiskohtaisella tasolla, esimerkiksi mikroarkkitehtonisesti tai loogisesti, toteutus hidastuu erittäin hitaasti. Mutta käskytaso on sopiva valinta ja mahdollistaa käyttöjärjestelmän ja ohjelmien suorittamisen riittävällä nopeudella, jotta käyttäjä voi olla vuorovaikutuksessa niiden kanssa mukavasti.

Tässä olisi aiheellista käsitellä simulaattorin suorituskykyä. Se mitataan yleensä IPS:nä (käskyä sekunnissa), tarkemmin sanottuna MIPS:nä (milj. IPS), eli simulaattorin yhdessä sekunnissa suorittamien prosessorikäskyjen lukumääränä. Samanaikaisesti simulaation nopeus riippuu myös sen järjestelmän suorituskyvystä, jolla simulaatio itse toimii. Siksi saattaa olla oikeampaa puhua simulaattorin "hidastuksesta" verrattuna alkuperäiseen järjestelmään.

Markkinoiden yleisimmät täyden alustan simulaattorit, kuten QEMU, VirtualBox tai VmWare Workstation, ovat suorituskykyisiä. Käyttäjä ei ehkä edes huomaa, että simulaattorissa työskennellään. Tämä tapahtuu prosessoreihin toteutettujen erityisten virtualisointiominaisuuksien, binäärikäännösalgoritmien ja muiden mielenkiintoisten asioiden ansiosta. Tämä kaikki on erillisen artikkelin aihe, mutta lyhyesti sanottuna virtualisointi on nykyaikaisten prosessorien laitteistoominaisuus, jonka avulla simulaattorit eivät simuloi käskyjä, vaan lähettävät ne suoritettaviksi suoraan oikealle prosessorille, jos tietysti Simulaattori ja prosessori ovat samanlaisia. Binäärikäännös on vieraskonekoodin kääntäminen isäntäkoodiksi ja sen jälkeinen suorittaminen todellisessa prosessorissa. Tämän seurauksena simulaatio on vain hieman hitaampi, 5-10 kertaa, ja usein jopa toimii samalla nopeudella kuin todellinen järjestelmä. Vaikka tähän vaikuttaa monet tekijät. Jos esimerkiksi haluamme simuloida järjestelmää, jossa on useita kymmeniä prosessoreita, nopeus putoaa välittömästi nämä useita kymmeniä kertoja. Toisaalta Simicsin kaltaiset simulaattorit uusimmissa versioissa tukevat moniprosessorin isäntälaitteistoa ja rinnastavat simuloidut ytimet tehokkaasti todellisen prosessorin ytimiin.

Jos puhumme mikroarkkitehtonisen simulaation nopeudesta, niin se on yleensä useita suuruusluokkia, noin 1000-10000 kertaa hitaampi kuin suoritus tavallisella tietokoneella ilman simulaatiota. Ja toteutukset loogisten elementtien tasolla ovat useiden suuruusluokkien hitaampia. Siksi FPGA:ta käytetään emulaattorina tällä tasolla, mikä voi parantaa merkittävästi suorituskykyä.

Alla oleva kaavio näyttää simulointinopeuden likimääräisen riippuvuuden mallin yksityiskohdista.

Tietokonejärjestelmien simulaattorit: tuttu täyden alustan simulaattori ja tuntematon myötäpäivään ja jäljet

Beat-by-by-simulaatio

Alhaisesta suoritusnopeudestaan ​​huolimatta mikroarkkitehtuurisimulaattorit ovat melko yleisiä. Prosessorin sisäisten lohkojen simulointi on tarpeen, jotta kunkin käskyn suoritusaika voidaan simuloida tarkasti. Tässä voi syntyä väärinkäsityksiä - loppujen lopuksi näyttää siltä, ​​miksi ei yksinkertaisesti ohjelmoida kunkin käskyn suoritusaika. Mutta tällainen simulaattori on erittäin epätarkka, koska saman käskyn suoritusaika voi vaihdella puhelusta toiseen.

Yksinkertaisin esimerkki on muistin käyttöohje. Jos pyydetty muistipaikka on käytettävissä välimuistissa, suoritusaika on minimaalinen. Jos nämä tiedot eivät ole välimuistissa ("cache miss"), tämä pidentää huomattavasti käskyn suoritusaikaa. Näin ollen tarkkaa simulointia varten tarvitaan välimuistimalli. Asia ei kuitenkaan rajoitu välimuistimalliin. Prosessori ei vain odota tietojen hakemista muistista, kun se ei ole välimuistissa. Sen sijaan se alkaa suorittaa seuraavat käskyt ja valitsee ne, jotka eivät riipu muistista lukemisen tuloksesta. Tämä on niin kutsuttu "poissa järjestyksessä" -suoritus (OOO, out of order execution), joka on tarpeen prosessorin joutoajan minimoimiseksi. Vastaavien prosessorilohkojen mallintaminen auttaa ottamaan kaiken tämän huomioon ohjeiden suoritusaikaa laskettaessa. Näiden käskyjen joukossa, jotka suoritetaan, kun muistista lukemisen tulosta odotetaan, voi tapahtua ehdollinen hyppytoiminto. Jos ehdon tulos on tällä hetkellä tuntematon, niin prosessori ei taaskaan lopeta suoritusta, vaan tekee "arvauksen", suorittaa sopivan haaran ja jatkaa ennakoivasti käskyjen suorittamista siirtymäkohdasta. Tällainen lohko, jota kutsutaan haaran ennustajaksi, on myös toteutettava mikroarkkitehtuurisimulaattorissa.

Alla oleva kuva näyttää prosessorin päälohkot, sitä ei tarvitse tietää, se näytetään vain mikroarkkitehtonisen toteutuksen monimutkaisuuden osoittamiseksi.

Tietokonejärjestelmien simulaattorit: tuttu täyden alustan simulaattori ja tuntematon myötäpäivään ja jäljet

Kaikkien näiden lohkojen toiminta todellisessa prosessorissa synkronoidaan erityisillä kellosignaaleilla, ja sama tapahtuu mallissa. Tällaista mikroarkkitehtonista simulaattoria kutsutaan syklin tarkaksi. Sen päätarkoituksena on ennustaa tarkasti kehitettävän prosessorin suorituskyky ja/tai laskea tietyn ohjelman, esimerkiksi vertailuarvon, suoritusaika. Jos arvot ovat vaadittua pienempiä, on tarpeen muokata algoritmeja ja prosessorilohkoja tai optimoida ohjelma.

Kuten yllä näkyy, kello-kello-simulointi on erittäin hidasta, joten sitä käytetään vain tutkittaessa tiettyjä ohjelman toiminnan hetkiä, joissa on tarpeen selvittää ohjelman todellinen suoritusnopeus ja arvioida laitteen tulevaa suorituskykyä. prototyyppiä simuloidaan.

Tässä tapauksessa toiminnallista simulaattoria käytetään simuloimaan ohjelman jäljellä olevaa ajoaikaa. Miten tämä käyttöyhdistelmä tapahtuu todellisuudessa? Ensin käynnistetään toiminnallinen simulaattori, johon ladataan käyttöjärjestelmä ja kaikki tutkittavan ohjelman suorittamiseen tarvittava. Loppujen lopuksi emme ole kiinnostuneita itse käyttöjärjestelmästä, emmekä ohjelman käynnistämisen alkuvaiheista, sen määrityksistä jne. Emme kuitenkaan voi myöskään ohittaa näitä osia ja siirtyä välittömästi ohjelman suorittamiseen keskeltä. Siksi kaikki nämä alustavat vaiheet ajetaan toiminnallisella simulaattorilla. Kun ohjelma on suoritettu meitä kiinnostavaan hetkeen, on kaksi vaihtoehtoa mahdollista. Voit korvata mallin kello jaksoittain mallilla ja jatkaa suorittamista. Suoritettavaa koodia (eli tavallisia käännettyjä ohjelmatiedostoja) käyttävää simulointitilaa kutsutaan suoritusohjatuksi simulaatioksi. Tämä on yleisin simulointivaihtoehto. Toinen lähestymistapa on myös mahdollinen - jäljitetty simulointi.

Jäljitykseen perustuva simulointi

Se koostuu kahdesta vaiheesta. Toiminnallisen simulaattorin avulla tai todellisessa järjestelmässä ohjelman toimien loki kerätään ja kirjoitetaan tiedostoon. Tätä lokia kutsutaan jäljeksi. Riippuen siitä, mitä tutkitaan, jäljitys voi sisältää suoritettavia ohjeita, muistiosoitteita, porttinumeroita ja keskeytystietoja.

Seuraava askel on jäljityksen "toistaminen", kun kello-kello-simulaattori lukee jäljen ja suorittaa kaikki siihen kirjoitetut ohjeet. Lopuksi saamme tämän ohjelman osan suoritusajan sekä tämän prosessin erilaisia ​​ominaisuuksia, esimerkiksi välimuistin osumien prosenttiosuuden.

Tärkeä piirre jälkien kanssa työskentelyssä on determinismi, eli suorittamalla simulaatio edellä kuvatulla tavalla toistetaan yhä uudelleen ja uudelleen sama toimintosarja. Tämä mahdollistaa malliparametreja (välimuisti-, puskuri- ja jonokokoja) muuttamalla ja erilaisia ​​sisäisiä algoritmeja käyttämällä tai niitä virittäen tutkimalla, miten tietty parametri vaikuttaa järjestelmän suorituskykyyn ja mikä vaihtoehto tuottaa parhaat tulokset. Kaikki tämä voidaan tehdä prototyypin laitemallilla ennen varsinaisen laitteistoprototyypin luomista.

Tämän lähestymistavan monimutkaisuus johtuu tarpeesta ensin suorittaa sovellus ja kerätä jäljitys sekä jäljitystiedoston valtava koko. Etuna on se, että riittää simuloida vain se osa laitteesta tai alustasta, joka kiinnostaa, kun taas suorituksella tapahtuva simulointi vaatii yleensä täydellisen mallin.

Joten tässä artikkelissa tarkastelimme koko alustan simuloinnin ominaisuuksia, puhuimme toteutusten nopeudesta eri tasoilla, kello-syklistä simulaatiosta ja jäljistä. Seuraavassa artikkelissa kuvaan tärkeimmät skenaariot simulaattoreiden käyttöön niin henkilökohtaisiin tarkoituksiin kuin kehitysnäkökulmasta suurissa yrityksissä.

Lähde: will.com

Lisää kommentti