客户机原生执行
在 Windows x86-64 上,客户机的机器码直接运行。每个客户机 pthread 由一个主机工作线程承载,每次阻塞调用之后都会恢复 FS 基址,因为 Windows 不保留它。
仓库笔记截至 2026年10月10日
每个客户机线程一个工作线程
分派器为每个客户机 pthread 启动一个主机工作线程,安装该线程的 TLS,并用 System V 参数寄存器在所请求的地址进入客户机。汇合、分离、让出、睡眠、嵌套回调和 scePthreadExit 都经由这条路径返回。只有客户机执行离开该上下文之后,HLE 线程才算完成。
桥接检查入口点可执行,并且栈和 TLS 已映射。它保存 Windows 非易失寄存器、MXCSR 和 x87 控制字,切换到客户机栈,安装客户机 FS 基址,然后调用入口。同步的 scePthreadExit 经由一次原生脱离离开,这次脱离丢弃客户机栈帧,并在分派器看到中断之前恢复主机 FS。
Windows 会丢掉 FS 基址
只安装一次 FS 是不够的。Windows 不会在上下文切换之间保留用户写入的 FS 基址。睡眠之后,rdfsbase 再次读到零。客户机代码按 System V 约定把线程本地存储放在 FS 里,因此下一次相对 FS 的访问会在地址零附近发生故障。客户机没有错。是主机丢掉了一个客户机有权依赖的寄存器。
因此分派器在阻塞调用之后恢复 FS。等待使用感知序列的 futex,使解锁和停放之间到达的唤醒只被消费一次,并且广播对每一个观察到较旧序列的等待者仍然可见。若固定的唤醒历史一旦饱和,分派器会过度唤醒,并让 HLE 重新检查该对象。定时睡眠使用私有的、不可警告的延时,使一次无关的唤醒不能把音频工作线程变成空转。
故障与其他操作系统
发生故障的客户机线程会被遏制。诊断能归到模块和符号时就会归到它们,进程不必带着未处理的主机异常死去。PS5_CPU_WAIT_DIAGNOSTICS=1 重新打开详细的等待跟踪。正常游玩时它是关闭的,因为几个已停放的工作线程同时打印,本身就可以拖住一帧。
原生执行要求 Windows x86-64 以及 RDWRFSGSBASE 处理器特性。Linux 和 macOS 构建仍然编译解码器、加载器和 HLE,并把原生桥接报告为不受支持。客户机二进制是 x86-64 机器码。它们不被解释执行。
已经实现的部分
- Windows 上的原生 x86-64 客户机执行,每个客户机 pthread 一个主机工作线程。
- System V 调用、客户机栈,以及阻塞调用之后恢复的 FS。
- 感知序列的等待、被遏制的故障,以及会恢复主机的 pthread 退出。
- Linux 和 macOS 上的检查、解码和 HLE,没有原生执行。
尚未实现的部分
- 没有解释器。Windows x86-64 以外的主机不会运行客户机。
- 不能写 FS 和 GS 基址的 CPU 无法进入原生桥接。
- 详细的等待诊断默认关闭,因为它们的打印会拖住游玩。
相关机制
这些页面说明什么