Резервирование ресурсов DMA

[Применимо только к KMDF]

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

Драйверы на основе платформы, работающие в Windows 8 или более поздней версии, могут зарезервировать указанное количество регистров карт для включения DMA, указывающего пакет или системный профиль. Для этого драйвер вызывает WdfDmaTransactionAllocateResources и регистрирует функцию обратного вызова EvtReserveDma.

Платформа вызывает функцию драйвера EvtReserveDma при зарезервировании регистров карты и блокировки адаптера WDM DMA. Затем драйвер может инициализировать и инициировать транзакцию несколько раз с помощью одного объекта транзакции, прежде чем окончательно освободить объект транзакции. Чтобы освободить ресурсы DMA обратно в систему, драйвер вызывает WdfDmaTransactionFreeResources.

Чтобы определить количество регистров карты, необходимых для транзакции, драйвер может вызывать WdfDmaTransactionGetTransferInfo перед вызовом WdfDmaTransactionAllocateResources. Драйвер должен инициализировать транзакцию перед вызовом WdfDmaTransactionGetTransferInfo.

Ниже показано, как драйвер может зарезервировать и освободить контроллер DMA для монопольного использования в рамках конкретной транзакции:

  1. Драйвер получает запрос ввода-вывода.

  2. Обработчик запросов драйвера вызывает вызовы WdfDmaTransactionCreate для создания объекта транзакции DMA для запроса.

  3. Обработчик запросов драйвера вызывает WdfDmaTransactionAllocateResources для резервирования ресурсов.

  4. Фреймворк вызывает EvtReserveDma, когда зарезервировал запрошенные ресурсы.

  5. В EvtReserveDmaдрайвер вызывает WdfDmaTransactionInitializeUsingRequest или WdfDmaTransactionInitialize для инициализации объекта транзакции.

  6. В EvtReserveDmaдрайвер вызывает метод WdfDmaTransactionExecute для запуска транзакции. Так как транзакция имеет зарезервированные ресурсы, платформа немедленно вызывает функцию обратного вызова драйвера EvtProgramDma.

  7. Из EvtInterruptDpc или EvtDmaTransactionDmaTransferCompleteдрайвер вызывает WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLengthили WdfDmaTransactionDmaCompletedFinal, а затем WdfObjectDelete или WdfDmaTransactionRelease. Драйвер не должен удалять или выпускать транзакцию, пока транзакция не будет завершена или отменена. После завершения этого шага регистр карты остается зарезервированным.

  8. Драйвер может повторять шаги 5–7 раз по мере необходимости.

    Если водитель больше не нуждается в резервировании, он вызывает WdfDmaTransactionFreeResources из EvtInterruptDpc или EvtDmaTransactionDmaTransferComplete. Кроме того, драйвер может вызывать WdfDmaTransactionFreeResources из функции обратного вызова событий EvtReserveDma.