Sono stati pubblicati i rilasci degli emulatori Box86 0.2.6 e Box64 0.1.8, progettati per eseguire programmi Linux compilati per architetture x86 e x86_64 su hardware con processori ARM, ARM64, PPC64LE e RISC-V. I progetti sono sviluppati in modo sincrono da un unico team di sviluppatori: Box86 è limitato alla possibilità di eseguire applicazioni x86 a 32 bit, mentre Box64 consente l'esecuzione di file eseguibili a 64 bit. Il progetto presta particolare attenzione all'organizzazione dell'esecuzione di applicazioni di gioco, offrendo anche la possibilità di eseguire assemblee Windows tramite wine e Proton. I codici sorgente del progetto sono scritti in C e sono distribuiti (Box86, Box64) sotto licenza MIT.
Una caratteristica del progetto è l'applicazione di un modello ibrido di esecuzione, nel quale l'emulazione viene applicata solo al codice macchina dell'applicazione stessa e alle librerie specifiche. Le librerie di sistema standard, comprese libc, libm, GTK, SDL, Vulkan e OpenGL, vengono sostituite con varianti native per le piattaforme target. In questo modo, le chiamate di libreria vengono eseguite senza emulazione, il che consente di ottenere un aumento significativo delle prestazioni.
L'emulazione del codice per cui non sono disponibili sostituzioni native per la piattaforma di destinazione avviene utilizzando la tecnica della ricompilazione dinamica (DynaRec) da un set di istruzioni macchina a un altro. Rispetto all'interpretazione delle istruzioni macchina, la ricompilazione dinamica dimostra performance da 5 a 10 volte superiori.
Nei test di prestazione, gli emulatori Box86 e Box64 hanno notevolmente superato i progetti QEMU e FEX-emu su piattaforme Armhf e Aarch64, e in alcuni test (glmark2, openarena) hanno raggiunto prestazioni identiche a quelle di un'assemblea nativa per la piattaforma target. Nei test di 7-zip e dav1d, che eseguono calcoli intensivi, le prestazioni di Box64 sono state del 27% al 53% rispetto a quelle dell'applicazione nativa (per confronto QEMU ha mostrato risultati del 5-16%, e FEX-emu - 13-26%). È stato effettuato anche un confronto con l'emulatore Rosetta 2, utilizzato da Apple per eseguire codice x86 su sistemi con il chip ARM M1. Rosetta 2 ha garantito l'esecuzione del test basato su 7zip con prestazioni del 71% rispetto all'assemblaggio nativo, mentre Box64 ha raggiunto il 57%.

Per quanto riguarda la compatibilità con le applicazioni, delle 165 giochi testati, circa il 70% ha funzionato correttamente. Circa il 10% funziona, ma con alcune riserve e limitazioni. Tra i giochi supportati ci sono WorldOfGoo, Airline Tycoon Deluxe, FTL, Undertale, A Risk of Rain, Cook Serve Delicious e la maggior parte dei giochi della GameMaker. Tra i giochi che presentano problemi, si segnalano quelli basati sul motore Unity3D, che dipende dal pacchetto Mono, la cui emulazione non funziona sempre a causa della compilazione JIT utilizzata in Mono, e ha anche requisiti grafici piuttosto elevati, non sempre raggiungibili su piattaforme ARM. La sostituzione delle librerie delle applicazioni GTK è attualmente limitata a GTK2 (la sostituzione di GTK3/4 non è completamente implementata).
Principali modifiche nelle nuove versioni:
- Aggiunta un'interfaccia per la libreria Vulkan. Aggiunta supporto per le API grafiche Vulkan e DXVK (implementazione di DXGI, Direct3D 9, 10 e 11 sopra Vulkan).
- Migliorato l'interfaccia per le librerie GTK. Aggiunte interfacce per gstreamer e librerie normalmente utilizzate nelle applicazioni GTK.
- Aggiunto supporto iniziale (attualmente solo in modalità interpretazione) per le architetture RISC-V e PPC64LE.
- Sono state apportate correzioni per migliorare il supporto di SteamPlay e del layer Proton. È possibile avviare molti giochi Linux e Windows da Steam su schede AArch64, come Raspberry Pi 3 e 4.
- Migliorata la gestione della memoria, il funzionamento di mmap e il monitoraggio delle violazioni di protezione della memoria.
- Migliorato il supporto della chiamata di sistema clone in libc. Aggiunto supporto per nuove chiamate di sistema.
- Nel motore di ricompilazione dinamica è migliorato l'uso dei registri SSE/x87, aggiunto supporto per nuove istruzioni macchina, ottimizzati i convertitori per i numeri float e double, migliorata la gestione dei salti interni, semplificata l'aggiunta di supporto per nuove architetture.
- Migliorato il caricatore file nel formato ELF.
Fonte: opennet.ru
