Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается проектирование инфраструктуры тестирования в режиме ядра в 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
Для поддержки тестирования в режиме ядра были обновлены следующие структуры и перечисление:
DXGK_FEATURE_KERNEL_MODE_TESTING добавлен в перечисление DXGK_FEATURE_ID.
SupportBuildTestCommandBuffer добавляется в структуру DXGK_NODEMETADATA_FLAGS .
TestContext добавляется в структуру DXGK_CREATECONTEXTFLAGS .
TestQueue добавляется в структуру D3DDDI_CREATEHWQUEUEFLAGS .
Для поддержки тестирования в режиме ядра добавляются следующие DDIs, структуры и перечисления:
Добавлен функциональный интерфейс DXGKDDI_KERNELMODETESTINGINTERFACE с DXGKDDI_BUILDTESTCOMMANDBUFFER::pfnBuildTestCommandBuffer в качестве единственного члена интерфейса.
Поддержка отчетов для функции тестирования в режиме ядра
ОС вызывает функцию 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 КБ.