Перейти к содержимому
PS5PCEM
ЧастичноПрошивка и HLE

HLE, высокоуровневая эмуляция прошивки

HLE — это то, как PS5PCEM отвечает на вызовы прошивки, которые импортирует игра. Каждый числовой NID становится функцией Zig на стеке хоста, а гостевое соглашение о вызовах System V сохраняется на Windows.

Заметки репозитория по 10 октября 2026 г.

Почему прошивки нет в игре

Игра для PlayStation 5 не несёт с собой операционную систему, которую вызывает. Её импорты — идентификаторы из 11 символов. PS5PCEM вычисляет каждый идентификатор из имени экспорта: SHA-1 имени плюс фиксированная соль, затем первые восемь байт дайджеста в варианте base64. Реализация регистрируется под читаемым именем и может требовать тот идентификатор, который это имя обязано дать, поэтому ошибочно записанный экспорт не проходит сборку модуля.

Динамический компоновщик ищет идентификатор вместе с библиотекой, модулем и их версиями. Один и тот же идентификатор может существовать более чем в одной библиотеке. Поиск только по идентификатору есть для импортов, у которых нет пригодных метаданных, и этот запасной путь считается последним средством, потому что он неоднозначен.

Вызов идёт на стеке хоста

Гость вызывает прошивку напрямую, поэтому вызов начинается на стеке гостевого потока, часто размером в один мегабайт, потому что именно столько запросила игра. Работе хоста, например открытию файла, нужен гораздо больший кадр стека. Компилятор резервирует этот кадр при входе, до любого раннего возврата. Тело прошивки поэтому может выйти за гостевой стек раньше, чем дойдёт до строки, которой нужно это место, и сбой оказывается вне всякого гостевого отображения.

Каждый вызов HLE на время работы хоста переключается на отдельный стек хоста этого потока. Аргументы передаются через память, поэтому одна ассемблерная заглушка обслуживает любую сигнатуру, включая возврат чисел с плавающей точкой и агрегатов. Вложенные вызовы прошивки остаются на стеке, который уже установил внешний вызов. На Windows гость использует соглашение System V AMD64, а хост — Microsoft x64, поэтому каждая функция, вызываемая из гостя, объявляется с гостевым соглашением. Если это объявление убрать, код всё равно компилируется, а затем читает аргументы не из тех регистров.

Что покрывает поверхность HLE

Поверх этого механизма библиотеки прошивки дают прямую и гибкую память, описатели модулей, pthreads, синхронизацию, файлы, savedata, волокна, шрифты, PNG, часы, геймпады, AudioOut, AJM, NGS2, ACM, AvPlayer, APR и AMPR. Сеть, SSL и NP Web API сохраняют время жизни контекста и запроса и возвращают детерминированные ошибки автономного режима. Диалоги, которым нужна системная оболочка, завершаются сразу согласованным результатом без оболочки.

Прогон проверки 10 октября прошёл полный набор HLE в ReleaseSafe: 606 из 606 тестов. Это число относится к набору прошивки. Само по себе оно не фиксирует новую частоту кадров и не означает новое полное прохождение.

Что реализовано

  • Вычисление NID, реестр символов с версиями и переключение на стек хоста для каждого вызова прошивки.
  • Гостевые вызовы System V на Windows, где соглашение хоста — Microsoft x64.
  • Память, файлы, потоки, savedata, медиа, звуковые кодеки и путь команд APR/AMPR.
  • Диалоги без оболочки и автономный сетевой профиль, который не открывает сокеты хоста.

Чего ещё нет

  • Библиотеки, которые игра импортирует и которые PS5PCEM ещё не реализовал, по-прежнему приводят к ошибке импорта.
  • Настоящая загрузка по требованию модуля, которого не было в опубликованном графе, возвращает ошибку.
  • Платформенные службы, которым нужны настоящая оболочка, учётная запись или сетевой узел, остаются недоступны.

Связанные механизмы

Чему посвящены эти страницы

Текст следует архитектурным заметкам и отчётам октября 2026 года в репозитории PS5PCEM. Пройденный точечный тест — это не новая частота кадров и не новое прохождение.

Все технологии