Идентификаторы файлов и чтения APR
APR разрешает файл игры один раз, а затем несёт локальный для процесса идентификатор в последующих буферах команд. Отложенные чтения AMPR заново открывают тот же файл /app0 только для чтения, не удерживая дескриптор хоста постоянно.
Заметки репозитория по 10 октября 2026 г.
Идентификаторы вместо путей
API ускорителя не хочет путь в каждой команде. Игра разрешает путь, получает компактный идентификатор файла и кладёт этот идентификатор в команды чтения, которые подаёт позже. PS5PCEM хранит путь и размер файла рядом с идентификатором. Таблица локальна для процесса. Пути хоста гостю не возвращаются.
Файлы берутся из монтирования /app0 игры только для чтения. Разрешённую запись можно открыть снова, когда выполняется отложенное чтение, поэтому эмулятору не нужно держать каждый дескриптор всё время жизни процесса. Кэшированная таблица вмещает до 64 файлов.
Буферы команд
Подача — это гостевой буфер команд, а не один вызов чтения. PS5PCEM принимает до 32 живых буферов команд. Каждый буфер ограничен: 32 чтения, 32 записи, 32 отображения, 32 записи завершения и 128 операций. В полёте может быть до 64 подач, а автоматический пул держит 8 буферов. Чтение называет идентификатор файла, гостевое назначение, размер и смещение в файле и может назвать адрес, который получит число байт.
Читатель отвергает неизвестный идентификатор, отсутствующий файл, короткий или невыровненный буфер команд и запрос, который вышел бы за файл или за назначение. Одно чтение ограничено 4 GiB: это предел интерфейса, а не обещание, что игра выдаёт чтения такого размера. Команды отображения используют размер страницы AMM 16 KiB, которого ждёт гость.
Как APR встречается с AMPR
APR владеет таблицей файлов и временем жизни буфера команд. AMPR владеет счётчиками, ожиданиями и событиями завершения, которые говорят игре, что работа закончена. Игра может поставить в очередь много чтений файлов, а затем ждать счётчик, который обновляет команда завершения. Первый запуск Grand Theft Auto III — крупный наблюдавшийся случай: чтения идут этим путём, а события завершения возвращаются через очередь AMPR.
Асинхронный ввод-вывод ядра, другой файловый API, описан на отдельной странице. APR — это поток команд ускорителя. Пакетный API ядра — это список запросов в стиле POSIX.
Что реализовано
- Локальные для процесса идентификаторы файлов для путей /app0 только для чтения, с размером, сохранённым для последующих чтений.
- Ограниченные буферы команд для чтений, записей, отображений и записей завершения.
- Отложенные чтения, которые заново открывают тот же файл игры.
- Проверяемое отклонение неизвестных файлов, переполнения и испорченных буферов.
Чего ещё нет
- Этот путь — программное исполнение буфера команд, а не DMA-механизм консоли.
- Записываемые файлы пакета находятся вне /app0. Сохранения идут через монтирование savedata.
- Файл, которого распознаватель ещё не видел, нельзя выдумать из голого идентификатора.
Связанные механизмы
Чему посвящены эти страницы