Перейти к содержимому
PS5PCEM
РаботаетПрошивка и HLE

Прямая память, гибкая память и пулы

Гостевые адреса — это настоящие адреса хоста. Прямая память — разреженный общий физический пул, отображённый в это пространство, а MemoryPool добавляет резервирование, фиксацию и пакетные операции поверх того же хранилища.

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

Гостевой адрес — это адрес хоста

Гостевой код x86-64 исполняется нативно и содержит абсолютные адреса, поэтому PS5PCEM не может перенести процесс в произвольное выделение. Модуль памяти резервирует раскладку консоли до загрузки любого модуля. Окно под управлением системы начинается с 0x40000 и доходит почти до 32 GiB. Далее идут зарезервированные системой окна и окна устройств. Пользовательское окно на Windows и Linux идёт от 0x10_0000_0000 до 0xFC_0000_0000, это 944 GiB адресного пространства. На macOS это окно начинается выше и получает 560 GiB.

Эти диапазоны — резервирования, а не зафиксированная RAM. Страницы фиксируются блоками по 16 KiB, когда создаётся отображение, а снятие отображения снимает фиксацию, пока внешнее резервирование остаётся. Другое выделение хоста не может занять гостевой адрес между использованиями.

Прямая и гибкая память

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

Фиксированное отображение в диапазон, который игра уже зарезервировала, фиксирует память внутри резервирования. Если сначала освободить резервирование, игра потеряет заявку на куски, которые ещё не отобразила. Физическая память освобождается в той форме, которую просит игра: это может быть дыра посередине или промежуток из нескольких резервирований. Гибкая память использует ту же таблицу адресного пространства, с платформенным бюджетом по умолчанию 4 GiB, и ищет в окне под управлением системы от 0x02_0000_0000, прежде чем откатиться к пользовательскому окну.

MemoryPool и фиксация на Windows

Шесть экспортов MemoryPool из libkernel резервируют виртуальную арену, расширяют физическую ёмкость, фиксируют и снимают фиксацию общего хранилища, выполняют упорядоченные пакеты и сообщают статистику блоков. Пожертвованные блоки нельзя отображать как обычную прямую память и нельзя освобождать, пока они зафиксированы. Пакетные фиксация, снятие фиксации, защита и смена типа работают. Пакетный MOVE остаётся неподдерживаемым и возвращает ошибку, а не делает вид, что блоки переместились.

На Windows выровненные представления прямой памяти делят представления секции по 64 KiB. Временные загрузки, обратные чтения и гостевые страницы по 16 KiB поэтому не становятся каждое своей вечно растущей платой за фиксацию. Запросы резервирования используют 72-байтовую запись виртуального запроса гостя и сообщают полуоткрытые диапазоны с исходными битами защиты.

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

  • Фиксированные гостевые адресные окна, фиксируемые страницами по 16 KiB и освобождаемые без отказа от резервирования.
  • Согласованные псевдонимы одного физического смещения прямой памяти.
  • Гибкая память с бюджетом по умолчанию 4 GiB и фиксированные снятия отображения, снятия без перезаписи и частичные снятия.
  • Резервирование, расширение, фиксация, снятие фиксации, статистика и упорядоченные пакеты MemoryPool, кроме MOVE.

Чего ещё нет

  • Пакетный MOVE у MemoryPool явно не поддерживается.
  • Освобождение диапазона, которым игра не владеет, по-прежнему ошибка.
  • Резервирования виртуальны. Плату за фиксацию хоста потребляют только страницы, которые отображает игра.

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

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

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

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