Нативное исполнение гостя
На Windows x86-64 машинный код гостя исполняется напрямую. Один работник хоста несёт каждый гостевой pthread, а база FS восстанавливается после каждого блокирующего вызова, потому что Windows её не сохраняет.
Заметки репозитория по 10 октября 2026 г.
Один работник на гостевой поток
Диспетчер запускает одного работника хоста на каждый гостевой pthread, устанавливает TLS этого потока и входит в гостя по запрошенному адресу с регистрами аргументов System V. Присоединение, отсоединение, уступка, сон, вложенные обратные вызовы и scePthreadExit возвращаются через этот путь. Поток HLE завершается только после того, как гостевое исполнение покинуло этот контекст.
Мост проверяет, что точка входа исполняема и что стек и TLS отображены. Он сохраняет неволатильные регистры Windows, MXCSR и управляющее слово x87, переключается на гостевой стек, устанавливает гостевую базу FS и вызывает точку входа. Синхронный scePthreadExit уходит через нативный выход, который отбрасывает гостевые кадры и восстанавливает FS хоста, прежде чем диспетчер увидит прерывание.
Windows сбрасывает базу FS
Установить FS один раз недостаточно. Windows не сохраняет записанную пользователем базу FS через переключение контекста. После сна rdfsbase снова читает ноль. Гостевой код держит локальное хранилище потока в FS по соглашению System V, поэтому следующий доступ относительно FS получил бы отказ около нулевого адреса. В госте ничего не неверно. Хост сбросил регистр, на который гость вправе полагаться.
Поэтому диспетчер восстанавливает FS после блокирующих вызовов. Ожидания используют futex с учётом последовательности, чтобы пробуждение, пришедшее между разблокировкой и парковкой, было потреблено один раз, а широковещательное пробуждение оставалось видимым каждому ждущему, который наблюдал более старую последовательность. Если фиксированная история пробуждений когда-либо насыщается, диспетчер пробуждает с избытком и даёт HLE перепроверить объект. Сон по времени использует частную задержку без оповещения, чтобы постороннее пробуждение не превратило звукового работника в кручение.
Отказы и другие операционные системы
Гостевой поток в отказе изолируется. Диагностика относит адрес к модулю и символу, когда может, и процессу не обязательно умирать с необработанным исключением хоста. PS5_CPU_WAIT_DIAGNOSTICS=1 снова включает подробную трассу ожиданий. При обычной игре она выключена, потому что несколько припаркованных работников, печатающих сразу, сами могут задержать кадр.
Нативное исполнение требует Windows x86-64 и процессорной возможности RDWRFSGSBASE. Сборки Linux и macOS всё ещё компилируют декодер, загрузчик и HLE и сообщают нативный мост как неподдерживаемый. Гостевые двоичные файлы — машинный код x86-64. Они не интерпретируются.
Что реализовано
- Нативное исполнение гостя x86-64 на Windows, один работник хоста на гостевой pthread.
- Вызовы System V, гостевые стеки и FS, восстановленный после блокирующих вызовов.
- Ожидания с учётом последовательности, изолированные отказы и выход из pthread, который восстанавливает хост.
- Просмотр, декодирование и HLE на Linux и macOS, без нативного исполнения.
Чего ещё нет
- Интерпретатора нет. Хосты, кроме Windows x86-64, гостя не исполняют.
- CPU, который не может писать базы FS и GS, не может войти в нативный мост.
- Подробная диагностика ожиданий по умолчанию выключена, потому что её печать тормозит игру.
Связанные механизмы
Чему посвящены эти страницы