Arvutisüsteemide simulaatorid: tuttav täisplatvormi simulaator ja tundmatu riba ja jälg

Arvutisüsteemide simulaatoreid käsitleva artikli teises osas jätkan lihtsas sissejuhatavas vormis rääkimist arvutisimulaatoritest, nimelt täisplatvormi simulatsioonist, millega tavakasutaja kõige sagedamini kokku puutub, aga ka kellaajastust. -kella mudel ja jäljed, mis on arendusringkondades rohkem levinud.

Arvutisüsteemide simulaatorid: tuttav täisplatvormi simulaator ja tundmatu riba ja jälg

В Esimene osa Rääkisin sellest, mis simulaatorid üldiselt on, kui ka simulatsiooni tasemetest. Nüüd teen ettepaneku nende teadmiste põhjal sukelduda veidi sügavamale ja rääkida täisplatvormi simulatsioonist, jälgede kogumisest, mida nendega hiljem teha, samuti kella-kella mikroarhitektuursest emuleerimisest.

Täisplatvormi simulaator ehk "Üksinda põllul pole sõdalane"

Kui soovite uurida ühe konkreetse seadme, näiteks võrgukaardi, tööd või kirjutada selle seadme jaoks püsivara või draiveri, saab sellist seadet eraldi simuleerida. Selle muust infrastruktuurist eraldatuna kasutamine pole aga kuigi mugav. Vastava draiveri käivitamiseks vajate keskprotsessorit, mälu, juurdepääsu andmesiinile jne. Lisaks vajab draiver toimimiseks operatsioonisüsteemi (OS) ja võrgupinu. Lisaks võib vaja minna eraldi paketigeneraatorit ja vastuseserverit.

Täisplatvormi simulaator loob keskkonna tervikliku tarkvarapinu käitamiseks, mis hõlmab kõike alates BIOS-ist ja alglaadurist kuni operatsioonisüsteemi enda ja selle erinevate alamsüsteemideni, nagu sama võrgupinn, draiverid ja kasutajataseme rakendused. Selleks realiseerib enamiku arvutiseadmete tarkvaramudelid: protsessor ja mälu, ketas, sisend/väljundseadmed (klaviatuur, hiir, ekraan), samuti sama võrgukaart.

Allpool on Inteli x58 kiibistiku plokkskeem. Selle kiibistiku täisplatvormi arvutisimulaator nõuab enamiku loetletud seadmete rakendamist, sealhulgas need, mis asuvad IOH-s (sisend-/väljundjaoturis) ja ICH-s (sisend-/väljundkontrolleri jaotur), mida plokkskeemil pole üksikasjalikult kujutatud. . Kuigi, nagu näitab praktika, pole palju seadmeid, mida meie käitatav tarkvara ei kasuta. Selliste seadmete mudeleid pole vaja luua.

Arvutisüsteemide simulaatorid: tuttav täisplatvormi simulaator ja tundmatu riba ja jälg

Kõige sagedamini rakendatakse täisplatvormi simulaatoreid protsessori juhiste tasemel (ISA, vt allpool). eelmist artiklit). See võimaldab teil luua simulaatori ise suhteliselt kiiresti ja odavalt. ISA tase on hea ka seetõttu, et see jääb enam-vähem konstantseks, erinevalt näiteks API/ABI tasemest, mis muutub sagedamini. Lisaks võimaldab juurutamine käsutasandil käivitada nn modifitseerimata binaartarkvara ehk juba kompileeritud koodi ilma muudatusteta, täpselt nii, nagu seda päris riistvara puhul kasutatakse. Teisisõnu saate kõvakettast koopia teha, määrata selle täisplatvormi simulaatoris mudeli pildina ja voila! – OS ja muud programmid laaditakse simulaatorisse ilma lisatoiminguteta.

Simulaatori jõudlus

Arvutisüsteemide simulaatorid: tuttav täisplatvormi simulaator ja tundmatu riba ja jälg

Nagu eespool mainitud, on kogu süsteemi, st kõigi selle seadmete simuleerimine üsna aeglane ettevõtmine. Kui seda kõike rakendada ka väga detailsel, näiteks mikroarhitektuursel või loogilisel tasemel, muutub täitmine äärmiselt aeglaseks. Kuid juhiste tase on sobiv valik ja võimaldab OS-il ja programmidel käitada kiirusega, mis on piisav, et kasutaja saaks nendega mugavalt suhelda.

Siinkohal oleks paslik puudutada simulaatori jõudluse teemat. Tavaliselt mõõdetakse seda IPS-is (käske sekundis), täpsemalt MIPS-is (miljoneid IPS-i), see tähendab simulaatori poolt ühe sekundi jooksul sooritatud protsessorikäskude arvu. Samas sõltub simulatsiooni kiirus ka selle süsteemi jõudlusest, millel simulatsioon ise töötab. Seetõttu võib olla õigem rääkida simulaatori “aeglustumisest” võrreldes algse süsteemiga.

Turul levinuimad täisplatvormi simulaatorid, nagu QEMU, VirtualBox või VmWare Workstation, on hea jõudlusega. Kasutajale ei pruugi isegi märgata, et simulaatoris töö käib. See juhtub tänu spetsiaalsetele protsessorites rakendatud virtualiseerimisvõimalustele, binaarsetele tõlkealgoritmidele ja muule huvitavale. See kõik on eraldi artikli teema, kuid lühidalt öeldes on virtualiseerimine tänapäevaste protsessorite riistvaraline funktsioon, mis võimaldab simulaatoritel mitte simuleerida juhiseid, vaid saata need täitmiseks otse reaalsesse protsessorisse, kui loomulikult on simulaator ja protsessor on sarnased. Binaarne tõlge on külalismasina koodi tõlkimine hostkoodiks ja sellele järgnev täitmine reaalses protsessoris. Selle tulemusena on simulatsioon vaid veidi aeglasem, 5-10 korda, ja töötab sageli isegi sama kiirusega kui tegelik süsteem. Kuigi seda mõjutavad paljud tegurid. Näiteks kui tahame simuleerida mitmekümne protsessoriga süsteemi, siis kiirus langeb kohe need mitukümmend korda. Teisest küljest toetavad simulaatorid nagu Simics viimastes versioonides mitme protsessoriga hosti riistvara ja paralleelstavad simuleeritud tuumad tõhusalt reaalse protsessori tuumadega.

Kui rääkida mikroarhitektuurse simulatsiooni kiirusest, siis see on tavaliselt mitu suurusjärku, umbes 1000-10000 korda aeglasem kui tavaarvutis, ilma simulatsioonita. Ja teostused loogiliste elementide tasemel on mitme suurusjärgu võrra aeglasemad. Seetõttu kasutatakse sellel tasemel emulaatorina FPGA-d, mis võib jõudlust oluliselt suurendada.

Allolev graafik näitab simulatsiooni kiiruse ligikaudset sõltuvust mudeli detailidest.

Arvutisüsteemide simulaatorid: tuttav täisplatvormi simulaator ja tundmatu riba ja jälg

Löök-löögilt simulatsioon

Vaatamata väikesele täitmiskiirusele on mikroarhitektuursed simulaatorid üsna levinud. Protsessori sisemiste plokkide simuleerimine on vajalik iga käsu täitmise aja täpseks simuleerimiseks. Siin võib tekkida arusaamatus – lõppude lõpuks tundub, et miks mitte lihtsalt programmeerida iga käsu täitmise aeg. Kuid selline simulaator on väga ebatäpne, kuna sama käsu täitmise aeg võib kõnest kõneni erineda.

Lihtsaim näide on mälule juurdepääsu juhis. Kui soovitud mälukoht on vahemälus saadaval, on täitmisaeg minimaalne. Kui seda teavet vahemälus pole ("vahemälu puudu"), pikendab see oluliselt käsu täitmise aega. Seega on täpseks simulatsiooniks vaja vahemälumudelit. Asi ei piirdu aga vahemälumudeliga. Protsessor ei oota lihtsalt andmete mälust väljavõtmist, kui need pole vahemälus. Selle asemel hakkab see täitma järgmisi juhiseid, valides need, mis ei sõltu mälust lugemise tulemusest. See on niinimetatud "out of order" täitmine (OOO, out of order execution), mis on vajalik protsessori jõudeaja minimeerimiseks. Seda kõike aitab käskude täitmise aja arvutamisel arvesse võtta vastavate protsessoriplokkide modelleerimine. Nende käskude hulgas, mida täidetakse mälust lugemise tulemuse ootamise ajal, võib esineda tingimuslik hüppeoperatsioon. Kui tingimuse tulemus on hetkel teadmata, siis jällegi protsessor täitmist ei peata, vaid teeb “arvamise”, sooritab vastava haru ja jätkab ennetavalt käskude täitmist üleminekupunktist. Selline plokk, mida nimetatakse haru ennustajaks, tuleb rakendada ka mikroarhitektuuri simulaatoris.

