Волокна и потоки пользовательского уровня
На Windows каждое волокно libSceFiber — настоящее волокно Windows, поэтому переключение сохраняет гостевые регистры и гостевой стек. Потоки пользовательского уровня стартуют через тот же путь pthread.
Заметки репозитория по 10 октября 2026 г.
Почему волокно не может быть пустой операцией
Гостевой код исполняется как машинный код. Переключение волокна должно возобновить точные регистры и точный стек, а кадры хоста и гостя на этом стеке смешаны. Возврат успеха из sceFiberSwitch без переключения позволил бы игре продолжить не на том стеке и испортить обе стороны.
PS5PCEM подкрепляет каждое инициализированное гостевое волокно одним волокном Windows. sceFiberRun, sceFiberSwitch и sceFiberReturnToThread используют этот механизм. Поток, вызвавший sceFiberRun, — корневое волокно. Публичная 128-байтовая запись SceFiber хранит сигнатуры ABI, состояние, аргумент входа, имя и диапазон контекста, который дал вызывающий.
Чей это стек
Игра даёт буфер контекста, и этот буфер записывается в объект ABI. Настоящим стеком владеет Windows. Если использовать буфер игры как родной стек Windows, пропадут сторожевая страница и учёт раскрутки, которых требует операционная система. Минимальный контекст, которого ждёт запись прошивки, всё равно проверяется, вместе с выравниванием и сигнатурами начала и конца.
sceFiberGetSelf, финализация, проверки владения между потоками и сброс времени выполнения реализованы. Бэкенд существует на цели нативного исполнения Windows x86-64. Другие хосты могут собирать остальной эмулятор, и этот путь переключения там недоступен.
Потоки пользовательского уровня
Инициализация и финализация libSceUlt завершаются успехом, чтобы система заданий игры могла стартовать. Среды выполнения, очереди ожидания, пулы данных очередей, мьютексы, семафоры и очереди держат состояние на стороне хоста с ключом по объектам, которые выделила игра. Сами элементы работы стартуют через существующий путь pthread. Запросы размера рабочей области возвращают выровненные размеры, которых ждут эти создания.
Очереди событий пользовательского края ядра делят то же ожидание с учётом последовательности, что и синхронизация pthread. Фильтр VideoOut -13 и графический фильтр -14 идут по этой очереди и хранят идентификатор каждой регистрации и пользовательские данные. ULT — это связка планирования. Второй эмулятор CPU он не добавляет.
Что реализовано
- Волокна Windows для sceFiberRun, sceFiberSwitch и sceFiberReturnToThread.
- Сигнатуры ABI, проверки владения и стек во владении хоста со сторожевой страницей.
- Инициализация ULT, очереди, мьютексы, семафоры и элементы работы на pthread.
- Очереди событий пользовательского края, общие с завершением VideoOut и графики.
Чего ещё нет
- Переключение волокон есть на Windows x86-64. Другие операционные системы хоста не исполняют гостевой код нативно.
- Волокно — это не аппаратный поток с вытесняющим планированием.
- ULT не реализует отдельный интерпретатор тел работников.
Связанные механизмы
Чему посвящены эти страницы