Emulace ( anglicky emulation ) ve výpočetní technice je komplex softwaru, hardwaru nebo jejich kombinace, určený ke kopírování (nebo emulaci ) funkcí jednoho výpočetního systému ( host ) do jiného, odlišného od prvního výpočetního systému ( hostitele ) v takovým způsobem, aby se emulované chování co nejvíce shodovalo s chováním původního systému ( host ). Cílem je co nejpřesněji reprodukovat chování, na rozdíl od různých forem počítačové simulace , které napodobují chování nějakého abstraktního modelu. Například simulace hurikánu nebo chemické reakce není emulace.
Emulace se týká schopnosti počítačového programu v jednom zařízení emulovat ( simulovat ) jiný program nebo zařízení. Mnoho tiskáren je například navrženo tak, aby emulovaly tiskárny HP Laserjet , protože pro tyto tiskárny je k dispozici velké množství softwaru. Pokud tiskárna jiného výrobce než HP emuluje tiskárnu HP, pak jakýkoli program určený pro tiskárny HP bude schopen pracovat s tiskárnou jiného výrobce a produkovat identický výstup.
Hardwarovou emulaci představují emulátory vyrobené jako samostatné zařízení. Například přídavné karty kompatibilní se systémem DOS, jako jsou Centris 610 a Performa 630, které byly nainstalovány v některých počítačích Macintosh , aby umožňovaly spouštění programů DOS z počítače . Dalším příkladem jsou hardwarové emulátory založené na FPGA .
Teoreticky lze podle Church-Turingovy teze emulovat jakékoli operační prostředí na jiném. V praxi je to však často extrémně obtížné, protože přesné chování emulovaného systému není zdokumentováno a lze jej určit pouze pomocí reverzního inženýrství. Práce také neříká, že pokud je výkon emulace nižší než u původního systému, pak emulovaný software poběží výrazně pomaleji, než by měl na původním hardwaru, s možným výskytem zasekávání emulace nebo nestabilního výkonu.
Emulace je jedním ze způsobů, jak elektronicky archivovat stárnoucí výpočetní systémy. V této interpretaci je cílem emulace věrně reprodukovat původní digitální prostředí, což může být obtížné a časově náročné, ale je cenné kvůli možnosti dosáhnout úzkého vztahu s autentickým digitálním objektem [1] .
Emulace řeší hardwarové a softwarové prostředí původního digitálního zařízení a znovu je vytváří na moderním stroji [2] . Emulace umožňuje uživateli přístup k jakémukoli typu aplikačního softwaru nebo operačních systémů na moderní platformě, přičemž software běží stejně jako v původním prostředí [3] . Jeffrey Rothenberg, jeden z prvních zastánců použití emulace pro elektronickou archivaci, věří, že „ideálem by bylo jediné rozšiřitelné dlouhodobé řešení, které by bylo možné vyvinout jednou provždy a bylo by aplikováno jednotně, automaticky a synchronně ( například každý aktualizační cyklus) na všechny typy dokumentů a médií“ [4] . Dále poznamenává, že toto řešení by se nemělo týkat pouze starších systémů, ale mělo by být také snadno přenositelné na dosud neznámé budoucí systémy [5] . V praxi, pokud je vydána nová verze aplikace za účelem zajištění kompatibility a migrace všech jejích komponent, je nutné pro tuto aplikaci vytvořit emulátor, který zajistí přístup ke všem zmíněným komponentám.
Vzhledem k tomu , že mediální umění je vytvářeno převážně v digitálním formátu, je pro něj emulace mimořádně důležitá jako prostředek elektronické archivace. Osobnosti jako Cory Arcangel obnovují zastaralé technologie a využívají je ve své práci, přičemž oceňují význam decentralizovaného a neformálního procesu pro zachování digitální kultury.
Emulace se v mediálním umění často používá jako prostředek k uchování digitálních informací, které budou později reprodukovány beze změny, bez ohledu na vybavení, které podléhá stárnutí a zastarávání. Paradoxem je, že emulace a emulátory musí být vytvořeny tak, aby běžely na strojích budoucnosti [11] .
Různé typy emulace jsou široce používány při vývoji a návrhu nových systémů. Emulace zjednodušuje vývoj tím, že umožňuje identifikovat, prozkoumat a opravit nedostatky návrhu před fyzickou implementací [12] . Emulace je užitečná zejména při vývoji vícejádrových systémů, ve kterých je často poměrně obtížné identifikovat a diagnostikovat konflikty paralelního zpracování bez použití virtuálního řízeného hardwaru dostupného s emulací [13] . Emulace také umožňuje začít vyvíjet software ještě před samotnou výrobou hardwaru [14] , čímž se zkontrolují vlastnosti, které jsou mu vlastní.
Většina existujících emulátorů hraje pouze . Pokud je tedy vyžadován operační systém uložený v ROM nebo jiný software, je třeba jej získat dodatečně (lze jej však také emulovat). Operační systém i software budou v budoucnu emulátorem interpretovány stejným způsobem jako na původním hardwaru. Kromě interpretu emulovaných binárních strojových kódů musí být emulována i některá další zařízení (například vstupní a výstupní zařízení). Pokud by například zápis do určité oblasti paměti měl něco zobrazit na obrazovce, toto chování by mělo být také emulováno.
V limitu by měl emulátor vycházet z modelu vytvořeného na základě parametrů a vlastností původního návrhu obvodu včetně virtuálního napájecího zdroje, ale v praxi by se jednalo o výjimečné řešení. Emulátory zpravidla vycházejí z modelu postaveného na dostupné dokumentaci a logickém schématu zařízení. Pro emulaci některých systémů je důležitá vysoká přesnost emulace, až po rychlost hodin jednotlivých prvků, nezdokumentované funkce, nepředvídatelné analogové komponenty a chyby. To je zvláště důležité při implementaci emulátorů klasických domácích počítačů, jako je Commodore 64 , programy, pro které často používají sofistikované nízkoúrovňové programovací techniky vyvinuté tvůrci hry a demoscénou .
Některá jiná zařízení měla naopak velmi omezený přímý přístup k hardwaru. V případech, jako je tento, může stačit jednoduchá vrstva kompatibility. Systémové požadavky emulovaného programu jsou přeloženy do systémových požadavků hostitele, to znamená, že systémy FreeBSD , NetBSD a OpenBSD používají vrstvu kompatibility s Linuxem ke spouštění linuxových aplikací s uzavřeným zdrojovým kódem. Například GPU Nintenda 64 bylo plně programovatelné a většina herních vývojářů používala vestavěné tovární programy, které byly samostatné a komunikovaly s hrou přes vyrovnávací paměť FIFO . Proto mnoho emulátorů vůbec neemuluje GPU, místo toho interpretuje příkazy CPU stejným způsobem jako původní program.
Vývojáři programů pro vestavěné systémy a herní konzole často staví své produkty na vysoce přesných emulátorech zvaných simulátory , než je spustí na fyzickém hardwaru. To se provádí proto, aby bylo možné vytvářet a testovat před vydáním konečné revize hardwaru a také proto, aby bylo možné rychle ladit program bez plýtvání časem na kopírování a zavádění vedlejších efektů ladicího programu . V mnoha případech je simulátor postaven a poskytnut výrobcem hardwaru, což by teoreticky mělo zvýšit jeho přesnost.
Emulace matematického koprocesoru se používá ke spouštění programů kompilovaných s matematickými instrukcemi na počítačích bez nainstalovaného koprocesoru, kde může extra zatížení CPU negativně ovlivnit výkon. Pokud koprocesor není nainstalován a není zabudován do CPU, při provádění matematické instrukce se zavolá přerušení (bez koprocesoru), čímž se spustí podprogram matematického emulátoru. Po úspěšném provedení instrukce je řízení vráceno programu.
Emulátor se zpravidla skládá z několika modulů , z nichž každý odpovídá samostatnému emulovanému subsystému původního zařízení. V nejobecnějším případě se emulátor skládá z následujících bloků:
Systémové sběrnice se obvykle neemulují, aby se zjednodušila emulace a zvýšil výkon. Místo toho virtuální periferie komunikují přímo s procesorem nebo paměťovým subsystémem.
Při emulaci je docela možné namapovat celý paměťový subsystém jako jednoduché pole, jehož každý prvek má velikost emulovaného slova. Tento přístup je však odsouzen k nezdaru, protože v tomto případě žádná adresa logické paměti nebude odpovídat fyzické paměti. To je nejvýraznější, když má původní hardware pokročilou správu paměti (v takovém případě musí být logika MMU implementována v modulu paměťového subsystému, buď jako samostatný modul, nebo jako součást virtuálního CPU).
Avšak i když emulované zařízení neobsahuje MMU, existují další faktory, které narušují rovnocennost logické a fyzické paměti: mnoho (pokud ne všechny) architektur má I/O porty mapované na RAM ; i ty, které je nemají, mají paměťové bloky mapované ROM . To znamená, že pole reprezentace paměti by se nemělo používat, pokud má být ROM emulována. Funkce jako přepínání bank nebo adresování segmentů mohou také ztížit emulaci paměti.
Výsledkem je, že většina emulátorů má alespoň dvě rutiny, jednu pro čtení z paměti a jednu pro zápis do paměti, které jsou zodpovědné za přístup ke správné oblasti správného objektu.
Pro emulující systémy s omezeným adresováním, kde jsou adresy paměti 0 až (velikost ROM) - 1 pouze pro čtení a všechny ostatní patří do RAM, je zcela typické něco jako následující.
void WriteMemory ( adresa slova , hodnota slova ) { wordRealAddress ; _ RealAddress = Address + BaseRegister ; if (( RealAddress < LimitRegister ) && ( RealAddress > ROMSIZE )) { Paměť [ RealAddress ] = Hodnota ; } jinak { RaiseInterrupt ( INT_SEGFAULT ); } } word ReadMemory ( word Address ) { wordRealAddress ; _ RealAddress = Address + BaseRegister ; if ( RealAddress < LimitRegister ) { return Memory [ RealAddress ]; } jinak { RaiseInterrupt ( INT_SEGFAULT ); vrátit NULL ; } }Modul CPU je zpravidla nejsložitější částí emulátoru. Mnoho emulátorů používá předpřipravené moduly CPU, aby se zaměřily na kvalitní a efektivní emulaci.
Interpret je nejjednodušší forma emulace CPU. Je to program, který sleduje tok provádění programu a pro každou strojovou instrukci, na kterou narazí, provádí operace sémanticky ekvivalentní původním instrukcím na hostitelském procesoru. To je možné přiřazením proměnných ke každému registru a příznaku emulovaného CPU. Logiku emulovaného CPU lze implementovat s větší či menší složitostí v programovém algoritmu, čímž se vytvoří softwarová implementace, která více či méně zrcadlí původní hardware.
Následující příklad ukazuje, jak lze CPU emulovat pomocí interpretru. V tomto příkladu jsou přerušení dotazována před provedením instrukce, nicméně kvůli nízkému výkonu se tato metoda ve stávajících emulátorech používá jen zřídka (obecně je rychlejší použít podprogram, který funguje jako přerušení).
void Execute ( void ) { if ( Přerušit != INT_NONE ) { SuperUser = TRUE ; WriteMemory ( ++ StackPointer , ProgramCounter ); ProgramCounter = Ukazatel přerušení ; } switch ( ReadMemory ( ProgramCounter ++ )) { /* * Zpracování každého platného pokynu * zde... */ výchozí : Přerušení = INT_ILEGAL ; } }Interprety jsou velmi oblíbené pro simulaci počítačů, protože jejich implementace je mnohem jednodušší než jiná výkonově vítězná řešení, protože jejich rychlost je často dostatečná k emulaci počítačů, které jsou doslova o deset let starší než moderní stroje.
Použití interpretace s inherentní penalizací za výkon však může být problém, když chcete emulovat počítač s procesorem, který je o řád rychlejší než hostitelský procesor. Donedávna byla emulace v takových případech mnohými považována za zbytečnost.
Pokroky v technikách dynamické kompilace pomohly překonat tato omezení. Jednoduchý překlad emulovaného programového kódu do kódu spustitelného na hostitelské architektuře je a priori nemožný z několika důvodů:
K překonání těchto problémů se používají různé triky, včetně známé „ kompilace za chodu “. Kompilátor čeká, dokud řídicí tok procesoru nevstoupí do oblasti obsahující nepřeložený kód. Teprve poté ("za běhu") je blok kódu přeložen do kódu, který lze spustit. Zpracovaný kód je umístěn do mezipaměti kódu , zatímco původní kód se nemění. V tomto případě budou i bloky dat podrobeny nesmyslnému překladu překladačem, jehož jediným efektem bude prodloužení času překladače.
V některých případech, například při spouštění starých her, nemusí být vysoká rychlost emulace žádoucí, protože hry byly vytvořeny bez ohledu na výkon budoucích počítačů. Ve hře určené pro PC s 30 MHz CPU může hráč dostat 300 herních sekund na herní úroveň, pokud stejná hra běží na PC s 300 MHz CPU, hráč bude mít 300 herních sekund rovných 30 skutečné sekundy. Jiné programy, například některé programy pro DOS, na rychlém počítači vůbec nepoběží. V praxi, pokud je emulován systém, který byl "černou skříňkou" bez očekávaných změn v jádře, programy mohou záviset na některých specifických hardwarových parametrech (například frekvenci CPU). Pro správnou emulaci takových aplikací je tedy zapotřebí velmi přesné řízení rychlosti emulace.
Jak již bylo uvedeno, systémové sběrnice jsou emulovány jen zřídka. Každé I/O zařízení je posuzováno samostatně, protože emulátor neimplementuje žádné univerzální rozhraní. Vzhledem k tomu, že každé I/O zařízení lze dokonale sladit s parametry emulovaného zařízení, vede to ke zvýšení výkonu. Řešení založená na standardizovaných jednotných API však mohou stále konkurovat zjednodušeným modelům, pokud jsou chytře implementována. Další výhodou bude „automaticky“ získaná pluginová služba, jejímž prostřednictvím mohou s emulátorem pracovat virtuální zařízení třetích stran. V unifikovaných I/O API není nutné opakovat celou strukturu sběrnice: její obvody jsou omezeny na několik elektronických součástek, takže v softwarové implementaci není nutné mít systém pro řešení konfliktů paralelních výpočtů.
I v emulátorech, které berou každé zařízení samostatně, je obvykle přítomna následující virtuální infrastruktura:
Slovo „emulátor“ bylo vytvořeno v IBM [15] při vývoji řady produktů NPL ( IBM System/360 ) využívajících „novou kombinaci softwaru, mikrokódu a hardwaru“ [16] . Zjistili, že pro spouštění programů napsaných pro starší stroje IBM bylo použití hardwarového mikrokódu mnohem produktivnější než softwarová simulace. Dříve, v roce 1957, IBM dodala softwarový interpret , aby bylo možné spouštět programy pro starší počítač IBM 704 na počítačích IBM 709 a IBM 7090 [17] . V roce 1964 inženýři IBM vymysleli slovo „emulace“, aby popsali koncept prvního použití mikrokódu k urychlení procesu simulace.
V poslední době se používání tohoto termínu stalo běžným v kontextu softwaru. Až do 80. let 20. století slovo „emulace“ označovalo výhradně hardwarovou implementaci pomocí mikrokódu, zatímco softwarová emulace byla označována jako „simulace“ [18] . Emulátorem byl například počítač speciálně navržený pro spouštění programů napsaných pro jinou architekturu. Na druhou stranu, simulátor by mohl být počítačový program, který by mohl simulovat staré hry Atari. Ačkoli puristé nadále poukazují na tento terminologický rozdíl, je nyní obecně přijímáno označovat emulaci jako úplnou simulaci stroje s binárním kódem, zatímco simulace v podstatě odkazuje na počítačovou simulaci , která pracuje na abstraktním modelu. Počítačové modelování se používá téměř v každé vědecké a inženýrské činnosti, včetně informatiky, která má mnoho aplikací pro práci s abstraktním modelem, jako je modelování komunikačních sítí.
Logická simulace je použití specifického softwaru k předpovídání chování digitálních obvodů a jazyků popisu hardwaru . Simulaci lze provádět na různých úrovních fyzické abstrakce: na úrovni tranzistoru , na úrovni logického hradla , na úrovni přenosu registru nebo na úrovni funkce. Modelování se provádí po vypracování schématu ve formě logických rovnic a před zahájením jeho fyzické výroby.
Funkční modelování je použití počítačového programu k simulaci provádění jiného počítačového programu napsaného v jazyce symbolických instrukcí nebo zdrojovém kódu , spíše než v binárním strojovém kódu . Pomocí funkčního modelování může programátor uvolnit a analyzovat práci vybrané části kódu, aby odhalil chyby (chyby), aniž by se musel uchýlit k získání binárního kódu. To se liší od spouštění binárního kódu, což je emulace.
První použití funkčního modelování provedla společnost Autonetics kolem roku 1960 k testování programů v jazyce symbolických instrukcí, které byly později spuštěny na vojenském vozidle D-17B. To umožnilo napsat, spustit a otestovat letový software před fyzickou výrobou výpočetního hardwaru D-17B. Stejná společnost později použila funkční simulaci k testování letového softwaru, který měl být provozován na D-37C.
Emulátor herní konzole je program, který umožňuje osobnímu počítači nebo herní konzoli emulovat jinou konzoli. Nejčastěji se používají ke spuštění starých her na PC nebo modernějších konzolích. Emulátory se také používají k vytváření amatérských překladů her, úprav her a také k vývoji obsahu vytvářeného uživateli, jako jsou ukázky a nové hry pro starší systémy. Internet hrál velkou roli v šíření tohoto typu emulace , protože většina (pokud ne všechny) emulátory nejsou dostupné v maloobchodních prodejnách. Některé z emulátorů vydaných v posledních dvou desetiletích jsou Dolphin , ZSNES , MAME , DeSmuME , ePSXe , Gens , VisualBoyAdvance , Jnes a Nestopia .
Emulátor terminálu je program pro moderní PC nebo jiné zařízení, který umožňuje interaktivní přístup k sálovému operačnímu systému nebo jinému hostitelskému systému, jako je HP-UX nebo OpenVMS . Terminály jako IBM 3270 a VT100 se dlouho nevyráběly . Místo toho používá program, který běží na moderním operačním systému, který napodobuje „hloupý“ terminál a je schopen zobrazovat grafické a textové prvky hostitelské aplikace, odesílat vstup z klávesnice a zpracovávat příkazy prostřednictvím příslušného terminálového protokolu. Některé z těchto emulátorů zahrnují aplikace pro Attachmate Reflection, IBM Personal Communications, virtuální stroj AlphaVM společnosti EmuVM, Stromasys CHARON-VAX/AXP a Micro Focus Rumba.