Прямая память, гибкая память и пулы
Гостевые адреса — это настоящие адреса хоста. Прямая память — разреженный общий физический пул, отображённый в это пространство, а 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 явно не поддерживается.
- Освобождение диапазона, которым игра не владеет, по-прежнему ошибка.
- Резервирования виртуальны. Плату за фиксацию хоста потребляют только страницы, которые отображает игра.
Связанные механизмы
Чему посвящены эти страницы