Alloleval pildil on näha protsessori põhiplokid, seda pole vaja teada, see on näidatud ainult selleks, et näidata mikroarhitektuurse teostuse keerukust.

Arvutisüsteemide simulaatorid: tuttav täisplatvormi simulaator ja tundmatu riba ja jälg

Kõigi nende plokkide tööd reaalses protsessoris sünkroniseeritakse spetsiaalsete kellasignaalidega ja sama juhtub ka mudelis. Sellist mikroarhitektuurisimulaatorit nimetatakse tsüklitäpsuseks. Selle põhieesmärk on täpselt ennustada arendatava protsessori jõudlust ja/või arvutada välja konkreetse programmi, näiteks etalon, täitmisaeg. Kui väärtused on nõutust väiksemad, on vaja algoritme ja protsessoriplokke muuta või programmi optimeerida.

Nagu ülal näidatud, on kella-kella simulatsioon väga aeglane, seetõttu kasutatakse seda ainult programmi teatud tööhetkede uurimisel, kus on vaja välja selgitada programmi tegelik täitmise kiirus ja hinnata seadme tulevast jõudlust, prototüüpi simuleeritakse.

Sel juhul kasutatakse programmi järelejäänud tööaja simuleerimiseks funktsionaalset simulaatorit. Kuidas selline kasutuskombinatsioon tegelikkuses toimub? Kõigepealt käivitatakse funktsionaalne simulaator, millele laaditakse OS ja kõik uuritava programmi käitamiseks vajalik. Lõppude lõpuks ei huvita meid OS ise ega ka programmi käivitamise algstaadium, selle konfiguratsioon jne. Kuid me ei saa ka neid osi vahele jätta ja liikuda kohe programmi keskelt täitma. Seetõttu viiakse kõik need esialgsed sammud läbi funktsionaalse simulaatoriga. Pärast seda, kui programm on meid huvitava hetkeni täitnud, on võimalikud kaks võimalust. Saate mudeli asendada kella-tsükli mudeliga ja jätkata täitmist. Simulatsioonirežiimi, mis kasutab käivitatavat koodi (st tavalisi kompileeritud programmifaile), nimetatakse täitmispõhiseks simulatsiooniks. See on kõige levinum simulatsioonivalik. Võimalik on ka teine ​​lähenemine – jäljepõhine simulatsioon.

Jäljepõhine simulatsioon

See koosneb kahest etapist. Funktsionaalse simulaatori või reaalses süsteemis kogutakse programmi toimingute logi ja kirjutatakse see faili. Seda logi nimetatakse jäljeks. Sõltuvalt sellest, mida uuritakse, võib jälg sisaldada käivitatavaid käske, mäluaadresse, pordinumbreid ja katkestuse teavet.

Järgmine samm on jälje “mängimine”, kui kella-kella simulaator loeb jälge ja täidab kõik selles kirjas olevad juhised. Lõpus saame selle programmiosa täitmisaja ja ka selle protsessi erinevad omadused, näiteks vahemälus olevate tabamuste protsendi.

Jälgedega töötamise oluline tunnus on determinism, st simulatsiooni ülalkirjeldatud viisil käivitades reprodutseerime ikka ja jälle sama toimingute jada. See võimaldab mudeli parameetreid (vahemälu, puhvri ja järjekorra suurust) muutes ning erinevaid sisemisi algoritme kasutades või neid häälestades uurida, kuidas konkreetne parameeter mõjutab süsteemi jõudlust ja milline valik annab parima tulemuse. Kõike seda saab teha prototüübi seadmemudeliga enne tegeliku riistvara prototüübi loomist.

Selle lähenemisviisi keerukus seisneb vajaduses esmalt rakendus käivitada ja jälg koguda, samuti jälgimisfaili tohutus suuruses. Eeliste hulka kuulub asjaolu, et piisab vaid huvipakkuva seadme või platvormi osa simuleerimisest, samas kui simulatsiooni teostamine eeldab tavaliselt terviklikku mudelit.

Niisiis, selles artiklis vaatlesime täisplatvormi simulatsiooni funktsioone, rääkisime erinevatel tasanditel rakenduste kiirusest, kella-tsükli simulatsioonist ja jälgedest. Järgmises artiklis kirjeldan peamisi simulaatorite kasutamise stsenaariume nii isiklikuks otstarbeks kui ka arenduse seisukohalt suurettevõtetes.

Allikas: www.habr.com

Lisa kommentaar