Simulátory počítačových systémov: známy plnoplatformový simulátor a neznámy v smere hodinových ručičiek a stopy

V druhej časti článku o simulátoroch počítačových systémov budem pokračovať v jednoduchej úvodnej forme o počítačových simulátoroch, a to o celoplatformovej simulácii, s ktorou sa bežný používateľ najčastejšie stretáva, ako aj o clock-by -hodinový model a stopy, ktoré sú bežnejšie v kruhoch vývojárov.

Simulátory počítačových systémov: známy plnoplatformový simulátor a neznámy v smere hodinových ručičiek a stopy

В prvá časť Hovoril som o tom, čo sú simulátory vo všeobecnosti, ako aj o úrovniach simulácie. Teraz, na základe týchto poznatkov, navrhujem ponoriť sa trochu hlbšie a hovoriť o simulácii na plnej platforme, o tom, ako zbierať stopy, čo s nimi robiť neskôr, ako aj o mikroarchitektonickej emulácii clock-by-clock.

Simulátor plnej platformy alebo „Sám v poli nie je bojovník“

Ak chcete študovať fungovanie jedného konkrétneho zariadenia, napríklad sieťovej karty, alebo napísať firmvér alebo ovládač pre toto zariadenie, potom je možné takéto zariadenie simulovať samostatne. Jeho používanie v izolácii od zvyšku infraštruktúry však nie je príliš pohodlné. Na spustenie príslušného ovládača budete potrebovať centrálny procesor, pamäť, prístup k dátovej zbernici atď. Okrem toho ovládač vyžaduje na fungovanie operačný systém (OS) a sieťový zásobník. Okrem toho môže byť potrebný samostatný generátor paketov a server odpovedí.

Plnoplatformový simulátor vytvára prostredie pre spustenie kompletného softvérového zásobníka, ktorý zahŕňa všetko od systému BIOS a zavádzača až po samotný OS a jeho rôzne podsystémy, ako je rovnaký sieťový zásobník, ovládače a aplikácie na úrovni používateľa. Na tento účel implementuje softvérové ​​modely väčšiny počítačových zariadení: procesor a pamäť, disk, vstupno/výstupné zariadenia (klávesnica, myš, displej), ako aj rovnakú sieťovú kartu.

Nižšie je bloková schéma čipovej sady x58 od spoločnosti Intel. Plnoplatformový počítačový simulátor na tejto čipovej sade vyžaduje implementáciu väčšiny uvedených zariadení, vrátane zariadení vo vnútri IOH (Input/Output Hub) a ICH (Input/Output Controller Hub), ktoré nie sú podrobne znázornené na blokovej schéme . Aj keď, ako ukazuje prax, nie je veľa zariadení, ktoré softvér, ktorý sa chystáme spustiť, nepoužíva. Modely takýchto zariadení nie je potrebné vytvárať.

Simulátory počítačových systémov: známy plnoplatformový simulátor a neznámy v smere hodinových ručičiek a stopy

Plnoplatformové simulátory sú najčastejšie implementované na úrovni inštrukcií procesora (ISA, pozri nižšie). predchádzajúci článok). To vám umožní vytvoriť samotný simulátor pomerne rýchlo a lacno. Úroveň ISA je dobrá aj preto, že zostáva viac-menej konštantná, na rozdiel napríklad od úrovne API/ABI, ktorá sa mení častejšie. Navyše implementácia na úrovni inštrukcií umožňuje spúšťať takzvaný neupravený binárny softvér, teda spúšťať už skompilovaný kód bez akýchkoľvek zmien, presne tak, ako sa používa na skutočnom hardvéri. Inými slovami, môžete si vytvoriť kópiu („dump“) svojho pevného disku, zadať ho ako obrázok pre model v simulátore plnej platformy a voila! – OS a ďalšie programy sa načítajú do simulátora bez akýchkoľvek ďalších akcií.

Výkon simulátora

Simulátory počítačových systémov: známy plnoplatformový simulátor a neznámy v smere hodinových ručičiek a stopy

Ako už bolo spomenuté vyššie, proces simulácie celého systému, teda všetkých jeho zariadení, je dosť pomalý. Ak to všetko implementujete aj na veľmi podrobnej úrovni, napríklad mikroarchitektonickej alebo logickej, potom bude vykonávanie extrémne pomalé. Úroveň pokynov je však vhodnou voľbou a umožňuje operačnému systému a programom vykonávať sa rýchlosťou dostatočnou na to, aby s nimi používateľ mohol pohodlne pracovať.

