Linux用户空间x86模拟器,别具特色
查看更新日志 | 中文 | Українська | 报告错误
Box86让你能在非x86的Linux系统上运行x86 Linux程序(如游戏),比如ARM系统(主机系统需要是32位小端序)。
你需要32位子系统来运行和构建Box86。Box86在纯64位系统上毫无用处。此外,你需要32位工具链来构建Box86。仅支持64位的工具链无法编译Box86,你会遇到错误(通常在aarch64上,会出现"-marm"无法识别的错误,你需要一个多架构或chroot环境)。
由于Box86使用一些"系统"库的本地版本,如libc、libm、SDL和OpenGL,因此它易于集成和使用于大多数应用程序,在许多情况下性能可能出奇地高。看看这些基准分析的例子点击这里。这也意味着你需要在64位操作系统上有32位用户空间,比如在64位aarch64
操作系统上有armhf
。
大多数x86游戏需要OpenGL,所以在ARM平台上可能需要像gl4es这样的解决方案。(一些ARM平台只支持OpenGL ES和/或它们的OpenGL实现不稳定。(参见Android上的OpenGL))
Box86现在为ARM平台集成了DynaRec(动态重编译器),提供了5到10倍于仅使用解释器的速度提升。关于DynaRec如何工作的一些高层次信息可以在这里找到。
许多游戏无需太多调整就能运行,例如:WorldOfGoo、Airline Tycoon Deluxe和FTL。许多GameMaker的Linux游戏也运行良好。(有一个很长的列表,其中包括UNDERTALE、A Risk of Rain和Cook Serve Delicious)。Unity3D游戏也运行良好,但OpenGL要求可能在某些ARM平台上是个问题。
如果你认真开发Box86,你应该安装ccache并用它构建Box86。(例如使用ccmake。) 要启用TRACE(即将所有执行的单个x86指令及寄存器转储输出到stdout),你还需要在系统上安装Zydis库。
一些x86内部操作码使用了"实模式X86模拟器库"的部分,版权详情见x86primop.c
编译/安装
这里有6个视频,前2个视频是"Airline Tycoon Deluxe"和"Heretic 2"在GigaHertz OpenPandora上运行的视频(第二个使用了动态重编译器),接下来2个视频是"Bit.Trip.Runner"和"Neverwinter Night"在ODroid XU4上运行的视频(没有使用动态重编译器),最后2个视频是在Pi4上运行的:Shovel Knight(视频来自@ITotalJustice)和Freedom Planet(视频来自@djazz),也没有使用动态重编译器。
你可以在MicroLinux、Pi Labs或The Byteman的YouTube频道上找到更多Box86视频。
兼容性列表在这里:https://github.com/ptitSeb/box86-compatibility-list/issues
标志和图标由@grayduck制作,谢谢!
请注意,本项目不要与86box混淆,后者是一个专门针对早期(到相当近期)PC硬件的不错的"全系统"模拟器。
使用方法
有几个环境变量可以控制Box86的行为。
查看这里了解所有环境变量及其作用。
注意:Box86的动态重编译使用内存保护和SegFault信号处理程序来处理JIT代码。简单来说,如果你想使用GDB调试使用JIT代码的运行程序(如mono/Unity3D),你仍会遇到许多"正常"的段错误触发。建议在GDB中使用类似handle SIGSEGV nostop
的命令来避免在每个段错误处停止,如果你想捕获段错误,也许可以在signals.c
中的my_box86signalhandler
内设置断点。
版本历史
更新日志可在这里查看。
关于64位平台的说明
由于Box86通过直接将x86函数调用翻译到主机系统,主机系统(运行Box86的系统)需要有32位库。Box86不包含任何32位<->64位转换。因此,要在ARM64平台上运行Box86,你需要为ARM 32位构建Box86,并且需要有一个带32位库的chroot环境。
如果你在寻找64位版本的box86,可以看看Box64:它能在64位平台上运行x86_64二进制文件。但请注意,你仍然需要Box86(和32位chroot)来运行x86二进制文件(就像在实际的x86_64 Linux上需要x86库和多架构二进制文件来运行x86程序一样)。
关于Box86配置的说明
Box86现在有配置文件。它会加载两个文件:/etc/box4.box86rc
和~/.box86rc
。这两个文件具有相同的语法,基本上是ini文件。方括号中的部分定义进程名,其余部分是要设置的环境变量。查看Usage了解可以设置哪些参数。Box86附带了一个默认文件,应该安装它以获得更好的稳定性。该文件位于system/box86.box86rc
,应该安装到/etc/box86.box86rc
。如果由于某些原因你不想将文件安装在这里,至少将其复制到~/.box86rc
,否则某些游戏可能无法正常运行。
注意优先级为:~/.box86rc
> /etc/box86.box86rc
> 命令行
因此,你在~/.box86rc
中的设置可能会覆盖命令行中的设置...
关于Unity游戏模拟的说明
运行Unity游戏现在通常应该可以正常工作,但你还应该注意到许多Unity3D游戏需要OpenGL 3+,这在ARM单板计算机上目前可能比较棘手。
提示:在Pi4上,使用MESA_GL_VERSION_OVERRIDE=3.2
,对于Panfrost使用PAN_MESA_DEBUG=gl3
来使用更高的配置文件,如果游戏启动后在显示任何内容前就退出的话。
关于Steam的注意事项
Linux版Steam现在可以通过box86运行。但你还需要box64才能完全可用。 建议在小窗口模式下运行Steam,因为它使用的内存较少,但steamwebhelper(一个64位进程)即使不使用也会被加载。 如果系统中没有正确设置box64,登录界面将无法运行,只会显示一个空白窗口。 注意,Steam会使用大量内存,在4GB RAM的系统上勉强能运行。在内存更少的系统上将无法工作(作为变通方法,创建一个交换文件,登录并勾选"记住我",然后使用box64rc禁用steamwebhelper,并在第一次登录后仅在小窗口模式下运行,无需交换)。 最后注意:Steam大屏幕模式可以工作,但也需要steamwebhelper(因此需要box64),以及大量内存。在只有4GB RAM且没有交换分区的系统上无法启动。
- 如果你在安装Steam时遇到问题,可以在box86仓库的根目录中找到
install_steam.sh
。这个简单的脚本会在你的主文件夹中下载并安装Steam,然后在/usr/local/bin
中创建一个Steam的快捷方式(为此它会请求sudo权限)。安装完成后,只需使用steam
命令即可启动。请注意,由于安装在主文件夹中,它只适用于单个用户。如果你需要多用户安装,请不要使用此脚本。 - 为避免"libc.so.6缺失"的消息,你可以使用
STEAMOS=1
和STEAM_RUNTIME=1
作为环境变量(如果你使用了install_steam.sh
脚本,它会自动设置)。
如果你在启动Steam时遇到问题,steamwebhelper
无法启动,你需要使用-cef-disable-gpu
或-cef-disable-gpu-compositor
参数启动Steam。
关于Wine的注意事项
现在支持Wine。Wine集成的程序都能运行,许多Windows程序和游戏也能正常运行。别忘了大多数Windows游戏使用Direct3D,这可能需要完整的OpenGL驱动程序和尽可能高的配置文件(目前gl4es与ES2后端在Wine中存在问题)。 注意:如果你计划在Raspberry Pi 3或更早型号上使用box86和Wine,这些型号使用的默认操作系统内核采用2/2分割(意味着用户程序有2G空间,内核有2G空间)。这与需要访问>2Gb地址内存的Wine程序不兼容。因此,你需要重新配置内核为3G/1G分割。
关于Vulkan的注意事项
Box86已经包装了Vulkan。如果你的系统有32位Vulkan驱动程序,box86会在需要时使用它。1.0、1.1、1.2和1.3配置文件,以及一些扩展,应该可以正常工作。DXVK(包括2.0版本)也能工作。我知道一些演示在Pi4上可以运行(Sascha Willems为x86构建的演示与直接在armhf上构建的效果相同)。请注意,Pi4的Vulkan驱动目前不支持dxvk(wine的DirectX到Vulkan包装器)。这不是box86的问题,而是缺少扩展(硬件支持)和其他一些使dxvk无法在pi4上工作的因素。在Panfrost方面,PanVK还比较年轻,我还没有用它测试过dxvk。
结语
我要感谢所有为box86开发做出贡献的人。 有很多方式可以贡献:代码、资金、硬件和宣传! 所以,不分先后地,我要感谢:
- 主要代码贡献者: rajdakin, icecream95, M-HT
- 主要资金贡献者: FlyingFathead, stormchaser3000, dennis1248, sll00, libre-computer-project, CubeCoders Limited
- 硬件贡献者: ADLink, Radxa, Pine64, DragonBox, Novaspirit, HardKernel, TwisterOS team, AYN
- 持续宣传box86项目的人: salva (microLinux), PILab/TwisterOS team, The Byteman, NicoD
我还要感谢其他曾经参与过这个项目的人,哪怕只参与过一次。
(如果你在项目中使用Box86,请别忘了提及它!)