Skip to content

Latest commit

 

History

History
135 lines (81 loc) · 10.5 KB

README_CN.md

File metadata and controls

135 lines (81 loc) · 10.5 KB

Official logo

Linux用户空间的x86应用模拟器

更新历史 | English | Українська | 报告错误

build stars forks contributors prs issues


使用Box86可以在ARM或其他非x86架构的Linux操作系统上运行x86 Linux程序(例如游戏),请注意,主机系统需要是32位小端的。

你需要一个32位的子系统来运行Box86,因为Box86在纯64位系统上无法使用,同时你也需要一个32位的Linux编译工具链来编译Box86,例如arm-linux-gnueabihf-gcc, 否则你将无法编译Box86 (一般的64位ARM编译工具链如 aarch64-linux-gnu-gcc 不支持"-marm"编译选项,会编译失败并报错)。

因为Box86使用了一些“系统”库的原生版本,例如libc、libm、SDL和OpenGL,所以在很多情况下性能很不错,也可以方便地与其他应用集成使用。点击此处查看Benchmark示例。

大多数x86游戏都用到了OpenGL,所以在ARM平台上类似于gl4es的解决方案通常是必要的。(许多ARM平台仅提供OpenGL ES支持,又或者他们的OpenGL实现很不可靠(例如Android上的OpenGL)。)

Box86为ARM平台集成了DynaRec(动态重编译器),比仅使用解释器提升5到10倍性能。关于Dynarec如何工作的更多信息,可以在这里找到。

许多游戏已可在不做多少改动的情况下直接运行,例如:《粘粘世界》(WorldOfGoo)、《航空大亨豪华版》(Airline Tycoon Deluxe)、《超越光速》(FTL)等、基于GameMaker的游戏(《传说之下》(UNDERTALE)等)。

如果你想开发Box86,最好安装ccache,以缓存编译结果。 如果你需要启用Trace跟踪(例如输出寄存器值与各条被执行的x86指令),你也需要安装Zydis

一些x86内部操作码使用“Realmode X86 Emulator Library”的部分内容,请参阅x86primop.c了解版权详情


编译与安装

Box86编译指南

Box86 Wine安装指南

一些示例视频

Play on Youtube Play on Youtube Play on Youtube Play on Youtube Play on Youtube Play on Youtube

在这几个Youtube频道可以找到更多Box86的相关视频

MicroLinux

Pi Labs

The Byteman

程序兼容性列表: https://github.com/ptitSeb/box86-compatibility-list/issues

感谢制作Logo和图标的grayduck!

注意: 不要把本项目和86box搞混了,后者是一个"全量"的x86 PC模拟器。


使用方法

有若干环境变量可以设置Box86的行为。

点击这里了解所有的环境变量和它们的作用。

请注意:Box86的Dynarec提供了一种包含"内存保护"和段错误信号处理程序的机制来处理JIT代码。简单来说,如果你想用GDB来调试一个使用JIT代码的运行程序(比如mono/Unity3D),就会触发很多“正常”的段错误。建议在GDB中使用类似于handle SIGSEGV nostop的命令,来防止在每个段错误时都停止程序运行,如果你想捕获段错误,可以在signals.c中的my_memprotectionhandler中放置一个断点。


关于64位平台的注意事项

Box86的工作原理是直接将函数调用从x86_转换到主机系统,主机系统(Box86运行的系统)需要有32位的库。Box86并不包括任何64位<->32位的转换。所以如果你需要在64位平台上运行Box86,那么你需要建立一个32位的库环境,并以32位ARM为目标系统编译Box86(例如使用arm-linux-gnueabihf-gcc工具链交叉编译或直接在armhf chroot环境中编译运行)。

如果你需要运行64位应用,请考虑使用Box64,它可以在64位平台上运行x86_64程序,但请再一次注意运行x86程序需要Box86与32位库环境(就像在x86_64的Linux上运行x86程序需要x86 multiarch库一样)。


关于Unity游戏的注意事项