Tu by bolo vhodné dotknúť sa témy výkonu simulátora. Zvyčajne sa meria v IPS (inštrukciách za sekundu), presnejšie v MIPS (milióny IPS), teda v počte inštrukcií procesora vykonaných simulátorom za jednu sekundu. Rýchlosť simulácie zároveň závisí aj od výkonu systému, na ktorom samotná simulácia beží. Preto môže byť správnejšie hovoriť o „spomalení“ simulátora v porovnaní s pôvodným systémom.

Najbežnejšie plnoplatformové simulátory na trhu ako QEMU, VirtualBox alebo VmWare Workstation majú dobrý výkon. Používateľ si ani nemusí všimnúť, že v simulátore prebieha práca. Deje sa tak vďaka špeciálnym virtualizačným schopnostiam implementovaným v procesoroch, binárnym prekladovým algoritmom a ďalším zaujímavým veciam. Toto všetko je téma na samostatný článok, no v skratke, virtualizácia je hardvérová vlastnosť moderných procesorov, ktorá umožňuje simulátorom nesimulovať inštrukcie, ale posielať ich na vykonanie priamo skutočnému procesoru, ak, samozrejme, architektúry napr. simulátor a procesor sú podobné. Binárny preklad je preklad strojového kódu hosťa do kódu hostiteľa a následné spustenie na skutočnom procesore. V dôsledku toho je simulácia len o niečo pomalšia, 5-10 krát a často dokonca beží rovnakou rýchlosťou ako skutočný systém. Aj keď je to ovplyvnené mnohými faktormi. Napríklad, ak chceme simulovať systém s niekoľkými desiatkami procesorov, rýchlosť okamžite klesne o niekoľko desiatok krát. Na druhej strane simulátory ako Simics v najnovších verziách podporujú viacprocesorový hostiteľský hardvér a efektívne paralelizujú simulované jadrá na jadrá skutočného procesora.

Ak hovoríme o rýchlosti mikroarchitektonickej simulácie, potom je zvyčajne o niekoľko rádov, asi 1000-10000 krát pomalšia ako vykonávanie na bežnom počítači, bez simulácie. A implementácie na úrovni logických prvkov sú pomalšie o niekoľko rádov. Preto sa na tejto úrovni používa ako emulátor FPGA, ktorý môže výrazne zvýšiť výkon.

Nižšie uvedený graf ukazuje približnú závislosť rýchlosti simulácie od detailu modelu.

Simulátory počítačových systémov: známy plnoplatformový simulátor a neznámy v smere hodinových ručičiek a stopy

Simulácia po rytme

Napriek nízkej rýchlosti vykonávania sú mikroarchitektonické simulátory pomerne bežné. Simulácia vnútorných blokov procesora je potrebná na presné simulovanie času vykonávania každej inštrukcie. Tu môže dôjsť k nedorozumeniu - napokon, zdá sa, prečo jednoducho nenaprogramovať čas vykonania každej inštrukcie. Ale takýto simulátor bude veľmi nepresný, pretože čas vykonania tej istej inštrukcie sa môže líšiť od hovoru k hovoru.

Najjednoduchším príkladom je inštrukcia prístupu do pamäte. Ak je požadované miesto v pamäti dostupné vo vyrovnávacej pamäti, čas vykonania bude minimálny. Ak tieto informácie nie sú vo vyrovnávacej pamäti („cache miss“), výrazne to predĺži čas vykonania inštrukcie. Pre presnú simuláciu je teda potrebný model vyrovnávacej pamäte. Záležitosť sa však neobmedzuje len na model vyrovnávacej pamäte. Procesor nebude jednoducho čakať na načítanie údajov z pamäte, keď nie sú vo vyrovnávacej pamäti. Namiesto toho začne vykonávať ďalšie inštrukcie, pričom vyberie tie, ktoré nezávisia od výsledku čítania z pamäte. Ide o takzvané spustenie „mimo poradia“ (OOO, spustenie mimo poradia), ktoré je potrebné na minimalizáciu času nečinnosti procesora. Modelovanie zodpovedajúcich blokov procesora pomôže toto všetko zohľadniť pri výpočte času vykonávania pokynov. Medzi týmito pokynmi, ktoré sa vykonávajú počas čakania na výsledok čítania z pamäte, sa môže vyskytnúť operácia podmieneného skoku. Ak je výsledok podmienky momentálne neznámy, procesor opäť nezastaví vykonávanie, ale urobí „hádanie“, vykoná príslušnú vetvu a pokračuje v proaktívne vykonávaní pokynov od bodu prechodu. Takýto blok, nazývaný prediktor vetvy, musí byť tiež implementovaný v mikroarchitektonickom simulátore.

