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


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

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

Обзор

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

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

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

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

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

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

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

Изменения DDI

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

командование Описание
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 КБ.