Поделиться через


Тестирование функций WDDM в режиме ядра

В этой статье описывается проектирование инфраструктуры тестирования в режиме ядра в WDDM, добавленной в Windows 11 версии 24H2 (WDDM 3.2). Эта инфраструктура позволяет тестировать и проверять драйверы, которые не поддерживают среды выполнения D3D, например драйверы для некоторых устройств NPU. Его также можно использовать для проверки драйверов, поддерживающих среды выполнения D3D без участия среды выполнения D3D.

Обзор

Существуют сценарии, в которых появились новые вычислительные устройства на основе WDDM или MCDM , а драйверы для этих устройств не поддерживают среды выполнения D3D. Чтобы проверить такие драйверы, функции добавляются в Dxgkrnl , чтобы выполнять проверку только с помощью thunks в режиме ядра; то есть без участия среды выполнения D3D и драйвера пользовательского режима (UMD).

Эта инфраструктура также позволяет тестировать функцию WDDM с использованием точных параметров без необходимости проходить через среду выполнения D3D или UMD, что может усложнить ситуацию.

DDIs представлены для создания буфера команд в режиме ядра для заданного набора команд. Команды просты, поэтому почти любой узел выполнения должен иметь возможность выполнять их с помощью предварительно скомпилированных шейдеров или других средств.

Для поддержки этой функции драйвер в режиме ядра (KMD) должен обеспечить следующую поддержку:

  • Сообщите, что функция DXGK_FEATURE_KERNEL_MODE_TESTING включена.
  • Реализуйте интерфейс функции DXGKDDI_KERNELMODETESTINGINTERFACE.
  • Укажите сведения о том, какой узел выполнения поддерживает создание и выполнение буферов тестовой команды.
  • Поддержка создания очереди контекста или оборудования без данных частного драйвера. Обычно для отправки рабочей нагрузки на устройство требуется формат команд частного драйвера. Тестовый интерфейс разрешает отправку рабочей нагрузки без данных частного драйвера.
  • Поддержка выполнения буферов команд, созданных pfnBuildTestCommandBuffer на любом узле устройства, поддерживающего функцию.
  • Поддержка дескриптора выделения NULL в разбиении на страницы (TRANSFER, FILL и т. д.).

Эта функция используется только в том случае, если на компьютере включена проверка подписи .

Будут разработаны тесты HLK, использующие эту функцию.

Изменения DDI

Для поддержки тестирования в режиме ядра были обновлены следующие структуры и перечисление:

Для поддержки тестирования в режиме ядра добавляются следующие DDIs, структуры и перечисления:

Поддержка отчетов для функции тестирования в режиме ядра

ОС вызывает функцию DXGkDDdiQueryFeatureSupport с добавленным идентификатором функции DXGK_FEATURE_KERNEL_MODE_TESTING, чтобы проверить, поддерживает ли драйвер тестирование в режиме ядра. KMD должен сообщить о том, что эта функция поддерживается.

Затем система вызывает DxgkDdiQueryFeatureInterface с тем же идентификатором функции, чтобы получить указатель функции интерфейса для pfnBuildTestCommandBuffer. KMD должен реализовать эту функцию и указать указатель на интерфейс DXGKDDI_KERNELMODETESTINGINTERFACE.

Узлы выполнения отчетов, поддерживающие тестирование в режиме ядра

SupportBuildTestCommandBuffer добавляется в структуру DXGK_NODEMETADATA_FLAGS . KMD должен задать этот флаг, чтобы указать, что узел может выполнять буферы команд, созданные pfnBuildTestCommandBuffer. Рекомендуется как можно больше узлов поддерживать эту функцию.

Создание контекста без частных данных

TestContext добавляется в DXGK_CREATECONTEXTFLAGS , чтобы указать, что контекст является контекстом тестирования. Этот флаг действует только в том случае, если включена проверка подписи.

DXGkDddiCreateContext должен поддерживать создание контекста без частных данных для каждого узла, поддерживающего выполнение буферов команд, созданных pfnBuildTestCommandBuffer. Чтобы указать эту поддержку, задайте флаг TestContext в флагах во время создания контекста.

Создание очереди оборудования без частных данных драйвера

TestQueue добавляется в D3DDDI_CREATEHWQUEUEFLAGS , чтобы указать, что очередь оборудования является очередью тестирования. Этот флаг действует только в том случае, если включена проверка подписи.

DXGkDddiCreateHwQueue должен поддерживать создание очереди оборудования без частных данных драйвера.

Создание буфера команд

pfnBuildTestCommandBuffer kmD создает буфер команд с инструкциями для конкретного устройства для набора простых команд. KMD возвращает указатель на эту функцию из DxgkDdiQueryFeatureInterface(DXGK_FEATURE_KERNEL_MODE_TESTING).

Одна тестовая команда отправляется в pfnBuildTestCommandBuffer. В настоящее время поддерживаются следующие команды:

Команда Description
D3DDDI_TESTCOMMAND_COPY Копирует байты с помощью виртуальных адресов исходного и целевого GPU.
D3DDDI_TESTCOMMANDBUFFER_FILL Заполняет расположение памяти шаблоном.

Тестовые команды основаны на использовании виртуальных адресов GPU. ОС гарантирует, что виртуальные машины GPU сопоставляются с выделениями, созданными с помощью стандартного типа выделения D3DKMT_STANDARDALLOCATIONTYPE_EXISTINGHEAP или D3DKMT_STANDARDALLOCATIONTYPE_INTERNALBACKINGSTORE.

Созданный буфер команд и частные данные возвращаются обратно в пользовательский режим. При отправке буфера команд для выполнения вызов поступает из пользовательского режима. Вредоносное приложение может изменить содержимое буфера и частных данных. Это ответственность KMD для проверки буфера команд и данных частного драйвера, чтобы избежать ошибок.

Созданный буфер команд не должен содержать привилегированные инструкции.

Драйвер клиента в режиме пользователя (например, Cuda) отправляет созданный буфер команд для выполнения с помощью D3DKMTSubmitCommand или D3DKMTSubmitCommandToHwQueue. В будущем содержимое буфера будет отправлено в рамках отправки в режиме пользователя.

При отправке созданного буфера команд для выполнения гарантируется, что буфер команд содержит инструкции устройства для одной тестовой команды.

Созданный буфер команд отправляется на узел, соответствующий hContext, передаваемому pfnBuildTestCommandBuffer.

Размер буфера DMA (pDmaBuffer) ограничен 4 КБ, а размер данных частного драйвера DMA (pDmaBufferPrivateData) ограничен 1 КБ.