box86/docs/README_CN.md
2023-09-25 19:45:58 +08:00

10 KiB
Raw Blame History

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驱动程序目前不支持 dxvkwine DirectX->Vulkan 兼容层这不是Box86的问题而是由于缺少扩展硬件支持与一些其他驱动问题。而在Panfrost上PanVK尚不成熟暂时没有用它测试dxvk。


结语

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

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

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