Вы предоставили подробный отчет о разработке проекта apple-dma-pci, который позволяет использовать внешнюю видеокарту NVIDIA (например, RTX 5090) с MacBook Air через виртуализацию ARM и эмуляцию x86.
Ниже приведен краткий обзор ключевых технических решений, проблем и результатов, описанных в тексте:
- Проблема: NVIDIA драйвер запрашивает память с выравниванием 2 МБ, но интерфейс DMA (через Thunderbolt) требует выравнивания 16 КБ. Это вызывает ошибку
NV_ERR_INVALID_OFFSET. -
Решение:
- Попытка патчить драйвер NVIDIA (прямая модификация кода).
- Использование kprobes в ядре Linux для перехвата функции выделения памяти
nvUvmInterfaceMemoryAllocSysи принудительного установки размера страницы наUVM_PAGE_SIZE_DEFAULT(4 КБ). - Это снижает количество требуемых страниц, позволяя использовать единые блоки памяти.
-
Проблема: Лимит системы на количество отображений (~64k). В играх создается слишком много мелких отображений.
- Решение: Реализован алгоритм кластеризации:
- Память делится на кластеры (например, 256 КБ).
- Вместо отдельного отображения для каждого 4 КБ буфера, создается одно отображение на весь кластер.
- Позже выделяющиеся буферы в этом же кластере используют это же отображение.
- При освобождении последнего буфера в кластере, отображение кластера также освобождается.
-
Результат: Количество отображений снизилось в 4 раза, что позволило обойти лимит и уложиться в 1.5 ГБ памяти.
-
Распределение приоритета: Патчинг QEMU для установки высокого приоритета потокам vCPU (
SCHED_RR,QOS_CLASS_USER_INTERACTIVE), чтобы ядро macOS не "сидело" на фоне. - Total Store Ordering (TSO):
- ARM имеет слабые гарантии порядка доступа памяти, в отличие от x86 (TSO). Эмуляция FEX-Emu требует дорогих барьеров памяти.
- Apple Silicon (macOS 15+) имеет аппаратную поддержку TSO (бит в регистре
ACTLR_EL1). - Решение: Использование кпробов в ядре (Hector Martin's patch via Asahi Linux) для симуляции запроса состояния TSO процессом FEX-Emu, позволяя ему отключить медленную программную эмуляцию TSO.
- Итог: Это позволило сократить штраф за эмуляцию CPU с ~50% до приемлемого уровня для игр.
Сравнение было проведено между несколькими конфигурациями: * M4 Air (native macOS): Хорош на низких настройках (720p), но неудобен на высоких (особенно с Ray Tracing). * M4 Air + eGPU (RTX 5090 via VM): * На 720p: Работает медленнее, чем нативный M4, так как GPU не является "узким местом". * На 4K RT Ultra: Радикальное улучшение. С падает с ~3 fps (неиграбельно) до 27 fps (играбельно), а с DLSS Frame Gen — до 111 fps. * M5 Max (native macOS): Лучший нативный вариант. Обходит M4 Air на 4K, но все равно уступает десктопной машине. * Мини-ПК (i5-12600K + RTX 5090): Абсолютный лидер.
Проект успешно решает проблему использования мощных десктопных видеокарт на ARM-архитектурах Apple Silicon. Несмотря на накладные расходы эмуляции (FEX) и виртуализации, подключение RTX 5090 превращает слабый Mac (M4 Air) в машину, способную играть в AAA-игры в разрешении 4K с трассировкой лучей, что невозможно без внешних GPU.