Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
По умолчанию WDF иногда разбивает одну транзакцию DMA на несколько передач DMA. Однако некоторые устройства не могут обрабатывать фрагментированную транзакцию и вместо этого должны получать все данные в одной операции DMA. Например, для некоторых сетевых контроллеров PCI требуется один сетевой пакет за раз, так как они не имеют оборудования для кэширования и повторного анализа частичных данных.
Начиная с KMDF версии 1.19 драйвер KMDF с помощью DMA версии 3 может указать, что для него требуются транзакции DMA с одной передачей данных. Драйвер может указать только одну передачу для одной транзакции DMA или указать одну передачу для всех транзакций DMA, созданных с помощью указанного средства включения DMA.
Настройка единой передачи для определенной транзакции DMA
Чтобы задать одну передачу для одной транзакции, используйте следующую последовательность:
- Вызовите WdfDmaTransactionCreate или WdfDmaTransactionRelease.
- Вызовите WdfDmaTransactionSetSingleTransferRequirement.
- Вызовите WdfDmaTransactionInitialize.
Если инициализация завершается ошибкой из-за фрагментации транзакций, драйвер может завершить запрос ввода-вывода или изменить порядок буферов памяти транзакции и повторно инициализировать транзакцию. - Вызов WdfDmaTransactionExecute.
При отладке драйвера можно использовать расширение !wdfkd.wdfdmatransaction , чтобы определить, задана ли одна передача для заданного объекта транзакции.
Задание требования к одноадресной передаче для всех транзакций DMA, созданных с помощью определенного включения DMA
Чтобы задать одну передачу для всех транзакций, созданных с помощью заданного энейблера, укажите флаг WDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER в WDF_DMA_ENABLER_CONFIG_FLAGS при вызове WdfDmaEnablerCreate.
Драйвер, использующий этот флаг, не должен вызывать WdfDmaTransactionSetSingleTransferRequirement при каждом создании или повторном использовании объекта транзакции.
Этот параметр также сохраняется, если драйвер повторно использует объект транзакции.
При отладке используйте расширение !wdfkd.wdfdmaenabler , чтобы определить, задана ли одна передача для заданного объекта включения DMA.
Сведения о том порядке, в котором WDF вызывает функции обратного вызова событий DMA драйвера, см. в разделе "Обработка запросов ввода-вывода" в драйвере KMDF для устройства Bus-Master DMA.