21.05.2022

Новые версии эмуляторов Box86 и Box64, позволяющих запускать x86-игры на системах ARM

Опубликованы выпуски эмуляторов Box86 0.2.6 и Box64 0.1.8, предназначенных для запуска Linux-программ, собранных для архитектур x86 и x86_64, на оборудовании с процессорами ARM, ARM64, PPC64LE и RISC-V. Проекты развиваются синхронно одной командой разработчиков — Box86 ограничивается возможностью запуска 32-разрядных приложений x86, а Box64 обеспечивает запуск 64-разрядных исполняемых файлов. Проект уделяет большое внимание организации запуска игровых приложений, в том числе предоставляя возможность запуска Windows-сборок через wine и Proton. Исходные тексты проекта написаны на языке Си и распространяются (Box86, Box64) под лицензией MIT.

Особенностью проекта, является применение гибридной модели выполнения, при которой эмуляция применяется только к машинному коду самого приложения и специфичных библиотек. Типовые системные библиотеки, включая libc, libm, GTK, SDL, Vulkan и OpenGL, подменяются на варианты, родные для целевых платформ. Таким образом, библиотечные вызовы выполняются без эмуляции, что позволяет добиться значительного увеличения производительности.

Эмуляция кода, для которого отсутствуют родные для целевой платформы замены, выполняется с использованием техники динамической перекомпиляции (DynaRec) из одного набора машинных инструкций в другой. По сравнению с интерпретацией машинных инструкций динамическая перекомпиляция демонстрирует в 5-10 раз более высокую производительность.

В тестах производительности эмуляторы Box86 и Box64 при выполнении на платформах Armhf и Aarch64 существенно опередили проекты QEMU и FEX-emu, а в отдельных тестах (glmark2, openarena) позволили добиться производительности идентичной запуску сборки, родной для целевой платформы. В тестах 7-zip и dav1d, выполняющих интенсивные вычисления, производительность Box64 составила от 27% до 53% от производительности родного приложения (для сравнения QEMU показал результат в 5-16%, а FEX-emu — 13-26%). Дополнительно было произведено сравнение с эмулятором Rosetta 2, применяемым компанией Apple для запуска x86-кода на системах с ARM-чипом M1. Rosetta 2 обеспечил выполнение теста на базе 7zip с производительностью 71% от родной сборки, а Box64 — 57%.

Что касается совместимости с приложениями, то из 165 протестированных игр, успешно заработали около 70%. Ещё примерно 10% работают, но с определённым оговорками и ограничениями. Среди поддерживаемых игр WorldOfGoo, Airline Tycoon Deluxe, FTL, Undertale, A Risk of Rain, Cook Serve Delicious и большинство игр компании GameMaker. Из игр, с которыми отмечаются проблемы, упоминаются игры на базе движка Unity3D, который завязан на пакет Mono, эмуляция которого пока не всегда работает из-за применяемой в Mono JIT-компиляции, а также имеет достаточно высокие требования к графике, не всегда достижимые на ARM-платах. Подмена библиотек GTK-приложений пока ограничивается GTK2 (подмена GTK3/4 реализована не полностью).

Основные изменения в новых выпусках:

  • Добавлена обвязка для библиотеки Vulkan. Добавлена поддержка графического API Vulkan и DXVK (реализация DXGI, Direct3D 9, 10 и 11 поверх Vulkan).
  • Улучшены обвязки для библиотек GTK. Добавлены обвязки для gstreamer и библиотек, обычно используемых в GTK-приложениях.
  • Добавлена начальная поддержка (пока только режим интерпретации) архитектур RISC-V и PPC64LE.
  • Внесены исправления, нацеленные на улучшение поддержки SteamPlay и прослойки Proton. Обеспечена возможность запуска многих Linux и Windows игр из Steam на платах AArch64, таких как Raspberry Pi 3 и 4.
  • Улучшено управление памятью, работа mmap и отслеживание нарушений защиты памяти.
  • Улучшена поддержка системного вызова clone в libc. Добавлена поддержка новых системных вызовов.
  • В движке динамической перекомпиляции улучшена работа с регистрами SSE/x87, добавлена поддержка новых машинных кодов, оптимизированы преобразования чисел float и double, улучшена обработка внутренних переходов, упрощено добавление поддержки новых архитектур.
  • Улучшен загрузчик файлов в формате ELF.

Источник.