ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Box64 ARM 模拟器实战:让 x86_64 游戏和老服务在 ARM 板上跑起来

Box64 ARM 模拟器实战:让 x86_64 游戏和老服务在 ARM 板上跑起来 Box64 ARM 模拟器实战让 x86_64 游戏和老服务在 ARM 板上跑起来【免费下载链接】box64Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices项目地址: https://gitcode.com/gh_mirrors/bo/box64当你发现那款 x86_64 游戏在树莓派上双击无反应、./game: cannot execute的报错一闪而过时你缺的其实就是一个 Box64——一个跑在用户空间的 x86_64 模拟器专为 ARM64、RISC-V 和龙芯 Linux 设备设计不需要虚拟整机直接把 x86_64 程序翻译成你设备的本地指令来执行。这篇文章不讲空泛的概念先带你把它装好、把 Steam 跑起来再讲怎么调参数、怎么查错。 源码编译安装 Box645 分钟跑通第一条 x86_64 命令装依赖并克隆仓库以 ARM64 设备为例先装好编译工具链再克隆仓库到板上也可以先 clone 到 x86 电脑再交叉编译见 docs/COMPILE.md 末尾# 安装编译依赖Debian/Ubuntu 系 sudo apt update sudo apt install build-essential cmake git # 克隆仓库并在板上直接编译 git clone https://gitcode.com/gh_mirrors/bo/box64 cd box64 mkdir build cd build cmake .. -DARM_DYNARECON -DCMAKE_BUILD_TYPERelWithDebInfo make -j$(nproc) sudo make install其中-DARM_DYNARECON是关键开关它启用动态重编译器DynaRec把 x86_64 指令块实时翻译成 ARM 指令比纯解释执行快得多官方测试约为 5-10 倍。RISC-V 设备改用-DRV64ON龙芯改用-DLARCH64ON树莓派、RK3588 等机型有专门的参数如-DRPI4ARM641完整清单在 docs/COMPILE.md 里按设备分好节。装完后执行sudo systemctl restart systemd-binfmt让系统自动把 x86_64 可执行文件转交给 Box64——这一步之后你直接敲./game.x86_64也能跑不用每次加box64前缀。跑通第一条命令验证安装验证很简单两条命令即可box64 --version # 应输出版本号 box64 /bin/ls # 应正常列出当前目录内容看到/bin/ls正常输出就说明加载器、DynaRec 和动态库桥接都工作正常——Box64 启动 x86 程序时会优先调用宿主机的本地 libc、libGL 等库缺哪块它都会在这两条命令里暴露出来。 在树莓派上启动 Steam三步出窗口用自带脚本一键装好仓库根目录自带install_steam.sh它会把 Steam 客户端装到~/steam并生成一个设置好环境变量STEAMOS1、PROTON_USE_WOW641等的启动脚本cd box64 ./install_steam.sh # 下载并解包 steam.deb生成 /usr/local/bin/steam steam # 直接启动客户端注意两点Linux 版 Steam 会拉起 32 位进程需要 Box32 支持见后文第 5 节内存小于 6GB 的设备建议先建一个 swap 文件官方 Steam 指南就一句话提醒了这个。详细步骤在 docs/STEAM.md。给 Steam 加一份专属配置Steam 对多核敏感核心数给太多反而拖慢加载。在~/.box64rc里为它单独建一个段[steam] BOX64_MAXCPU8 # 限制暴露给程序的 CPU 核心数 BOX64_DYNAREC_BIGBLOCK2 BOX64_LOG1 # 保留最简日志方便排错Box64 支持给每个程序写独立配置段段名就是进程名不区分大小写这份按程序开药方的能力是后文调优的基础。 修掉三个高频报错缺库、卡顿、黑屏缺共享库先分清 32 位还是 64 位error while loading shared libraries: libxxx.so是最常见的启动失败。先看报错里的库名后缀libstdc.so.6这类是 64 位的装libstdc6即可-i386或linux-gnueabi路径则是 32 位需要装 32 位包sudo apt install lib32stdc6 lib32z1 lib32gcc-s1 # 按报错名字逐一补另一个坑Box64 编译时若加了-DBOX32ON却没有装对应 32 位库32 位程序会直接起不来报错信息和上面完全一样。启动慢确认 DynaCache 生效DynaCache 会把已翻译好的代码块存到~/.cache/box64第二次启动直接加载跳过翻译过程——相当于把现场翻译的稿子存下来下次直接读稿。它默认开启缓存目录上限 2GBBOX64_DYNACACHE_LIMIT可调。如果首次启动慢、二次启动快说明它在正常工作如果缓存目录异常膨胀把它设成只读即可export BOX64_DYNACACHE2 # 只读模式用已有缓存不再写新文件卡住或黑屏开日志看卡在哪export BOX64_LOG3 # 最详细的 verbose 级日志 box64 ./your_program 21 | tee output.log日志里最后打印的库名或函数名基本就是问题现场。图形类程序Unity、带 SDL 的独立游戏黑屏时可再叠加export MESA_GL_VERSION_OVERRIDE3.2降低 OpenGL 版本要求试试。 把配置写进 .box64rc告别重复 export 环境变量理解两个配置文件的优先级Box64 按这个顺序读取配置~/.box64rc/etc/box64.box64rc 环境变量。系统级那份由安装时生成仓库里的 system/box64.box64rc 就是模板已经内置了一批知名程序的推荐参数比如给7z开了BIGBLOCK2、给 Steam 系 DLLd3d9.dll、dxgi.dll统一设了BIGBLOCK3。你只需要在~/.box64rc里写自己的覆盖。按程序段、按文件段两种写法[*] # 全局段所有程序生效 BOX64_DYNAREC_BIGBLOCK2 BOX64_DYNAREC_FORWARD512 [factorio] # 按进程名只对这个程序生效 BOX64_DYNAREC_SAFEFLAGS0 BOX64_DYNAREC_CALLRET1 [/d3d9.dll] # 按加载的文件只影响这个 DLL BOX64_DYNAREC_STRONGMEM0进程名还支持通配符[*setup*]会匹配所有名字里带 setup 的程序——安装程序行为普遍狂野全局模板里就是给它们单独上了安全参数。⚙ 调四个 DynaRec 参数把游戏帧率提上来四个参数的取舍对照调优基本围绕下面四个变量。它们都控制翻译时做得多激进参数作用保守值激进值适用场景BOX64_DYNAREC_BIGBLOCK翻译块的大小上限0线程多、带 JIT 的程序如 Unity3覆盖所有内存类型适合 Wine/DX 程序越大代码越紧凑但内存占用越高BOX64_DYNAREC_FORWARD块间允许的最大间隙字节128默认512 / 1024只接受 0/128/256/512/1024 这几个档位BOX64_DYNAREC_SAFEFLAGS对 CALL/RET 标志位寄存器的保守程度2最安全慢0最快个别程序会错乱程序跑飞、数字不对时优先调它BOX64_DYNAREC_STRONGMEM模拟 x86 强内存序的屏障数量0默认最快1/2加内存屏障多线程游戏随机崩溃、数据错乱时打开一个稳妥的起步组合BIGBLOCK2默认FORWARD512SAFEFLAGS0CALLRET1。如果程序出现偶发数据错乱、多打一这类玄学 bug把STRONGMEM从 0 升到 1 再试它牺牲一点性能换正确性。验证调参效果调完别凭感觉用时间说话time box64 ./game_x86_64 --benchmark # 跑同一场景对比调参前后耗时每个参数只改一个变量、各跑一轮否则分不清是哪项起的作用。编译时开启 Box32让 32 位老软件一并跑起来加两个 CMake 开关Box32 是 Box64 的 32 位伴侣仓库里独立的box32构建目标两者同仓维护、共享一套动态重编译框架。要一起用编译时加两个开关即可cmake .. -DARM_DYNARECON -DCMAKE_BUILD_TYPERelWithDebInfo \ -DBOX32ON -DBOX32_BINFMTON # 之后 make / sudo make install / 重启 binfmt 同前-DBOX32_BINFMTON会额外注册 binfmt 规则让 32 位的 i386 ELF 也能像 x86_64 程序一样被系统直接转交。注意官方在 CMake 注释里仍标注 Box32 为 experimental重要生产服务建议先在测试机上验证跑 Linux Steam 恰好依赖它所以玩 Steam 的用户建议直接开着。深入 Box64 内部ARM 模拟器如何翻译 x86_64 指令解释器兜底DynaRec 提速Box64 的执行模型可以理解为翻译局 速记员的双人组解释器源码在 src/emu/x64emu.c逐条模拟 x86_64 指令慢但什么代码都能跑负责冷启动和边角代码DynaRec实现在 src/dynarec/dynarec.c 及其 ARM 后端则盯着热代码——循环、游戏主循环这类反复执行的块——把它们整块翻译成 ARM 指令并缓存起来后续直接执行本地指令这就是它比纯解释快 5-10 倍的原因。两者对同一个程序并存没翻译过的走解释器翻译过的走 DynaRec你调的那几个参数本质是在调翻译局多激进地合并代码块。库桥接为什么图形性能几乎无损x86 程序调用dlopen(libGL.so)时Box64 不会去模拟 OpenGL而是把它接到宿主机的本地 libGL 上——图形指令最终还是走你设备的 GPU 驱动。同理libc、pthread、SDL2 都有对应的 wrapped 层见 src/wrapped/ 目录。所以 Box64 的瓶颈主要在 CPU 翻译层图形和 I/O 路径基本是原生的。所有环境变量的完整语义——包括上文没覆盖的BOX64_TRACE、BOX64_PREFER_EMULATED等——都在 docs/USAGE.md 里按 Performance / Compatibility / Debug 分好类排查冷门问题时它是第一手字典。现在回到你的终端执行box64 --version确认版本挑一个手头的 x86_64 程序用BOX64_LOG2跑一遍把~/.cache/box64的生成情况看一眼。哪个环节报错把BOX64_LOG3的完整输出带进仓库提一个 Issue——对维护者来说一份带日志的崩溃报告比任何猜测都值钱。【免费下载链接】box64Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices项目地址: https://gitcode.com/gh_mirrors/bo/box64创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表