Bochs su Solaris 10 (SPARC)

Bochs è un programma che emula un pc di tipo x86 (in senso lato, visto che è in grado di emulare da un 386 fino alle architetture Intel x86-64). L’utilità di un emulatore del genere sono molteplici e risultano evidenti anche senza parlare delle differenze tra un emulatore come Bochs e un programma per la virtualizzazione come VirtualBox. Infatti il mio interesse per Bochs nasce dalla possibilità di poter emulare un processore x86 su una macchina SPARC.

Nel momento in cui sto scrivendo questo post, l’ultima versione di Bochs è la 2.6.1 e naturalmente è quella che ho compilato.

Purtroppo le cose non sono andate lisce come speravo.

Per prima cosa, la configurazione non andava a buon fine, segnalandomi (a ragione), l’assenza di Xrandr. Il problema è stato risolto temporaneamente usando ./configure --with-term ma la soluzione non mi soddisfa, visto che vorrei poter usare un interfaccia grafica, quindi dovrò tornarci sopra.

Seconda cosa, non sono riuscito ad utilizzare il compilatore incluso in Oracle Studio, quindi ho ripiegato su gcc.

La compilazione è andata a buon fine ma dopo aver sistemato il file di configurazione di Bochs nel momento di far partire l’emulazione Bochs usciva con il triste errore Bus Error.

Ovvero si tratta un problema di allineamento in memoria. La cosa è piuttosto fastidiosa perchè sarebbe possibile eliminarlo usando un opportuno flag del compilatore di Oracle Studio ma come ho detto per il momento il compilatore che compila è gcc.

Fortunatamente c’è una soluzione, non particolarmente elegante: inserire un istruzione in asm che richieda al kernel di gestire l’eccezione di accesso alla memoria non allineato. Questo significa pagare una penalità in velocità di esecuzione ma non avevo altre alternative.

Qui inizia il mistero.

Le fonti che ho consultato (mailing list di bochs) suggeriscono di inserire la linea di codice asm("ta 6"); all’inizio del main, prima di qualsiasi altra istruzione.

Bene, main si trova, abbastanza ovviamente, in main.cc ma io, anzichè aggiungere all’interno di main l’istruzione asm("ta 6"); ho pensato bene di inserirla alla riga 535 all’interno della funzione bx_int_main e francamente, anche se sono passate appena due settimane e anche se stavo documentando quello che facevo non ho la più pallida idea del motivo che mi ha spinto a scegliere quella linea. Non ho scritto niente in proposito quindi o mi era sembrato particolarmente ovvio il perchè avessi scelto quella linea oppure ho semplicemente sbagliato, anche se non capisco come.

In ogni caso, con quella singola linea di codice aggiunta, Bochs non solo compila ma funziona perfettamente con un’immagine di prova scaricata dal sito di Bochs.

Adesso dovrò provare le altre immagini di disponibili sul sito. Se funzioneranno, proverò a vedere se è possibile compilare Bochs usando Oracle Studio e se è possibile avere una GUI.

E non sarebbe male non avere accessi non allineati alla memoria.

A.C.

This entry was posted in Programmazione, Solaris 10. Bookmark the permalink.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *