首页 / 资讯中心 / 文章详情

Madeira的FEX-Emu一致性测试:1283条指令的黄金值测试套件

Madeira的FEX-Emu一致性测试:1283条指令的黄金值测试套件 ★ FEATURED ARTICLE
Madeira的FEX-Emu一致性测试1283条指令的黄金值测试套件【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/MadeiraMadeira 让 iPhone 免越狱运行 x86-64 Windows 游戏核心靠 FEX-Emu 把 x86 指令实时翻译成 ARM64。翻译器一旦译错指令游戏就会莫名其妙崩溃——于是项目内置了一套FEX-Emu 一致性测试tests/x64/ 下的黄金值测试套件用 1283 条指令的黄金值golden value逐位校验翻译器输出任何偏差都逃不过日志里的一行VERDICT。为什么需要黄金值测试上游 CI 覆盖不到的地方一致性测试conformance test回答的问题很朴素翻译后的 x86 指令寄存器结果和真机是否逐位一致FEX-Emu 官方自带 2239 条手写 x86-64 指令测试每条测试的汇编头部都带一个CONFIG配置块写明执行完后各寄存器应等于的精确值——这就是黄金值。这些值由深谙 x86 语义陷阱的开发者标注覆盖自研测试难以企及的边界场景。问题在于FEX 的官方测试运行器是Linux 工具依赖 ELF 加载和 Linux 系统调用在 Madeira 的目标环境iOS 自研 FEX 分支 ARM64EC/xtajit64 路径 jitless 模式上完全无法运行。而恰恰是上游 CI 从未跑过的配置组合才是分歧最容易藏身的地方。1283 条黄金值测试是怎么生成的gen_asmconf.py 是整套测试的生成器它做四件事步骤做法目的1️⃣ 筛选从 FEX 的 2239 条测试中筛出无特性门槛HostFeatures、带寄存器期望值、可解析的测试得到1283 条可用测试ASMCONF_NTESTS 12832️⃣ 改名每条测试的裸标签加唯一前缀避免 1283 段汇编合并后标签互相打架3️⃣ 改写hlt测试以hlt结束被改写成跳入采集尾声尾声把 16 个 GPRRAX~R15 16 个 XMM 寄存器存入采集缓冲区4️⃣ 一测一文件每条测试单独生成一个.asm目标文件NASM 宏是全局的合并编译会让测试 900 的宏悄悄改写测试 200 的语义生成的期望值表 asmconf_tests.h 约 8400 行形如{ movzx.asm, 2, 0, 0x00000000000000D1ULL }, { pslldq.asm, 16, 0, 0xADBEEFBAD0DAD100ULL },含义是测试movzx.asm执行后2 号寄存器RCX必须精确等于0xD1。测试体则被重新托管进一个 Windows PE 可执行文件在真实出货配置下运行。测试驱动器的三重自校准宁可报错不可谎报驱动程序 asmconf-x64.c 的注释里有一句狠话——this port has been burned repeatedly by probes that could not fire and therefore always passed这个移植曾被永远通过的假探针坑过多次。因此驱动器设计了三层防谎报机制1. 关键内存区必须就位否则整轮作废867 条测试依赖固定地址0xe0000000的暂存区含测试栈共 129 MB 保留。驱动器启动即检查该地址是否成功保留失败就直接输出VERDICT: INVALID RUN — not reporting passes并退出——不保留假通过的可能见 asmconf-x64.c。2. 先报名再执行每条测试运行前日志先刷入它的名字再落盘。万一某条测试把进程打死日志末尾留下的是它的名字而不是一个查无对证的空洞。3. 可续跑扫描 预期计数核对有些测试会重定向 RSP 后触发无法捕获的故障进程直接死亡。驱动器在运行前把下一条测试编号写入C:\asmconf_next.txt下次启动自动从断点续扫并把肇事者标记为 fatal。最终汇总打印预期测试总数跑短了会被明确警告result NOT conclusive——截断的运行伪装不了干净的结果。如何阅读测试报告一行 VERDICT 定音测试写入C:\asmconf.log格式对人类非常友好[asmconf] start revml541 tests1283 expected-values... [asmconf] 42/1283 movzx.asm [asmconf] FAIL pslldq.asm [asmconf] XMM0[0] expected 0xADBEEFBAD0DAD100 got 0x0000000000000000 [asmconf] DONE ran1283/1283 pass1281 fail2 crash0 revml541 [asmconf] VERDICT: DIVERGENCE FOUND — see FAIL/CRASH lines above行进度与当前测试名FAIL行精确到寄存器、lane给出期望值 vs 实际值定位分歧一目了然CRASH行翻译出的指令直接触发异常VERDICT行no divergence across the suite表示 1283 条指令全部与黄金值一致翻译器通过一致性验证。测试套件文件速查文件作用gen_asmconf.py从 FEX 黄金值测试生成 1283 条 PE 测试与期望值表asmconf-x64.c自校准测试驱动器在出货配置下执行并判定asmconf_tests.h自动生成的测试表 黄金值表8400 行勿手改FEX黄金值测试的原始来源FEX 子模块docs/BUILDING.md完整构建流程小结这套 FEX-Emu 一致性测试的精髓在于工程纪律黄金值来自上游 2239 条人工标注的指令测试却只在自己的出货配置下才有意义生成器、驱动器、期望值表全部自动产出截断、崩溃、假通过都被机制性地排除在外。对想理解如何在 iOS 上验证 x86 翻译器正确性的读者来说tests/x64/ 这三个文件就是一份完整的实操范本。【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站