Na obrázku nižšie sú zobrazené hlavné bloky procesora, nie je potrebné ho poznať, je znázornený len na znázornenie zložitosti mikroarchitektonickej implementácie.

Simulátory počítačových systémov: známy plnoplatformový simulátor a neznámy v smere hodinových ručičiek a stopy

Činnosť všetkých týchto blokov v reálnom procesore je synchronizovaná špeciálnymi hodinovými signálmi a to isté sa deje aj v modeli. Takýto mikroarchitektonický simulátor sa nazýva cyklicky presný. Jeho hlavným účelom je presne predpovedať výkon vyvíjaného procesora a/alebo vypočítať čas vykonávania konkrétneho programu, napríklad benchmarku. Ak sú hodnoty nižšie, ako je požadované, bude potrebné upraviť algoritmy a bloky procesora alebo optimalizovať program.

Ako je uvedené vyššie, hodinová simulácia je veľmi pomalá, preto sa využíva len pri štúdiu určitých momentov činnosti programu, kde je potrebné zistiť skutočnú rýchlosť vykonávania programu a vyhodnotiť budúci výkon zariadenia, ktorého prototyp sa simuluje.

V tomto prípade sa na simuláciu zostávajúceho času chodu programu používa funkčný simulátor. Ako k tejto kombinácii použitia v skutočnosti dochádza? Najprv sa spustí funkčný simulátor, na ktorý sa načíta OS a všetko potrebné na spustenie študovaného programu. Koniec koncov, nemáme záujem o samotný OS, ani o počiatočné fázy spustenia programu, jeho konfiguráciu atď. Tieto časti však tiež nemôžeme preskočiť a okamžite prejsť na vykonávanie programu od stredu. Preto všetky tieto predbežné kroky prebiehajú na funkčnom simulátore. Po vykonaní programu do momentu, ktorý nás zaujíma, sú možné dve možnosti. Model môžete nahradiť modelom s hodinovým cyklom a pokračovať vo vykonávaní. Simulačný režim, ktorý používa spustiteľný kód (tj bežné kompilované programové súbory), sa nazýva simulácia riadená vykonávaním. Toto je najbežnejšia možnosť simulácie. Je možný aj iný prístup – simulácia riadená stopou.

Simulácia založená na stopách

Pozostáva z dvoch krokov. Pomocou funkčného simulátora alebo na skutočnom systéme sa zhromažďuje protokol akcií programu a zapisuje sa do súboru. Tento protokol sa nazýva stopa. V závislosti od toho, čo sa skúma, môže sledovanie zahŕňať spustiteľné inštrukcie, adresy pamäte, čísla portov a informácie o prerušení.

Ďalším krokom je „prehranie“ stopy, keď simulátor clock-by-clock prečíta stopu a vykoná všetky inštrukcie v nej zapísané. Na konci získame čas vykonania tejto časti programu, ako aj rôzne charakteristiky tohto procesu, napríklad percento zásahov do vyrovnávacej pamäte.

Dôležitou črtou práce so stopami je determinizmus, to znamená, že spustením simulácie vyššie opísaným spôsobom znova a znova reprodukujeme rovnakú postupnosť akcií. To umožňuje zmenou parametrov modelu (veľkosť vyrovnávacej pamäte, vyrovnávacej pamäte a frontu) a použitím rôznych interných algoritmov alebo ich ladením študovať, ako konkrétny parameter ovplyvňuje výkon systému a ktorá možnosť poskytuje najlepšie výsledky. To všetko sa dá urobiť s prototypovým modelom zariadenia pred vytvorením skutočného prototypu hardvéru.

Zložitosť tohto prístupu spočíva v potrebe najprv spustiť aplikáciu a zhromaždiť stopu, ako aj v obrovskej veľkosti súboru sledovania. Medzi výhody patrí skutočnosť, že stačí simulovať iba časť zariadenia alebo platformy, o ktorú je záujem, pričom simulácia vykonávaním zvyčajne vyžaduje kompletný model.

V tomto článku sme sa teda pozreli na funkcie simulácie na plnej platforme, hovorili sme o rýchlosti implementácií na rôznych úrovniach, simulácii hodín po cykle a stopách. V ďalšom článku popíšem hlavné scenáre využitia simulátorov ako pre osobné účely, tak aj z pohľadu vývoja vo veľkých spoločnostiach.

Zdroj: hab.com

Pridať komentár