使用单一传输 DMA
默认情况下,WDF 有时会将单个 DMA 事务拆分为多个 DMA 传输。 但是,某些设备无法处理碎片事务,而必须接收单个 DMA 操作中的所有数据。 例如,某些 PCI 网络控制器一次需要一个网络数据包,因为它们没有用于缓存和重新组合部分数据的硬件。
从 KMDF 版本 1.19 开始,使用 DMA v3 的 KMDF 驱动程序可以指定它需要单个传输 DMA 事务。 驱动程序只能为单个 DMA 事务指定单一传输,也可以为使用指定的 DMA 启用程序创建的所有 DMA 事务指定单一传输。
为特定 DMA 事务设置单次传输
若要为单个事务设置单次传输,请使用以下顺序:
- 调用 WdfDmaTransactionCreate 或 WdfDmaTransactionRelease。
- 调用 WdfDmaTransactionSetSingleTransferRequirement。
- 调用 WdfDmaTransactionInitialize。
如果初始化由于事务碎片而失败,驱动程序可能会使 I/O 请求失败,或者它可以重新排列事务的内存缓冲区并重新初始化事务。 - 调用 WdfDmaTransactionExecute。
调试驱动程序时,可以使用 !wdfkd.wdfdmatransaction 扩展来确定是否为给定事务对象设置了单个传输。
设置使用特定 DMA 启用程序创建的所有 DMA 事务的单一传输要求
若要为使用给定启用程序创建的所有事务设置单一传输,请在调用WdfDmaEnablerCreate 时在 WDF_DMA_ENABLER_CONFIG_FLAGS 中指定WDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER标志。
使用此标志的驱动程序无需在每次创建或重用事务对象时调用 WdfDmaTransactionSetSingleTransferRequirement 。
如果驱动程序 重用事务对象,此设置也会保留。
调试时,使用 !wdfkd.wdfdmaenabler 扩展确定是否为给定的 DMA 启用程序对象设置了单一传输。
有关 WDF 调用驱动程序的 DMA 事件回调函数的顺序的信息,请参阅 处理 Bus-Master DMA 设备的 KMDF 驱动程序中的 I/O 请求。