View Full Version : [?ASSEMBLY?] Come funziona un emulatore di console?
Deep thought
28-12-2013, 15:52
Premetto che apro qui questa discussione e non nella sezione "emulazione" perché credo che riguardi più la programmazione che l'uso dei videogiochi.
La mia domanda è:
Qualcuno conosce i principi alla base di un emulatore? In giro ne esistono tantissimi ed emulano ogni tipo di macchina, dai computer che circolavano quando io non ero ancora nato (pascalina compresa) al Nintendo Wii; anzi, esistono addirittura emulatori per una certa console che girano su un'altra console, emulatori per PlayStation che funzionano su Android, eccetera.
Quello che vorrei sapere (forse solo per curiosità, ma magari potrebbe essere anche utile) è: come sono fatti questi emulatori? In linea di massima so che
emulano il bytecode eseguito da una macchina su un'altra che esegue bytecode diverso.
Ma questo, nella pratica, cosa significa? L'unica cosa che riesco a immaginare è questa (lo esprimo con un esempio): è come dire che se per il Nintendo DS il codice macchina '0101010111' vuol dire "muovi il personaggio di due pixel a destra e aggiorna lo schermo" e per Linux il codice '1011000111100' indica che ho premuto la freccia direzionale destra, l'emulatore è un programma che collega il codice di input della macchina ospite al codice output della console emulata.
Fino a che punto può essere giusta questa mia interpretazione? C'è qui qualcuno che ha preso parte o partecipa adesso a un progetto di sviluppo di un emulatore?
E nella pratica, quanto è difficile - e lungo - applicare questi concetti? Che competenze sono necessarie? Sapendo che bisogna avere a che fare con linguaggio macchina, immagino che sia necessario conoscere linguaggi di basso livello come Assembly, o magari C, o almeno C++, che sembra in grado di fare di tutto in ogni ambito.
Sempre nella pratica, sapete quante persone di solito si affaticano per un singolo progetto del genere, e quanto tempo impiegano? Ci sono facilitazioni nell'inizio dello sviluppo (vale a dire, più o meno una persona che comincia da zero lo sviluppo per una nuova console sa da dove cominciare o le cose funzionano in modo completamente diverso da macchina a macchina, e si brancola nel buio fino a trovare un appiglio)?
Chiedo quindi principalmente chiarificazioni su aspetti teorici (e quindi che riguardano la programmazione pura), ma sarebbe bello anche sapere qualcosa sulle esperienze dirette degli altri utenti.
Chiudo qui per il momento, e ribadisco che la mia è una domanda teorica e non ho in mente progetti in questo ambito al momento, essendo completamente ignorante nell'ambito della programmazione a basso livello - ma chissà, non posso predire il futuro...
pabloski
29-12-2013, 14:16
Ovviamente la parte tecnica e quella pratica sono abbastanza distanti tra loro.
In teoria non è complesso emulare un qualsiasi tipo di meccanismo elettronico. In pratica tutto dipende dalla complessità dello stesso.
Se, ad esempio, ci limitiamo a considerare l'emulazione di un processore, possiamo agire come segue.
Immagina una cpu che ha 3 istruzioni ( add, mul, sub ). Per semplicità immagina che ognuna corrisponda ai numeri da 1 a 3 ( opcode ).
Ognuna accetta due operandi, ognuno di lunghezza fissa pari a 16 bit ( 2 bytes ). La lunghezza di una qualsiasi istruzioni diventa 3 bytes.
Immagina il seguente programma nel linguaggio macchina della cpu da emulare
ADD 10, 20
MUL 10, 20
SUB 10, 20
Niente di che, giusto un banale esempio. Il compilatore genererà codice binario del tipo:
1 10 20
2 10 20
3 10 20
Ho supposto che il risultato delle operazioni vada in un registro accumulatore A.
Quindi, la prima cosa, è ( all'interno dell'emulatore ) creare un'area di storage per A. Una variabile in pratica.
L'emulatore legge ognuna delle istruzioni, esegue uno switch e determina le azioni da eseguire per ognuna delle istruzioni supportate.
switch (opcode) {
case 1: accumulatore = operando1 + operando2; break
case 2: accumulatore = operando1 * operando2; break
case 3: accumulatore = operando1 - operando2; break
}
Questo banale switch emula ( sulla cpu fisica ) le operazioni della cpu virtuale. Lo fa interpretando a runtime ogni singola istruzione della cpu virtuale.
Chiaramente questo è uno dei metodi, ma ce anche la possibilità di ricompilare il codice nel linguaggio macchina della cpu fisica.
Questo esempio riguarda la sola cpu. Ogni componente hardware va emulato, e ognuno richiede l'uso di meccanismi analoghi. La gpu va emulata, quindi bisogna creargli un framebuffer ( nella ram del computer host ), mettere in comunicazione la gpu emulata con le altre unità hardware, emulare i suoi registri, ecc..., nonchè trasferire il contenuto del framebuffer ( l'immagine che la scheda grafica visualizza a schermo ) sullo schermo del sistema host ( nella finestra relativa all'emulatore ).
Deep thought
30-12-2013, 12:20
Grazie per la risposta pabloski, molto dettagliata.
Quindi ogni possibile istruzione della macchina emulata va convertita nell'istruzione corrispondente della macchina ospite. Questo significa che bisogna conoscere alla perfezione in funzionamento a basso livello della console da emulare, vero?
L'esempio che hai fatto tu è scritto in Java: quindi in realtà il linguaggio macchina va conosciuto solo per la corrispondenza con le istruzioni della console, mentre l'emulatore può essere scritto in qualsiasi linguaggio?
Capisco come questo diventi difficile e lungo per piattaforme moderne. Ma per quelle vecchie è più semplice? Intendo, diminuisce di molto il numero di comandi da emulare?
pabloski
30-12-2013, 14:02
Quindi ogni possibile istruzione della macchina emulata va convertita nell'istruzione corrispondente della macchina ospite.
piuttosto si può dire che vada eseguita sulla macchina ospite
ovviamente la cpu ospite non supporta le istruzioni della cpu emulata, da cui deriva il bisogno di interpretare o tradurre quelle istruzioni
Questo significa che bisogna conoscere alla perfezione in funzionamento a basso livello della console da emulare, vero?
ogni singolo dettaglio
L'esempio che hai fatto tu è scritto in Java: quindi in realtà il linguaggio macchina va conosciuto solo per la corrispondenza con le istruzioni della console, mentre l'emulatore può essere scritto in qualsiasi linguaggio?
in teoria si, poi dipende da cosa l'emulatore fa e come lo fa
se, per esempio, si ha bisogno ( supponiamo ) di programmare la scheda grafica ospite a basso livello, chiaramente si necessita di c o c++
Capisco come questo diventi difficile e lungo per piattaforme moderne. Ma per quelle vecchie è più semplice? Intendo, diminuisce di molto il numero di comandi da emulare?
le piattaforme vecchie sono in parte più semplice, ma il numero delle istruzioni non era basso nemmeno all'epoca
l'architettura nemmeno era così banale ( pensa all'amiga )
certamente è vero che ps3 o xbox 360 sono di gran lunga più complesse
mentre ps4 e xbox one rende il lavoro più semplice, in quanto si tratta di pc x86 customizzati, ma comunque mantengono discrete similitudini con l'hardware che usiamo di solito
ad esempio la cpu è una x86_64 standard, per cui si può usare la virtualizzazione invece dell'emulazione
Deep thought
31-12-2013, 09:54
Quindi potrebbe accadere un paradosso, in cui l'emulazione di macchine più recenti diventa più semplice di quello di macchine più vecchie. Se hanno la stessa architettura vuol dire che le istruzioni di base sono simili, vero?
E per conoscere tutti i dettagli dell'hardware cosa fanno i potenziali sviluppatori di emulatori? Esiste una documentazione che pubblica ogni produttore di console (intendo, per facilitare il lavoro ai creatori di videogiochi) da sfruttare per capire il funzionamento della macchina o bisogna farla a pezzi e vedere cosa c'è dentro? :D
pabloski
31-12-2013, 10:51
Se hanno la stessa architettura vuol dire che le istruzioni di base sono simili, vero?
si
prendi la ps4, che è una cpu x86 accoppiata ad una gpu amd
è chiarissimo che i programmi sono scritti in linguaggio macchina x86, dunque le istruzioni possono essere eseguite direttamente dalla cpu ospite ( quindi si può virtualizzare )
per la gpu si può fare qualcosa di simile, visto che i set d'istruzioni sono molto simili a quelli delle gpu che abbiamo nei pc ( per chi usa le radeon ovviamente ), quindi un'eventuale traduzione risulta semplificata
questo molto grossolanamente, anche se ci sono svariati dettagli che non ho citato ( tipo e numero dei registri, ad esempio )
E per conoscere tutti i dettagli dell'hardware cosa fanno i potenziali sviluppatori di emulatori? Esiste una documentazione che pubblica ogni produttore di console (intendo, per facilitare il lavoro ai creatori di videogiochi) da sfruttare per capire il funzionamento della macchina o bisogna farla a pezzi e vedere cosa c'è dentro? :D
i produttori do console non pubblica assolutamente nulla, se non informazioni utili al marketing
però le ultime due console hanno hardware amd e amd pubblica manuali molto grossi che descrivono in dettaglio sia cpu che gpu
chiaramente possono esserci parti custom, e lì si va di reverse engineering
ovviamente i grossi sviluppatori di videogames hanno in mano il devkit, che DEVE contenere documentazione dettagliata, altrimenti è impossibile per i programmatori realizzare giochi ottimizzati per quelle console
si tratta però di documentazione e tool di sviluppo non disponibili facilmente
Deep thought
31-12-2013, 13:45
Capisco, quindi spesso serve un lavoro di hacking prima della programmazione vera e propria. E capisco che i manuali per lo sviluppo i produttori i console se li tengano ben stretti, visto che loro sono interessati a scoraggiare lo sviluppo degli emulatori.
Grazie per tutte le risposte, allora! P.S. Tu hai fatto esperienze in questo campo?
pabloski
31-12-2013, 14:21
P.S. Tu hai fatto esperienze in questo campo?
si, ma nulla che riguardi le playstation :D
Ho avuto come l'impressione che la PS3 sia, in generale, più difficile da emulare rispetto all'X360.
Perchè? Mi sbaglio?
pabloski
02-01-2014, 17:53
Ho avuto come l'impressione che la PS3 sia, in generale, più difficile da emulare rispetto all'X360.
Perchè? Mi sbaglio?
Così si è detto. Forse per via della bislacca architettura del processore. O magari per lo stesso motivo per cui le "modifiche" sono molto difficili, ovvero i DRM invasivi :D
cdimauro
05-01-2014, 15:42
I DRM non c'entrano, perché riguardano la sicurezza.
Sia PS3 sia XBox360 hanno aspetti dell'hardware che sono difficili da emulare. Nel primo caso è principalmente la CPU, mentre nel secondo principalmente la GPU.
In ogni caso scordatevi emulatori per queste console, proprio a motivo di ciò.
I DRM non c'entrano, perché riguardano la sicurezza.
Sia PS3 sia XBox360 hanno aspetti dell'hardware che sono difficili da emulare. Nel primo caso è principalmente la CPU, mentre nel secondo principalmente la GPU.
In ogni caso scordatevi emulatori per queste console, proprio a motivo di ciò.
Per la 360 sembra essercene uno funzionante..
cdimauro
05-01-2014, 18:15
Sarà un malware per qualche povero sventurato che crede, ingenuamente, che sia possibile.
mone.java
06-01-2014, 10:49
I DRM non c'entrano, perché riguardano la sicurezza.
Sia PS3 sia XBox360 hanno aspetti dell'hardware che sono difficili da emulare. Nel primo caso è principalmente la CPU, mentre nel secondo principalmente la GPU.
In ogni caso scordatevi emulatori per queste console, proprio a motivo di ciò.
Ma la difficoltà si trova principalmente nell'emulazione in senso stretto, oppurere nell'eseguire l'emulazione in un tempo decente.. Cioè facendo finta che il tempo di esecuzione non sia un problema rimarrebbe comunque molto complesso?
cdimauro
06-01-2014, 11:23
Sì, è troppo complesso perché ci sono da sincronizzare troppo componenti hardware che lavorano in maniera indipendente (ma, ovviamente, a un certo punto devono "mettersi d'accordo" con gli altri).
La sincronizzazione può essere devastante dal punto di vista delle risorse necessarie per ottenerla.
E' per questo che emulare in generale sistemi multicore è molto difficile. Vedi la PS2, ad esempio, che ha un parziale supporto multicore proprio per questo (gli autori dell'emulatore hanno scritto uno stupendo post, tempo fa, proprio per spiegarlo).
Poi ci sono sistemi monocore che sono difficili da emulare per altre ragioni. Ad esempio la vecchia XBox, che pur avendo un "banale" (per modo di dire) Pentium 3, una GeForce "3.5" come GPU, facendo uso di memoria condivisa complica notevolmente l'emulazione, perché i PC, invece, separano nettamente la memoria di sistema da quella video, per cui sincronizzare le scritture della memoria unificata emulata verso la memoria video del sistema emulante, può risultare troppo oneroso.
E poi, ovviamente, c'è la potenza di calcolo che è necessaria, di per sé, per emulare un singolo core / pezzo del sistema. PS3 e XBox360 hanno CPU che girano a 3,2Ghz, e diversi core da emulare. Per non parlare poi della GPU e della sincronizzazione fra CPU e GPU. E infine, per la 360, di mezzo ci si mette sia la memoria unificata (stessi, enormi, problemi della vecchia XBox) sia la memoria eDRAM integrata, che è del tutto assente nei PC e richiede non poche risorse per emularne il funzionamento.
Insomma, un casino immane già soltanto a pensare di implementare tutto ciò, con praticamente inutili speranze di ottenere qualcosa di diverso da una moviola in esecuzione...
AnonimoVeneziano
06-01-2014, 14:10
Sì, è troppo complesso perché ci sono da sincronizzare troppo componenti hardware che lavorano in maniera indipendente (ma, ovviamente, a un certo punto devono "mettersi d'accordo" con gli altri).
La sincronizzazione può essere devastante dal punto di vista delle risorse necessarie per ottenerla.
E' per questo che emulare in generale sistemi multicore è molto difficile. Vedi la PS2, ad esempio, che ha un parziale supporto multicore proprio per questo (gli autori dell'emulatore hanno scritto uno stupendo post, tempo fa, proprio per spiegarlo).
Poi ci sono sistemi monocore che sono difficili da emulare per altre ragioni. Ad esempio la vecchia XBox, che pur avendo un "banale" (per modo di dire) Pentium 3, una GeForce "3.5" come GPU, facendo uso di memoria condivisa complica notevolmente l'emulazione, perché i PC, invece, separano nettamente la memoria di sistema da quella video, per cui sincronizzare le scritture della memoria unificata emulata verso la memoria video del sistema emulante, può risultare troppo oneroso.
E poi, ovviamente, c'è la potenza di calcolo che è necessaria, di per sé, per emulare un singolo core / pezzo del sistema. PS3 e XBox360 hanno CPU che girano a 3,2Ghz, e diversi core da emulare. Per non parlare poi della GPU e della sincronizzazione fra CPU e GPU. E infine, per la 360, di mezzo ci si mette sia la memoria unificata (stessi, enormi, problemi della vecchia XBox) sia la memoria eDRAM integrata, che è del tutto assente nei PC e richiede non poche risorse per emularne il funzionamento.
Insomma, un casino immane già soltanto a pensare di implementare tutto ciò, con praticamente inutili speranze di ottenere qualcosa di diverso da una moviola in esecuzione...
Bel post che spiega a dovere la situazione attuale e perchè l'ultimo emulatore che vedremo sarà quello per PS2/Dolphin ...
Per la PS4/XOne vedremo come sarà ... (lunga di sicuro, ma considerando che alla fine sono dei PC un po' modificati potenzialmente potrebbe essere più semplice ...)
cdimauro
06-01-2014, 15:40
In teoria potrebbe sembrare di sì, posto ovviamente di avere abbastanza core. Ma ci sono le modifiche che sia Sony sia Microsoft hanno chiesto ad AMD che richiederebbero patch al codice (di CPU e/o shader deglla GPU).
Poi ci sono gli immancabili problemi di sincronizzazione fra i vari elementi, che non sappiamo quanto possano costare (anche perché i core potrebbero avere internamene dei canali di comunicazione dedicati; who knows).
Infine c'è la famigerata memoria unificata che gentilmente ammazzerà le prestazioni, visto che nei PC memoria di sistema e video sono separati.
Per la XBoxOne, dulcis in fundo, c'è pure l'eDRAM che creerà ulteriori problemi...
Insomma, per farla breve, è meglio lasciare ogni speranza. :stordita:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.