AVStream 中基于数据包的 DMA
当微型驱动程序直接读取数据并直接写入数据以捕获从用户模式接收的缓冲区时,将发生基于数据包的内存访问 (DMA) 。 Windows 驱动程序工具包 (WDK) 示例中的 AVStream 模拟硬件示例驱动程序 (AVSHwS ) 演示如何生成执行此类 DMA 的 AVStream 微型驱动程序。
实现基于数据包的 DMA 方案:
在相关KSPIN_DESCRIPTOR_EX结构的 Flags 成员中指定 KSPIN_FLAG_GENERATE_MAPPINGS 。 请注意,此标志只能由支持散点/收集的总线主机使用。
如 编写适用于硬件的 AVStream 微型驱动程序中所述, (ISR) 注册中断服务例程。
然后在 AVStrMiniDeviceStart 中 开始调度:
使用 IoGetDmaAdapter 设置 DMA 适配器对象。
通过调用 KsDeviceRegisterAdapterObject 将 DMA 适配器对象注册到 AVStream。
微型驱动程序通过在对 KsDeviceRegisterAdapterObject 的调用中提供 MaxMappingByteCount 参数来指定单个散点/收集映射的最大大小。
如果任何散点/收集映射超过此最大大小,AVStream 会自动将映射分解为多个散点/收集映射,其中每个映射都不大于 MaxMappingByteCount 中指定的大小。
还必须提供 AVStrMiniPinProcess 回调例程。 驱动程序编写器应为此回调选择适当的功能。 例如,可以执行以下操作:
通过调用 KsStreamPointerClone 克隆前导边缘。
基于克隆对 DMA 硬件进行编程。
调用 KsStreamPointerAdvanceOffsets 或 KsStreamPointerAdvance 以推进领先优势。
根据需要从步骤 2 中重复其他帧。
当硬件中断 DMA 完成时,内核会调用供应商之前注册的 ISR。 在 ISR 中,微型驱动程序将延迟过程调用 (DPC) 排队。
DPC 应更新 DataUsed 以及 KSSTREAM_HEADER 结构的其他成员。 然后,DPC 可能会调用 KsStreamPointerDelete 来删除克隆并释放关联的帧。
或者,如果只有部分帧完成,DPC 可以推进克隆指针。 为此,请调用 KsStreamPointerAdvanceOffsets。
如果需要恢复处理,请调用 KsPinAttemptProcessing。
注意
如果映射长度小于一个物理页,则不能保证它驻留在单个物理页上。