当前对于Unity游戏的模拟仍不完善。Unity使用Mono,但它所使用的信号机制还没有被完美模拟。理论上可以使用原生Mono库(在这里可以找到),但Mono的封装比较麻烦,现在还没完成,所以我们使用了模拟的Mono库,目前Mono的JIT动态编译代码已由"内存保护"(Protected memory)机制实现,应该能正常运行。

同时,一些Unity3D游戏需要OpenGL 3+,目前在大部分Arm开发板上提供OpenGL 3+是很困难的。

所以,并不是所有的Unity游戏都能运行,尤其是那些需要提供很高的OpenGL配置(3.2+)的游戏更有可能不行,但除此之外应该问题不大,而且能运行的游戏的性能应该不错。

提示:如果游戏开始后在显示任何东西之前退出,在Raspberry Pi4上使用MESA_GL_VERSION_OVERRIDE=3.2,在Panfrost上使用PAN_MESA_DEBUG=gl3来使用更高的配置文件。


关于Steam的注意事项

Linux Steam 现在可以在Box86上运行,但还是有点不稳定,而且有些功能可能不正常:

  • 如果Steam在显示登录界面后崩溃,你可能需要安装libappindicator库,例如运行sudo apt install libappindicator1
  • 如果你选择记住密码,而Steam在下次启动时崩溃,你可能需要安装libnm库,例如运行sudo apt install libnm0
  • Steam不能在正常的大界面模式下工作,因为Steam在浏览器模式使用的一些组件只能在64位平台上运行。所以请在查看选项卡中选择"小模式",否则Steam将无法正常显示列表。或者在启动Steam添加+open steam://open/minigameslist参数,这样Steam将会直接在小模式下启动。
  • 为了避免"libc.so.6 is absent"的错误,请添加环境变量STEAMOS=1STEAM_RUNTIME=1
  • 一些游戏(例如基于起源引擎的游戏:《传送门》、《半衰期2》)使用了libtcmalloc库,Box86会尝试检测它们并通过LD_PRELOAD预加载它们来获得更好的兼容性,虽然应该可以在没有上述功能的情况下工作,但保险起见,我们还是建议你安装它,例如运行sudo apt install libtcmalloc-minimal4

Windows Steam 可以安装但目前不能运行。


关于Wine的注意事项

Box86现在已经支持Wine。Wine的内建程序全部能运行,许多Windows 程序和游戏也运行良好。但是不要忘记大多数 Windows 游戏都使用 Direct3D,这可能需要完整的 OpenGL 驱动程序和尽可能高的配置文件(基于 ES2 后端的 gl4es 现在不能运行 Wine 的Direct3D组件)。 注意:如果你想在 Raspberry Pi 3 或更早版本上用 Box86 运行 Wine,由于这些设备的内核默认使用 2G/2G 虚拟内存分配(2G 空间用于用户态程序,2G 空间用于内核),与需要访问内存地址 > 2G 的 Wine 程序不兼容。 因此,你需要重新配置内核以使用 3G/1G 的内存分配方式。


关于Vulkan的注意事项

Box86已经封装了Vulkan。如果设备的系统有32位的Vulkan驱动程序,Box86会在需要时使用它。但请注意,由于作者目前拥有的硬件上的Vulkan支持有限,因此Vulkan封装库尚未经过太多测试。 Vulkan 1.0、1.1与一些扩展应该能工作。 但Vulkan 1.2还没有被实现。已经有一些在树莓派4上的Vulkan演示 (Sascha Willems 的演示中,为x86构建的demo与与直接为armhf构建的demo工作均正常)。但请注意,Pi4的Vulkan驱动程序目前不支持 dxvk(wine DirectX->Vulkan 兼容层),这不是Box86的问题,而是由于缺少扩展(硬件支持)与一些其他驱动问题。而在Panfrost上,PanVK尚不成熟,暂时没有用它测试dxvk。


结语

我要感谢所有为 box86 开发做出贡献的人。 贡献方式有很多种:代码贡献、财务帮助、捐赠捐赠和广告合作! 以下感谢不分先后:

我还要感谢很多人,即使他们只参与了一次本项目。

(如果你的项目中使用了Box86,请不要忘记提及!)