ARTICLE DETAIL

资讯详情

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

AnyPS5 --to-intel 完整指南:SSE4a/SHA-NI 指令如何被降级运行在 Intel CPU 上

AnyPS5 --to-intel 完整指南:SSE4a/SHA-NI 指令如何被降级运行在 Intel CPU 上 AnyPS5 --to-intel 完整指南SSE4a/SHA-NI 指令如何被降级运行在 Intel CPU 上【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址: https://gitcode.com/gh_mirrors/an/AnyPS5AnyPS5是一款将 PS5 可执行文件自动移植到 Linux 和 Windows 的工具无需模拟器或独立运行时进程。它的 relinker 负责把可执行文件转换为目标系统的原生格式并提供 系统 PRX 库 的动态链接实现。对于 Intel 宿主传入--to-intel参数即可把可执行文件及配套 PRX 中的 AMD 专属指令自动降级让你在 Intel CPU 上跑原本只认 AMD的游戏代码。为什么需要 --to-intel先搞懂 AMD64 专属指令PS5 主机用的是 AMD Zen 架构 CPU编译器可以理所当然地生成一些AMD 专属指令。但你在自己的电脑上运行移植后的游戏时CPU 很可能是 Intel 的——Intel CPU 并不认识这些指令直接运行会触发非法指令错误。常见的问题指令有两大家族指令族指令作用️SSE4aAMDEXTRQ/INSERTQ在 128 位 SSE 寄存器中按位域提取/插入数据SHA 指令AMD SHA-NISHA256RNDS2/SHA256MSG1/SHA256MSG2硬件加速 SHA-256 哈希运算此外替换表 中还登记了MONITORX、MWAITX、CLZERO、RDPRU、MCOMMIT、MOVNTSS等 AMD 指令的识别条目供扫描器匹配。 简单说EXTRQ/INSERTQ是寄存器里的位搬运工SHA 指令则是CPU 内置的哈希加速器。AnyPS5 的任务就是把这些AMD 方言翻译成 Intel 也听得懂的普通话x86-64 基线指令。一键转换步骤--to-intel 怎么用relinker 只依赖 C20 标准库任何符合标准的编译器都能构建。在 Intel 宿主机上只需在命令中加上--to-intelrelinker --to-intel input.elf output.elf完整的命令行选项可以在 CliArgs.cpp 的用法说明中找到例如还可以配合--windows输出 Windows PE 格式、--rpath path自定义库搜索路径、--autorun转换完直接运行等。--to-intel参数本身在 CliArgs.cpp 中解析随后在 main.cpp 中触发整个 Intel 转换流程并打印每一处替换的报告。揭秘降级机制原地替换与跳板桩两大模式转换的核心实现是 Amd64OnlyConverter.cpp。它的工作流可以分为三步1️⃣ 逐段扫描找出所有 AMD 专属指令转换器读取 ELF 的所有代码段用指令扫描器逐条解码再用指令匹配器判断哪些是 AMD 专属指令Amd64OnlyInstructionMatcher.cpp。2️⃣ 选择降级方式根据指令形态每条 AMD 专属指令会被分配两种降级方式之一见 Amd64OnlyConverter.cpp 的switchInPlace原地替换当 AMD 指令能翻译成等长的 Intel 指令序列时直接在原位置覆写。例如某些特殊场景下的EXTRQ可以简化为SHRD/PSRLDQ甚至删除再用NOP指令填充剩余空间Sse4aLowering.cpp 的LowerInPlace实现了这种优化填充用的 1~7 字节 NOP 模板定义在 替换表 中。Trampoline跳板桩/Stub当翻译结果比原指令更长时比如 SHA 指令展开成几十条 SSE 指令就地放不下。此时把原指令位置改写为一条 5 字节的jmp跳到一段新分配的桩代码区域执行完整逻辑执行完再跳回原处kJmpRel32定义于 替换表。桩体的生成由 StubBodyBuilder.cpp 负责。3️⃣ 安全校验绝不猜这里有两个严谨的防错设计非常值得新手学习分支落点检查跳板会改写一段连续空间如果其他分支指令恰好跳进这段空间中间就会出错。转换器会先收集所有分支目标地址发现分支落入 AMD 指令内部的情况直接报错_collectBranchTargets。不支持就报错遇到没有降级方案的 AMD 指令或跳转超出 x86-64 相对分支范围的情况程序会抛出明确的CodegenException错误信息里附带文件偏移见 CodegenException.hpp 与 main.cpp 的异常处理而不是生成一个能跑但结果错误的坏文件。SSE4a 降级详解一条 EXTRQ 如何变成一串 SSEEXTRQ/INSERTQ的翻译是纯位运算组合拳实现在 Sse4aLowering.cpp。按指令形态分三条路径字节对齐 长度 8 的倍数直接用一条PSHUFB字节洗牌指令搞定L114-L119这是最快的路径非对齐的 EXTRQ用PSRLDQ/PSLLDQ移位 PSRLDQ掩码截取位域L120-L127非对齐的 INSERTQ先用PXOR 掩码在目标寄存器挖出坑再把左移后的源数据POR进去L138-L154寄存器形式的 INSERTQ需要拆分源寄存器的高/低 64 位再重组使用 3 个临时寄存器完成_emitInsertqRegisterForm。操作数解析区分内存形式/寄存器形式、提取 index 和 length由 Sse4aOperands.cpp 完成。SHA-NI 降级详解把硬件哈希展开为纯 SSE 逻辑SHA 指令的降级更复杂——SHA256RNDS2一条指令对应 SHA-256 压缩函数里两轮完整的 64 位运算展开后需要 8 个临时寄存器。实现在 Sha256Lowering.cppΣsigma函数如BigSigma0(x) ROTR2(x) ⊕ ROTR13(x) ⊕ ROTR22(x)用PSRLDQ/PSLLDQ循环移位加PXOR异或组合实现_sigmaCh/Maj 布尔函数Ch(e,f,g) (e ∧ f) ⊕ (¬e ∧ g)这类逻辑被拆成PAND/PXOR序列_choose、_majority两个轮次 状态写回_emitRounds 完成 T1/T2 计算并更新 ABCD 状态SHA256MSG1/MSG2的消息扩展逻辑在 _emitMessage1 和 _emitMessage2 中展开。操作数的指令类型识别RNDS2/MSG1/MSG2在 Sha256Operands.cpp 中处理。 由于 SHA 指令展开后远长于原指令它们必然走 Trampoline 跳板路径——这也解释了为什么桩代码区需要预留空间并做 16 字节对齐kStubAlignment见 替换表。转换报告怎么看读懂你的转换日志运行--to-intel后控制台会输出类似这样的报告打印逻辑在 main.cppIntel substitution: SHA256RNDS2 at 0x1a2b3 (2 bytes) - stub 196 bytes Intel substitution: EXTRQ at 0x2c4d1 (3 bytes) - in place 3 bytes Intel conversion: 1 in place, 3 stubsin place原地替换字节数保持相等零跳板开销stub生成跳板桩原位置变成短跳桩体长度即报告中的字节数若遇到无法处理的指令输出会是FAIL: AMD-only instruction without Intel lowering: XXX (offset 0x...)——这是严格报错设计宁可失败也不给你留下隐患。这些跳板桩最终随 LinuxElfPatcher 一起写进输出文件main.cpp 中的 Patch 调用。常见问题 FAQ❓ 我的游戏在 AMD 电脑上能跑Intel 电脑上不行该怎么办先重新用--to-intel转换一次确认转换报告中没有FAIL。如果转换成功但运行崩溃检查崩溃地址是否落在跳板桩区域附近并把报告反馈给开发者。❓ 为什么不支持的指令不是自动跳过而是直接报错因为静默跳过会产生看似能运行、实则数据错误的坏产物尤其是哈希相关的代码对游戏存档、在线校验这类场景危害极大。项目的整体风格就是不支持的状态严格抛异常见 README--to-intel也遵循同样的原则。❓ 转换会影响性能吗原地替换路径性能损失很小几条基线 SSE 指令替代一条专属指令SHA 指令走跳板时每次调用多一次间接跳转且展开的 SSE 序列比硬件指令慢——但换来了在 Intel CPU 上运行的能力属于典型的空间换可用。❓ 只移植到 Windows 还需要 --to-intel 吗需要与否取决于目标机 CPU而不是操作系统。只要最终运行在 Intel CPU 上无论 Windows 还是 Linux都建议加上--to-intel。想深入源码从这里入手如果你想动手研究这套降级系统推荐按以下顺序阅读IAmd64OnlyConverter.hpp —— 转换器接口定义30 行看懂全貌Amd64OnlyConverter.cpp —— 扫描、降级决策、跳板生成的主流程Sse4aLowering.cpp Sha256Lowering.cpp —— 两个指令族的完整降级实现Amd64OnlyConverterTests.cpp —— 测试用例展示了各种指令形态的期望转换结果配合项目的开发约定文档和技术债务清单你就能理解整个 relinker 模块的设计思路。【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址: https://gitcode.com/gh_mirrors/an/AnyPS5创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表