恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
AnyPS5 技术债清单:静默桩、未知签名与功能缺口的源码级盘点
首页
资讯中心
/
AnyPS5 技术债清单:静默桩、未知签名与功能缺口的源码级盘点
AnyPS5 技术债清单:静默桩、未知签名与功能缺口的源码级盘点
发布时间:2026/10/9 2:02:57
逆向工程图形学【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址https://gitcode.com/GitHub_Trending/an/AnyPS5点击查看免费下载本文基于 AnyPS5 仓库中的官方技术债文档 TechnicalDebt.md完整梳理该 PS5 可执行文件移植工具当前的三类已知债务构建环境限制、静默桩silently do-nothing 的导出函数、未知函数签名与语义以及功能性缺口。读完本文你能准确判断 AnyPS5 中哪些系统库行为是验证过的实现、哪些是有依据的假设、哪些是会静默返回成功但不产生效果的占位代码并在调试游戏兼容性问题时快速定位到对应的源码文件。项目背景一条硬性契约AnyPS5 的定位见 README.md它包含一个 relinker把 PS5 可执行文件转换为目标系统Linux/Windows的原生格式并实现一组系统 prx 库供动态链接不做模拟、不引入额外运行时进程。架构总览见 ARCHITECTURE.mdrelinker 按 NID 读取导入、过滤未使用的 NID、构建 SysV 动态段构建期 nid_patcher 再把每个导出重命名为其 NID。整个项目的核心契约是 TechnicalDebt.md 开宗明义写下的项目中每个函数在每一阶段要么精确地做它该做的事要么抛异常。README 中亦有对应表述不支持或意料之外的状态严格抛出std::runtime_errorwhat()打印到 stderr 后进程终止。但契约存在例外技术债文档按四个小节把例外全部登记在案Build构建限制、Silent stubs静默桩、Unknown function info未知函数信息和Functional功能性缺口。下面逐节展开。构建债务Windows 工具链的硬约束文档 Build 小节记录了两条债务Windows 构建只支持特定版本的 MinGWMinGW-w64 GCC 15.2.0WinLibs 构建winlibs-gcc15线程/异常模型为x86_64-ucrt-posix-seh。BUILD.md 给出了更精确的版本号release15.2.0posix-14.0.0-ucrt-r7并要求配置 CMake 前把其mingw64/bin加入PATH。Windows 上编译出的 prx 库要求三个运行时 DLL 就近存放libgcc_s_seh-1.dll、libstdc-6.dll、libwinpthread-1.dll。文档明确说明不能把这些依赖静态链接——静态化会导致符号冲突因此产物旁边必须带齐这三个 DLL。这条债务的实际影响是在 Windows 上发布或分发转换结果时运行目录布局要包含这三个 DLL而 Linux 构建路径GCC/G/binutils CMake 3.22.1 Ninja C20详见 BUILD.md没有这类限制。静默桩返回成功但不产生效果的导出Silent stubs 小节登记了所有违反契约的例外——这些函数既不抛异常也没有完整实现真实效果而是返回成功或一个固定的空路径结果。按领域分组如下每一项对应的源文件链接均引自 TechnicalDebt.md。对话框族状态机照转界面没有libSceSaveDataDialog.native仅登记为静默桩。从源码看它维护一个静态g_status状态机SAVE_DATA_DIALOG_STATUS_NONE/INITIALIZED/FINISHEDsceSaveDataDialogGetResult直接填充RESULT_OK和BUTTON_ID_OK没有任何 UI。libSceMsgDialog.nativesceMsgDialogOpen在无 UI 的情况下直接以按钮 1 结束因此sceMsgDialogClose返回NOT_RUNNINGsceMsgDialogInitialize之前的调用结果遵循 libSceMsgDialog 的语义。源码可以印证sceMsgDialogOpen直接把状态置为COMMON_DIALOG_STATUS_FINISHED常量定义在 Export.cppRUNNING2、FINISHED3result-button_id BUTTON_ID_OK即 1NOT_RUNNING错误码为0x80B8000B。libSceCommonDialog仅登记为静默桩。libSceErrorDialog错误对话框运行了状态机但不显示任何内容传入sceErrorDialogOpen的错误码只会被记录日志。libSceLoginDialog运行公共对话框状态机但不显示内容并报告用户已取消。libScePlayerInvitationDialog在 Functional 节登记模拟对话框完成但不发邀请scePlayerInvitationDialogGetResult报告USER_CANCELED40 字节的结果布局取自 SharpProspero 的互操作定义未在标题上验证。libSceCdlgPlayerReviewscePlayerReviewDialogOpen立即完成结果报告用户取消行为与sceWebBrowserDialogOpen相同。头显、外设只实现无设备路径libSceHmd只实现头显未连接的路径——初始化成功、设备查询报告NotDetected、打开设备返回DeviceDisconnected头显支持、追踪、渲染及额外 HMD 导出均未实现SDK 级 ABI 兼容性与游戏内行为未验证。libSceHmd2没有 PS VR2 运行时——sceHmd2Initialize直接失败其余导出包括 libSceVrTracker2 的所有导出全部抛异常。源码确认了失败码SCE_HMD2_ERROR_UNSUPPORTED_FEATURE0x81110016在 Export.cpp 定义并在 初始化路径 返回。文档同时说明PPSA01317 在初始化失败时会跳过整个 VR 初始化流程因此这一桩不阻断该标题。libSceMbus只实现无设备路径——初始化/终止成功、无设备事件、设备查询返回零条目。libSceBluetoothHid只实现无设备路径——初始化、回调注册、设备注册成功回调因无设备连接永不调用需要已连接设备的调用抛异常。libSceImeFunctional 节键盘开着时sceImeKeyboardGetInfo对每个 id 返回0x80bc0023无资源 id因为 IME 键盘从不报告已连接设备sceImeKeyboardSetMode校验模式位但无效果。音频、视频、网络成功但无声/无流/不出网libSceAudio3d移植后不产生声音。对象可以保留但库没有 bed 导出或sceAudio3dObjectSetAttributes来给对象配音频因此sceAudio3dPortPush只是按每帧granularity个采样48 kHz给队列节拍sceAudio3dPortSetAttribute接受 late reverb level 与 downmix spread 两个属性并忽略它们。libSceTextToSpeech2没有语音引擎——sceTextToSpeech2Initialize失败源码返回内核的EOPNOTSUPP0x8002002D见 Export.cpp其余导出抛异常PPSA01317 在初始化失败时跳过旁白设置。libSceAvPlayersceAvPlayerSetLogCallback接受的回调永不调用播放器不产生日志消息sceAvPlayerSetAvailableBandwidth无效果因为它管辖 HLS 源而sceAvPlayerAddSource未实现。libSceHttp2没有请求真正到网络sceHttp2SetMinSslVersion没有可限制的 TLS 连接对任意id返回成功sceHttp2SslEnableOption同理prosper 对未知 id 返回无效 id 错误。libSceHttp无请求出网sceHttpSetResponseHeaderMaxSize没有可限制的响应头、sceHttpRedirectCacheFlush没有可遗忘的重定向sceHttpsUnloadCert像sceHttpsLoadCert一样返回成功尽管后者并不保存证书。sceVideoOutOpen校验 open 参数中 VideoOut 服务线程的优先级与 CPU 亲和性但不应用它们——端口 present/vblank 线程是宿主线程guest 的优先级与亲和性到不了宿主调度。从 Output.cpp 可见校验逻辑setPriority1时检查priority落在VIDEO_OUT_SERVICE_THREAD_PRIORITY_HIGHEST..LOWEST区间affinity非 0 且是VIDEO_OUT_SERVICE_THREAD_AFFINITY_ALL的子集而函数体并不把二者写入宿主线程。libSceAudioPropagation只实现无声学传播路径——系统把 16 字节头保存在标题的 CPU 内存非 GPU 内存中rooms/portals/sources/materials 是被跟踪的句柄属性会被校验但无效果不请求光线源不报告音频路径射线结果、路径计算与音频路径只接受空值否则抛异常sceAudioPropagationSourceRender按给定大小向各源输出缓冲区写静音清零没有 dry 信号。遮挡、反射、混响缺失游戏内行为未验证。libSceNpCommercePS Store 图标显示/隐藏调用与sceNpCommerceSetPsStoreIconLayout什么都不做。libSceSystemServicesceSystemServicePowerTick、sceSystemServiceReportAbnormalTermination、sceSystemServiceDisableMusicPlayer、sceSystemServiceReenableMusicPlayer返回成功但不做实事——宿主既没有自动关机定时器可重置也没有系统崩溃上报器可通知更没有系统音乐播放器可暂停/恢复。libSceNpTrophy2sceNpTrophy2RegisterUnlockCallback接受的回调永不调用永远没有奖杯解锁sceNpTrophy2UnregisterUnlockCallback只返回成功。ulobjmgr不注册任何对象——_sceUlobjmgrRegisterObject恒定发放 id 0_sceUlobjmgrUnregisterObject不释放任何东西与 shadPS4 的做法一致。着色器重编译器的 barycentric 缺口在缺少VK_KHR_fragment_shader_barycentric的硬件上着色器重编译器不加载 barycentric VGPRv_interp_p1_f32被丢弃v_interp_p2_f32改读 Vulkan 插值的属性因此任何把 barycentric 用于v_interp之外的像素着色器都会得到错误的值。源码印证InstructionTranslator.cpp 中只有在options.fragmentShaderBarycentricEnabled为真时才把BaryCoordSmooth/BaryCoordNoPerspective内建绑定到像素输入 VGPRAttributeInstructions.cpp 则对直通输入却用v_interp_p1/p2读取的情况直接抛异常。sceAvPlayerSetTrickSpeedlibSceAvPlayer负速把时钟倒着走但不送帧再次设置正向速度后播放从回退后的时间点恢复。Unknown function info假设的签名与未验证的语义这一节是清单中最长的部分逐条登记能跑但依据不足的导出。它们的共同模式值得先说清楚这也是理解每条条目的钥匙签名来源分几档aerolib 的 NID 列表只有函数名无参数、标题调用点PPSA 编号标识的游戏如 PPSA01317/PPSA12544/PPSA14632/PPSA23566、跨项目参考实现shadPS4、KytyPS5、SharpProspero、ampr_emu、OpenAGC、prosper、RPCS3/RPCSX、Mesa、Orbital、fpPS4、etaHEN 等。验证等级显式标注not confirmed on a title / on hardware未在标题/硬件上确认、unverified未验证反复出现凡只靠单一参考实现且该实现本身是猜测的条目会写清只有 X 有函数体。拿不准就抛错误码未知时宁可抛异常也不伪造返回值如sceAudioPropagationSourceGetAudioPath、sceHttpSetRequestStatusCallback的调用时机。代表性条目AMPR/AMM/APR 子系统libkernel 的 Apr 实现 是假设密度最高的一块文档对 AMPR异步内存管道相关导出逐条标注了依据AMPR 计数器访问WaitOnCounter_04_00、WriteCounter_04_00、ConstructNop、ConstructMarker的签名与检查取自 ampr_emu 重写该参考把计数器命令直接交给主机核不体现效果。计数器按每个 32 位建模8 字节访问跨 n低与 n1高两个计数器2/1 字节访问按偏移选半个/一个字节等待按访问宽度比较含符号与回绕比较AND 掩码作用于两侧原子写在访问范围内回绕。ConstructNop的 type 未被记录。AMM map / map direct / unmap签名与保护掩码CPU、GPU、AMPR、ACP 读写位取自 ampr_emu映射器模型取自 PS5PCEMsceAmprAmmGiveDirectMemoryusage 1 把分配的直接内存交给普通 map 取页的池usage 0 只分配。AMM 虚拟地址范围是 guest 竞技场中首次使用时预留的 32 GiB 区间与 32 GiB 多映射区间不是主机的范围范围外映射抛异常地址、大小与直接偏移必须 16 KiB 对齐内存类型与 GPU 掩码被忽略AMPR/ACP 访问按 CPU 访问映射未映射页退回池并保持保留提交时先运行完缓冲再返回提交结果恒 0失败命令抛异常。AMM remap / multimap / 保护变更签名与保护/掩码检查取自 ampr_emu效果是从函数名推断的未在标题上确认。remap 把完整映射范围的每页搬到新地址并保留旧范围multimap 在第二地址映射同一批页池页在最后一次映射解除后回到池对自己的源范围 multimap 抛异常对未完整映射范围的命令抛异常。AMM PRT 范围签名、检查及其顺序取自 ampr_emu效果同样从名字推断。无支撑的 PRT 页是带 GPU 读权限的填零页CPU 读看到零而非缺页GPU 写会缺页而非被丢弃。APR gather/scatter 读签名、参数检查与读游标取自 ampr_emu未在任何标题上确认gather 读该文件到新偏移并写到下一个目的scatter 在同一文件继续写到新目的与 ampr_emu 一致sceAmprCommandBufferReset保留该状态缓冲内未读先 gather/scatter 时抛异常而非返回SCE_AMPR_ERROR_APR_INVALIDGATHERSCATTERSTATE。代表性条目单函数级别的假设sceHmd2Initialize主机 PS VR2 不可用时主控机返回什么错误未知实现借用 libSceHmd 的UNSUPPORTED_FEATURE0x81110016。PPSA01317 传 16 字节全零指针只测结果非零——所以该假设足够该标题使用。sceMbus / libSceDeviceService签名取自 PPSA01317 的调用sceDeviceServiceInitialize(3, 0)、轮询sceDeviceServiceGetEventState(1)bit 0/1 置位时再查询sceDeviceServiceQueryDeviceInfo_(0x7001, 0, 0, infos, 1, count, unknown, 0x70)负结果视为错误、count为条目数。主机无设备事件状态 0查询返回 0 且count0。sceAppContentDownloadDataGetAvailableSpaceKbparam.json声明downloadDataSize0 的标题得到 0 KB 与 OK无下载数据区的主机行为未验证也可能返回错误。KytyPS5 不特判shadPS4 桩为 1048576 KB。scePadOpenExt只处理特殊端口type 2且因主机没有特殊手柄而返回DEVICE_NOT_CONNECTED0x80920007主控机是否先开句柄再报断连未知。PPSA01317 传 16 字节参数按 vendor/product id 命名设备0x0eb7:0x0e04负结果即跳过用户其他端口类型抛异常。s_setkill着色器重编译器对任意立即数解码为s_endpgm——在 RDNA2gfx1035硬件实测其前的 store 可见、其后的指令不执行它设置的 KILL 状态位与s_endpgm的可观察差异未验证。sceRtcParseDateTime接受的格式被假定为 ISO 8601 子集YYYY-MM-DDTHH:MM:SS[.ffffff]T/t/空格分隔符、可选小数秒加 RFC 3339 时区后缀Z或±HH:MM外加 RFC 2822 形态与 asctime 形态shadPS4 按固定位置解析星期名不与日期核对无时区的串按 UTC形态之外的输入抛异常而非返回解析错误——全部未经硬件验证。sceVideoOutRegisterBuffers2buffer option 8STRICT_COLORIMETRY被当作 option 0 呈现存储值不变主控机对此做什么未知只接受 0 与 8。DCC 缓冲category 1dcc_control按 CB_DCC_CONTROL 块布局解释且只接受 bit 0x10026cdcc_cb_register_clear_color作为清屏 texel只呈现 32 位值。sceVideoOutIsOutputSupported输出模式编码未知——除默认模式外一律报告不支持0sceVideoOutConfigureOutput返回VIDEO_OUT_ERROR_UNAVAILABLE_OUTPUT_MODE而不是UNSUPPORTED_OUTPUT_MODE。PPSA12544 探测0xd000000a支持则选 7680 像素否则 3840。sceAudio3dObjectReserve对象 id、max_objects限制与保留/取消的检查遵循 shadPS4PS4唯一有函数体的参考id 每端口从 1 递增跳过 0、0xFFFFFFFF 与已用 id失败保留写 0xFFFFFFFF。sceKernelGetModuleInfoFromAddr0x1A8 字节信息布局遵循 shadPS4 重写flags语义未知、只接受 2id 是sceKernelLoadStartModule句柄或同区间的稳定 id名称是去掉.guest.prx的宿主文件名超过 4 个加载段的镜像转换后可执行文件有 7 个只报前 4 个tls_offset为 0、ref_count为 1宿主加载器两者都不暴露。Windows 上未实现。sceUserServiceGetNpAccountId无绑定 PSN 账户的用户假定账户 id 为 0 且成功libSceNpManager 的sceNpGetAccountIdA对同一问题回答SCE_NP_ERROR_SIGNED_OUT。同文件的sceUserServiceGetUserColor假定默认头像色是蓝0。sce::Json::Parser::parse溢出 double 的数字如1e309抛异常——主控机是拒绝文档还是存无穷大未知。sceSaveDataTransferringMountPs4 / sceSaveDataDirNameSearchPs4参数假定为sceSaveDataTransferringMount与sceSaveDataDirNameSearch的对应参数KytyPS5 把两个 NID 都绑到 PS5 函数prosper 在标题上捕获到相同的结果布局。因为没有 PS4 存档区mount 返回NOT_FOUNDsearch 报告零命中。NGS2 一族libSceNgs2.nativemastering voice gain 参数 id0x30000004取自 PPSA22520、布局取自 shadPS4 的OrbisNgs2MasteringVoiceGainParam无参考给出单位与范围2 声道 mastering voice 渲染进 6/8 声道缓冲时假定左右进前两通道、其余静默PPSA21402 的真实用例sampler filter 参数0x1000000a只遵循 KytyPS5voice 在最后一块后继续播放滤波器尾部直到历史归零1e-20 以下清零。未知名称的 NID文档还登记了一串只有 NID 串、名称与签名都未知的导出例如 libSceNpPartner001 的7CxI50-xlCk、pMxXhNozUX8PPSA23566 导入libScePsml_debug 的0GAw7SmkwII等 9 个libSceVideoOut 的kP2L8t3j-aM与LibwuIonIBwlibSceAgc 的 ShaderFusion/InterpolantMapping/PacketInfo/DcbFlow/DcbState 若干文件 中的fd5Bp5tGTgo、dolOmWHhuQ、dbOlWdppb4o、VUgBtQhn0、zARR5aCmkoY、qj7QZpgr9Uw、gQkqkLttcpw、vieBRwlh1Lw等以及 libSceAjm.native 中 libSceAjmWVorbis 的Z4HDpe1ZEa4、oXShHcqMcX0与 libc 的BnMAMrsfVWo。它们大多以APS5_EXPORT(nid, func)形式按 NID 直接绑定参见 ARCHITECTURE.md 对APS5_EXPORT的说明。无实现的批量导入文档末尾成组登记了被某标题导入、声明无参数的函数族AudioIn、Net、Ssl、SystemService、Vdecsw、Ajm、AjmWVorbis、Http2 等例如 libSceVdecsw 的整组sceVdecsw*导出、libSceVoice 的sceVoiceSetMuteFlag、libSceCoredump 的sceCoredumpAttach*等签名均为 unknown。功能性缺口Functional实现存在但模型不完整Functional 节记录的是实现了但主机侧模型与主机存在可观察差异的行为按子系统归纳内核与进程sceNetSendmsg / sceNetRecvmsg把散集列表拷过单个宿主缓冲只接受sceNetSend/sceNetRecv接受的标志发送控制数据抛异常接收永远不返回控制数据msg_controllen0因为没有支持排入控制数据的套接字选项。sceKernelInstallExceptionHandler记录 handler 后宿主缺页仍会结束进程——只有sceKernelRaiseException主动引发的信号会被投递。Unity 的 PS5Util 模块安装 SIGUSR1 handler读取uc_mcontext.mc_rsp上下文偏移 0xf8并向其他线程发 SIGUSR1 以停住它们做 GC。相关限制链同一文件sceKernelRaiseException仅 Windows 投递、Linux 上抛异常handler 的ucontext按 FreeBSD amd64 布局构造16 字节 sigmask、mcontext在 0x40、mc_rsp在 0xf8除 PS5Util 读的字段外布局未验证不查询目标线程的信号掩码Windows 上只保存/恢复CONTEXT_FULL | CONTEXT_FLOATING_POINThandler 或入口用 AVX 时 YMM 高半部不保留通过 APC 到达阻塞在可中断TimedWait的线程而其他任何阻塞点含APS5_COARSE_TIMED_WAITS下所有等待与模拟器内部宿主等待会被重定向、只在等待返回后执行 handler。Thread cancellation未建模——scePthreadCancel抛异常因此永远不会有待处理的取消请求scePthreadTestcancel/pthread_testcancel无动作返回scePthreadSetcancelstate/scePthreadSetcanceltype设置的取消状态与类型只存储不使用。libSceUlt 队列用预分配的宿主存储替代传入的 guest 工作区原有大小公式与 512 字节对象布局未验证等待队列池线程上限与等待者优先级未实现终结时以ULT_ERROR_STATE唤醒阻塞的队列调用者。补齐的sceUltQueuePop、sceUltQueueTryPush、sceUltQueueDestroy、sceUltQueueDataResourcePoolDestroy签名是从现有 push/pop 与对象 API 推断的队列销毁假定以ULT_ERROR_BUSY拒绝阻塞调用者、池耗尽返回ULT_ERROR_AGAIN非空队列/数据池选项参数因布局未知而抛异常。追加内容libSceAppContent不安装不挂载——sceAppContentAddcontMount对每个 entitlement label 答NOT_FOUNDsceAppContentGetAddcontInfo答DRM_NO_ENTITLEMENTsceAppContentGetAddcontInfoList报告 0 条。AGC 驱动命令包执行的保守边界COND_EXEC在同队前序命令完成后才读条件缺少PFP_SYNC_ME时主机图形的 PFP 会提前于 ME 读取竞态标题会在这里看到更晚的值。COND_EXEC 范围内的 flipCommandValidation.cpp抛异常flip 在提交缓冲时随视频输出预留主机如何撤回被跳过的 flip 未知。COND_EXEC 范围必须整包持有并结束在自己的命令缓冲内范围内的链式INDIRECT_BUFFER或REWIND抛异常。COND_INDIRECT_BUFFERsceAgcCbBranchSubmission.cpp只支持恒真比较函数带比较或谓词包抛异常。mode 1 与 2 执行第一个缓冲假定为 AMD PM4 包的 if-then 与 if-then-else 模式。sceAgcCbBranch 不检查恒真分支的比较地址或空缓冲的地址——PPSA14632 传了未初始化的比较地址与 0 dword 的 null else 缓冲。PA_CL_CLIP_CNTL的DX_LINEAR_ATTR_CLIP_ENAbit 24清零被当作置位绘制Vulkan 的NoPerspective裁剪清零位在主机的差异无文档。**DCC 显示缓冲**只从均匀未压缩或 fast-clear key 呈现其他 key 与跨待处理镜像的 register-clear key 抛异常。key 按每 256 字节 1 字节读取驱动模型不是主机布局。用户数据寄存器标题从未写入的SPI_SHADER_USER_DATA_*/COMPUTE_USER_DATA_*寄存器在该 stage 的 RSRC2 计数覆盖它时读作 0与 Kyty 的零化UserSgprInfo、SharpEmu 的缺寄存器读 0、AMD PAL/Mesa 的初始化一致主机的值未确认。SET_PREDICATION布尔谓词遵循 Mesa 使用的 AMD PM4 编码——操作 3 读 64 位、操作 4 读 32 位bit 8 在值非零clear 时为全零时执行被谓词化的包bit 12 提示被忽略地址低 4 位须清零。查询谓词Z-pass、原始计数、被谓词化的 COND_EXEC、谓词化命令缓冲链与 flip 均抛异常。资源注册注册恒失败于RESOURCE_REGISTRATION_UNAVAILABLE因此 owner/resource 查询、sceAgcDriverSetResourceUserData、sceAgcDriverFindResourcesPublic、sceAgcDriverUnregisterAllResourcesForOwner不读参数即返回同一错误参数列表仿 libSceGnmDriver 对应物未验证sceAgcDriverGetResourceRegistrationMaxNameLength写 0xfc 返回 0。着色器注册任意地址都接受着色器头——PPSA26344 传过偏移 4 字节与偏移 1 字节的头越出 8 字节边界主机是否拒绝非对齐未知。着色器重编译器数值与访存近似MIMGtfe与lweRdnaImageOpDecoder.cpp数据之后从不写状态 VGPR。硬件上仅当取 texel 命中部分驻留纹理的未映射页、或lwe在 sample/gather 且 LOD 低于 T# 的MIN_LOD_WARN时才写这里纹理内存恒驻留lwe在 sample/gather/image_get_lod上抛异常。非归一化 S# 坐标GuestSamplerResource.cppFORCE_UNNORMALIZED用 VulkanunnormalizedCoordinates采样器故 S# 的 LOD 范围、LOD bias 与 mip 过滤不生效——只有单层视图时才是精确的。重编译器侧DescriptorBindingBuilder.cpp只接受直接寻址、且仅用于无偏移/无比较/无导数/无_a的显式 LODimage_sample且限于 mip 0 的单层 1D/2D 视图。min/max 归约FILTER_MODE 1/2用 Vulkan 的 min/max 归约与 RADV 编程相同的SQ_IMG_FILTER_MODE值在 gfx1035 实测而非主机只归约非零权重 texel权重取 8 位 subtexel 网格取整后。镜像原子与位宽访问32_SINT/32_FLOAT 表面的镜像原子通过 R32_UINT 存储视图作用于原始 dword假定其浮点结果与 32_UINT 表面实测一致64 位镜像原子需要VK_EXT_shader_image_int64类特性并作用于 32_32 UINT/SINT/FLOAT 表面。LDS 64 位原子SpirvMemoryInstructions.cpp两个 dword 在 guest LDS 之后存储的 workgroup 锁下读写因为 LDS 是没有 64 位原子的 32 位数组——它们只彼此原子与并发 32 位访问无排序64 位 GDS 原子抛异常。ds_wrxchg2*交换指令SharedMemoryInstructions.cpp翻译为两次独立的 32/64 位原子交换RDNA2 硬件gfx1035 实测保证同一 wave 或不同 wave 的地址重叠时所有 lane 的第一次交换先于任何 lane 的第二次——重叠场景下结果可能与硬件不同。offset0 offset1抛异常而硬件上是按序两次交换。sRGB 与转换格式8_SRGB/8_8_SRGB 在设备不能采样 R8_SRGB/R8G8_SRGB 时load 返回 bf16 精度、四舍六入五成双的 sRGB EOTFgfx1035 实测PS5 的 gfx1013 未测能采样该格式的设备用自己的解码如 NVIDIA 的 R8_SRGB 在 256 个码值中 29 个偏 1 个 bf16 步。转换 unorm 图像10_11_11_UNORM 等的采样经 R32_UINT 视图进行OpFDiv允许至多 2.5 ULP 偏差部分驱动不位精确StoreTexel对双通道格式从 DST_SEL 为 Y 的数据槽写通道 1而 gfx1035 对 X,Y,Z,W 的 DST_SEL 是从 W 槽写。浮点近似FloatInstructions.cppv_rcp/v_rsq/v_sqrt/v_log/v_exp/v_sin/v_cosf32 与 f16用驱动近似而非主机近似低位可能不同只有 NaN/无效/零/无穷及 sin/cos 的精确零点按位挑选v_fma_f64仅在规约输入下精确融合次正规输入退化为独立乘加两次舍入v_fma_legacy_f32VOP3 0x140假定是融合的未实测——LLVM 把该编码解码为v_mad_legacy_f32且实测v_mac_legacy_f32VOP2 0x06先舍入乘积。MODE 寄存器被忽略ScalarInstructions.cpps_setreg_b32的写入含浮点舍入/非规格化控制无效果s_getreg_b32读 MODE 恒报四舍六入五成双输出修饰符mul:2/mul:4/div:2按 IEEE 关、f32 次正规 flushLLVM 图形默认建模。lane 读取语义宿主 subgroup 窄于 32 lane 时threadBit读到的是低位 lane 的 EXEC 位v_readlane_b32与 fetch-inactive 的v_permlane16_b32/v_permlanex16_b32对宿主 subgroup 不持有的 lane 读到未定义数据而主机读该 lane 的 VGPR。buffer_load_dwordx2SpirvMemoryInstructions.cpp硬件上是单次 64 位访问不会看到buffer_atomic_swap_x2的一半只有 8 字节对齐、在界内、glc、且程序具备 64 位存储视图时才用一次 64 位原子 load 读取其余 dwordx2 load 是两次 dword load可能与并发的 64 位写撕裂。Relinker 侧的已知不完美--to-intel路径不降低 RDPRU/MCOMMIT——指令匹配器 直接让重链失败RIP 相对操作的 SHA-1/SHA-256 指令同样失败重链。指令重写器 的变长路径未被转换器使用替换不调整 VEX/0F38/0F3A RIP 相对操作数、数据到代码引用重定位、FDE、跳转表与段大小因此每次替换保持指令长度。VRSQRTPS/VRCPPS 替换--to-intel把近似 VEX.128 寄存器形式换成正确舍入的 1/sqrt(x) 与 1/xAMD 近似表不公开Intel 对 1/sqrt(1.0) 的近似是 0x3F7FF000两次牛顿迭代收敛到 0.99999994 而非 1.0重归一化单位四元数在 PPSA21564 中会变成 NaN 轴主机不出现精化结果现在可达精确值未精化的低位仍可能与主机不同。每个调用点付出线外桩的代价两次跳转、红区下溢、SQRTPS/DIVPS256 位、标量、legacy 与内存形式保留原指令PPSA21564 有 5 个调用点因跳板后无可移动指令而保留原指令。合成测试覆盖Linux ELF patcher 中--to-intelstub 的布置位置只有合成测试覆盖--to-intel的 guest 模块 trampoline 也只有合成 relinker 测试Linux/Windows 上都没有标题验证过。SSE4a 陷阱模拟在 Windows 上被--to-intel取代保留到重链标题不带它验证通过为止。Windows PE writer生成的可执行文件在启动时会打开主机——对可玩性不便。着色器重编译时机Recompiler.cpp当前发生在转换到 Vulkan 前一刻带缓存应移入 relinker 阶段为此 shader/recompiler 完全独立于 libs/prx 编写与 BUILD.md 的说明一致该逻辑是输入数据的纯函数设计上可集成进任何项目。音频、字体与外设输入AudioOut2 上下文AudioOut2Context.cppSDL 设备下grain 的端口缓冲在下次 push 时读取至少晚 100 微秒混音在一个 40 ms 的垫层之后播放队列水位不反映它。时机参照一个push 后填缓冲、两次 push 后复用、下一次 push 可能仍写在写中的标题标题停止 push 前的最后一个 grain 永远不会被读取或播放。sceAudioOut2Set3DLatency与sceAudioOut2MasteringInit/SetParam无效果没有 3D 渲染或 mastering 阶段。sceAudioOut2PortCreate的data_format按 bits 8-11 读声道数只接受 1/2/6/8/12、bits 0-6 读采样类型0 float、1 int16bit 7 与端口 flags 不解码bits 12-31 抛异常12 声道假定按 L R C LFE Ls Rs Lb Rb Ltf Rtf Ltb Rtb 折叠为立体声无标题或 SDK 头确认声道顺序。libSceAudiodec24 位 PCM 字长iBwPcm0抛异常布局未知ATRAC9 解码只有配置与错误测试覆盖因为没有 ATRAC9 编码器可造 fixture。libSceFontsceFontOpenFontSet只打开系统字体集的主文件——日语/中文集中的韩文、泰文、阿拉伯文等来自主机其他文件欧洲集中的阿拉伯文的字符会被报告为不支持字形主机文件名沿用 PS4 固件命名PS5 独有 JG2 集0x1A......文件名未知而借用 SSTJpPro 文件主机文件缺失时加载开放许可的替代字体Noto Sans、Noto Sans Mono、Noto Sans Thai、Noto Sans CJK度量不同文本宽度/行高/换行与主机不同。系统字体 face 由 FreeType 在宿主内存加载标题的字体内存不够每个 CJK face 约 1 MiB。字体书写行WritingLine.cpp遵循 KytyPS5run 从左到右逐行推进、无间距sceFontWritingLineGetOrderingSpace仍抛异常KytyPS5 的值是占位。libSceKeyboardsceKeyboardGetKey2Char转译 101 键美布局与 106 键日字母数字层遵循 JIS X 0201——Yen0x89与 Ro0x87无 Shift 时返回\0x5C是否应返回 U00A5 未验证Kana LEDbit 4HID 位置置位时 106 键布局抛异常主机返回的假名未知Ctrl/Alt 不改变字符。如何把这份清单当作工程工具从文档的组织方式可以推断出 AnyPS5 维护技术债的工作方法读清单时建议按以下习惯使用每条条目都带源码锚点Silent stubs与Unknown function info的每一行都链接到具体实现文件如 core/libs/prx/libkernel/Apr/src/Apr.cpp定位问题先查清单、再读锚点文件即可。区分三级证据实测measured on RDNA2 (gfx1035)、PPSA12544 probes...、captured by prosper 单一参考实现follows shadPS4/KytyPS5/ampr_emu 名字推断inferred from the names, not confirmed on a title。凡标注后两者的行为在关键路径上应按未验证对待。抛异常即边界清单反复出现throws instead of returning an error——错误码未知的导出选择抛std::runtime_error与 README.md 的严格异常契约一致这对调试是好事静默错误集中在Silent stubs一节里可穷举。验证手段在仓库内功能性行为的回归依赖 core/libs/tests如 GuestHttp、GuestRtc、GuestAudio3dPort、GuestAvPlayer 等与 core/relinker/tests如test_guest_module_directories.py、Amd64OnlyWindowsTests.cpp文档中synthetic test only的表述正是指这些合成测试尚无真实标题覆盖。清单随代码增长Unknown function info中由 PPSAxxxxx 导入、声明无参数的成组条目会随新标题出现而增加README 也说明库统计的分母是项目已知函数而非全部 PS5 系统函数——阅读时以仓库当前版本为准。这份清单的价值不在于项目有多少问题而在于它把实现、假设、猜测的边界精确到单个导出函数是评估 AnyPS5 兼容性问题归属是已实现的缺陷还是登记在案的已知缺口的第一手依据。赞分享逆向工程图形学【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址https://gitcode.com/GitHub_Trending/an/AnyPS5点击查看免费下载相关推荐k3d 代码库健康审计技术债、已知缺陷与性能瓶颈全景分析k3d 代码库健康审计技术债、已知缺陷与性能瓶颈全景分析 导读 本文基于 k3d 官方仓库的《Codebase Concerns》审计文档 .planni云原生容器编排tsParticles 代码库健康度审计技术债、已知缺陷与性能瓶颈深度解析tsParticles 代码库健康度审计技术债、已知缺陷与性能瓶颈深度解析 导读 本文以 tsParticles 仓库内维护的审计文档 .planning/前端Starward项目静默启动功能的技术解析Starward项目静默启动功能的技术解析 在游戏启动器领域Starward项目提供了一个实用的静默启动功能这个功能对于希望实现后台启动或计划任务自动运行的桌面应用上一篇Cursor Figma MCP 三步跑通下一篇Windows 11系统精简终极指南使用tiny11builder打造极致纯净系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考