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


Резервирование ресурсов 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 .