Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Некоторые сведения относятся к предварительному продукту, который может быть существенно изменен до его коммерческого выпуска. Корпорация Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых в отношении информации, предоставленной здесь.
Существуют случаи, когда определенные операции должны выполняться при выделении, который будет проходить разбиение по страницам или операция повышения уровня. Например, выделение может быть сжато при доступе к устройству. Когда блок памяти вытесняется (т. е. больше не имеет доступ к устройству), драйвер режима ядра (KMD) должен сначала распаковать его перед фактическим вытеснением. Операция DXGK_OPERATION_NOTIFY_ALLOC разбиения по страницам предназначена для этой цели. Эта операция доступна начиная с Windows 11 версии 24H2 (WDDM 3.2).
Как запросить уведомления о распределении
Когда система вызывает DxgkDdiCreateAllocation для создания выделения, KMD может задать флаги в DXGK_ALLOCATIONINFOFLAGS2 , чтобы указать Dxgkrnl выполнить операцию DXGK_OPERATION_NOTIFY_ALLOC разбиения по страницам. Текущие флаги уведомлений:
- NotifyEviction
- NotifyIoMmuUnmap
Изменения DDI
добавлена операция DXGK_OPERATION_NOTIFY_ALLOC разбиения по страницам
Операция DXGK_OPERATION_NOTIFY_ALLOC разбиения по страницам добавляется в DXGK_BUILDPAGINGBUFFER_OPERATION.
Структура DXGK_BUILDPAGINGBUFFER_NOTIFYALLOC добавляется для использования с операцией DXGK_OPERATION_NOTIFY_ALLOC.
Флаги, добавленные в DXGK_ALLOCATIONINFOFLAGS2
В DXGK_ALLOCATIONINFOFLAGS2 добавляются следующие флаги.
NotifyEviction
KMD задает флаг NotifyEviction в реализации DxgkDdiCreateAllocation . Этот флаг указывает, что Dxgkrnl должен выдавать операцию DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction драйверу перед вытеснением выделения.
Когда указывается флаг и выделенное пространство готовится к вытеснению:
- Dxgkrnl сопоставляет выделение с пространством виртуального адреса GPU (VA) процесса подкачки.
- Dxgkrnl вызывает DxgkDdiBuildPagingBuffer с операцией DXGK_OPERATION_NOTIFY_ALLOC и флагом NotifyEviction .
- Драйвер создает команды в страничном DMA-буфере.
- Буфер отображения DMA передается на выполнение в системном контексте.
- Dxgkrnl распаковывает выделение из пространства va GPU для разбиения на страницы.
Эти действия можно выполнить несколько раз, если размер выделения превышает размер виртуального адресного пространства GPU для процесса разбиения на страницы.
Dxgkrnl отправляет уведомление драйверу только когда выделение удаляется из апертурного сегмента или из неявного системного сегмента памяти.
NotifyIoMmuUnmap
KMD задает флаг NotifyIoMmuUnmap в функции DxgkDdiCreateAllocation . Этот флаг указывает, что Dxgkrnl должен выдавать операцию DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap перед отменой выделения из IOMMU. Драйвер имеет возможность очистить внутренние кэши. Драйвер должен убедиться, что после возврата из операции виртуальной памяти к выделенному виртуальному адресу GPU не будет доступа.
При указании флага и когда выделение памяти должно быть размэпировано из IOMMU во время выселения:
- Dxgkrnl вызывает DxgkDdiBuildPagingBuffer с операцией DXGK_OPERATION_NOTIFY_ALLOC и флагом NotifyIoMmuUnmap .
- Драйвер создает команды в страничном буфере DMA.
- Страничный буфер DMA запускается на выполнение в системном контексте.
- Dxgkrnl ожидает завершения всех операций подкачки страниц.
- Выделение не сопоставляется с IOMMU.
Уведомление отправляется только в том случае, если устройство поддерживает модели виртуальной адресации GpuVaIoMmu или GpuVaIoMmuGlobal.
Размер пространства gpu VA для разбиения на страницы
Чтобы получить размер виртуального адресного пространства процесса разбиения на страницы GPU, DXGKQAITYPE_PAGINGPROCESSGPUVASIZE включён в перечисление DXGK_QUERYADAPTERINFOTYPE.
Для операции DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction требуется сопоставить соответствующее выделение с адресным пространством GPU VA для процесса разбиения на страницы. Dxgkrnl выделяет пространство GPU VA для процесса загрузки в память (системный процесс) только если есть локальный сегмент памяти или когда включено аппаратное планирование. Размер VA пространства GPU составляет четверть наибольшего сегмента локальной памяти или размера буферов журнала планирования оборудования, в зависимости от того, что больше. Результирующий размер виртуального адресного пространства GPU может быть слишком мал, чтобы отобразить полное выделение. В этом случае драйверу необходимо указать размер пространства VA процесса пейджинга GPU.
Dxgkrnl вызывает DxgkDdiQueryAdapterInfo со структурой DXGKARG_QUERYADAPTERINFO следующим образом, чтобы получить размер адресного пространства GPU для страничной обработки.
- Тип задан DXGKQAITYPE_PAGINGPROCESSGPUVASIZE.
- pInputData указывает значение UINT, указывающее индекс физического адаптера в конфигурации LDA. Dxgkrnl устанавливает значение 0 для конфигураций, отличных от LDA.
-
InputDataDataSize — это
sizeof(UINT). - POutputData указывает на значение UINT, в котором драйвер возвращает размер пространства GPU GPU для разбиения на страницы в мегабайтах.
-
OutputDataSize —
sizeof(UINT).
Если драйвер завершается сбоем вызова или возвращает значение pOutputData, равное нулю, ОС определяет размер виртуального адресного пространства GPU для разбиения по страницам.
Если адаптер имеет большой сегмент локальной памяти, драйвер должен вернуть ноль, чтобы позволить ОС выбрать размер виртуального адресного пространства GPU для подкачки. Чем больше VA пространства, тем больше памяти требуется для пейджинга таблиц страниц GPU. Таблицы страниц всегда являются резидентными, поэтому драйверу не следует задавать слишком большой размер виртуального адресного пространства.
Операции разбиения на страницы (заполнение, передача, уведомление о выделении) выполняются в блоках, когда размер выделения превышает размер адресного пространства GPU, используемого для разбиения на страницы.