Les versions des émulateurs Box86 0.2.6 et Box64 0.1.8 ont été publiées, conçues pour exécuter des programmes Linux compilés pour les architectures x86 et x86_64 sur du matériel équipé de processeurs ARM, ARM64, PPC64LE et RISC-V. Les projets avancent simultanément par une équipe de développeurs : Box86 se limite à l'exécution d'applications 32 bits x86, tandis que Box64 prend en charge les fichiers exécutables 64 bits. Le projet accorde une attention particulière à l'exécution d'applications de jeu, en offrant également la possibilité de lancer des versions Windows via Wine et Proton. Les codes sources du projet sont écrits en C et sont distribués (Box86, Box64) sous la licence MIT.
L'originalité du projet réside dans l'utilisation d'un modèle d'exécution hybride, où l'émulation est uniquement appliquée au code machine de l'application elle-même et aux bibliothèques spécifiques. Les bibliothèques système typiques, y compris libc, libm, GTK, SDL, Vulkan et OpenGL, sont remplacées par des versions natives aux plateformes cibles. Ainsi, les appels de bibliothèque sont exécutés sans émulation, ce qui permet d'obtenir une augmentation significative des performances.
L'émulation du code pour lequel il n'existe pas de remplacements natifs pour la plateforme cible est effectuée en utilisant une technique de recompilation dynamique (DynaRec) d'un ensemble d'instructions machines dans un autre. Par rapport à l'interprétation des instructions machines, la recompilation dynamique montre des performances de 5 à 10 fois supérieures.
Lors des tests de performances, les émulateurs Box86 et Box64, exécutés sur des plateformes Armhf et Aarch64, ont largement surpassé les projets QEMU et FEX-emu, et dans certains tests (glmark2, openarena), ils ont permis d'atteindre des performances identiques à celles d'une version native à la plateforme cible. Dans les tests 7-zip et dav1d, soumis à des calculs intensifs, les performances de Box64 ont varié de 27 % à 53 % par rapport aux performances de l'application native (pour comparaison, QEMU a montré des résultats de 5 à 16 %, et FEX-emu de 13 à 26 %). De plus, une comparaison a été faite avec l'émulateur Rosetta 2, utilisé par Apple pour exécuter du code x86 sur des systèmes équipés de puces ARM M1. Rosetta 2 a permis de réaliser le test basé sur 7zip avec une performance de 71 % par rapport à la version native, tandis que Box64 a atteint 57 %.

En ce qui concerne la compatibilité avec les applications, parmi les 165 jeux testés, environ 70 % fonctionnent correctement. Environ 10 % fonctionnent également, mais avec certaines réserves et limitations. Parmi les jeux pris en charge, on trouve WorldOfGoo, Airline Tycoon Deluxe, FTL, Undertale, A Risk of Rain, Cook Serve Delicious et la plupart des jeux de la société GameMaker. Les jeux rencontrant des problèmes incluent ceux basés sur le moteur Unity3D, qui dépend du package Mono, dont l'émulation ne fonctionne pas encore toujours en raison de la compilation JIT utilisée dans Mono, et qui a également des exigences graphiques relativement élevées, souvent inaccessibles sur les plates-formes ARM. Le remplacement des bibliothèques pour les applications GTK est pour l'instant limité à GTK2 (le remplacement complet de GTK3/4 n'est pas encore réalisé).
Principales modifications dans les nouvelles versions :
- Ajout d'un wrapper pour la bibliothèque Vulkan. Ajout de la prise en charge de l'API graphique Vulkan et de DXVK (implémentation de DXGI, Direct3D 9, 10 et 11 sur Vulkan).
- Amélioration des wrappers pour les bibliothèques GTK. Ajout de wrappers pour gstreamer et les bibliothèques généralement utilisées dans les applications GTK.
- Ajout d'une prise en charge initiale (pour l'instant uniquement en mode interprétation) des architectures RISC-V et PPC64LE.
- Corrections apportées pour améliorer la prise en charge de SteamPlay et de la couche Proton. Possibilité de lancer de nombreux jeux Linux et Windows depuis Steam sur des plates-formes AArch64, telles que Raspberry Pi 3 et 4.
- Amélioration de la gestion de la mémoire, du fonctionnement de mmap et du suivi des violations de protection de la mémoire.
- Amélioration de la prise en charge de l'appel système clone dans libc. Ajout de la prise en charge de nouveaux appels systèmes.
- Dans le moteur de recompilation dynamique, amélioration de la gestion des registres SSE/x87, ajout de support pour de nouveaux codes machine, optimisation des conversions entre float et double, amélioration de la gestion des sauts internes, simplification de l'ajout de support pour de nouvelles architectures.
- Amélioration du chargeur de fichiers au format ELF.
Source : opennet.ru
