Уведомление о выделении
Внимание
Некоторые сведения относятся к предварительному продукту, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Существуют случаи, когда определенные операции должны выполняться при выделении, который будет проходить разбиение по страницам или операция повышения уровня. Например, выделение может быть сжато при доступе к устройству. Когда выделение вытесняется (т. е. больше не под доступом к устройству), драйвер режима ядра (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 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 GPU для разбиения на страницы. Dxgkrnl выделяет пространство va GPU для процесса разбиения по страницам (система), только если есть локальный сегмент памяти или когда аппаратное планирование включено. Размер пространства va GPU составляет четверть крупнейшего сегмента локальной памяти или размера буферов журнала планирования оборудования, в зависимости от того, что больше. Результирующий размер виртуальной машины GPU может быть небольшим для сопоставления полного выделения. В этом случае драйверу необходимо указать размер пространства VA процесса разбиения на страницы.
Dxgkrnl вызывает DxgkDdiQueryAdapterInfo со структурой DXGKARG_QUERYADAPTERINFO следующим образом, чтобы получить размер пространства gpu GPU для разбиения на страницы:
- Тип задан DXGKQAITYPE_PAGINGPROCESSGPUVASIZE.
- pInputData указывает значение UINT, указывающее индекс физического адаптера в конфигурации LDA. Dxgkrnl задает нулю для конфигураций, отличных от LDA.
- InputDataSize —
sizeof(UINT)
это . - POutputData указывает на значение UINT, в котором драйвер возвращает размер пространства GPU GPU для разбиения на страницы в мегабайтах.
- OutputDataSize —
sizeof(UINT)
это .
Если драйвер завершается сбоем вызова или возвращает значение pOutputData нулевого значения, ОС определяет размер виртуальной машины GPU для разбиения по страницам.
Если адаптер имеет большой сегмент локальной памяти, драйвер должен вернуть нулю, чтобы позволить ОС выбрать размер пространства gpu GPU для разбиения на страницы. Чем больше пространства va, тем больше памяти требуется для разбиения таблиц страниц GPU процесса. Таблицы страниц всегда являются резидентными, поэтому драйвер не должен указывать ненужный большой размер пространства va.
Операции с разбиением на страницы (заполнение, передача, выделение уведомлений) выполняются в блоках, когда размер выделения превышает размер пространства gpu GPU GPU для разбиения на страницы.