在适用于总线主控 DMA 设备的 KMDF 驱动程序中处理 I/O 请求
[仅适用于 KMDF]
本节中的本主题介绍总线主 DMA 设备的 KMDF 驱动程序如何处理 I/O 请求。 如果要编写实现系统模式 DMA 的 KMDF 驱动程序,请参阅 支持 System-Mode DMA。
处理总线主 DMA 设备的 KMDF 驱动程序中的 I/O 请求需要多个驱动程序的事件回调函数中的代码,如下图所示:
如上所示,与 DMA 相关的处理分四个阶段进行:
驱动程序的 EvtDriverDeviceAdd 或 EvtDevicePrepareHardware 回调函数必须为设备 启用 DMA 事务 ,以便驱动程序可以使用框架的 DMA 功能。 如果设备和驱动程序需要访问共享内存缓冲区,则相同的回调函数还必须 创建一个公共 缓冲区。
当驱动程序收到需要设备执行 DMA 操作的 I/O 请求时,驱动程序 的请求处理程序 之一必须 创建并初始化新的 DMA 事务。 (请注意,如果驱动程序 重用 DMA 事务对象,驱动程序的 EvtDriverDeviceAdd 回调函数可以创建事务对象。) 然后,请求处理程序必须 启动 DMA 事务 ,以便框架可以根据需要开始将事务分解为较小的 DMA 传输,并调用驱动程序的 EvtProgramDma 回调函数。
驱动程序的 EvtProgramDma 回调函数针对单个 DMA 传输对 DMA 硬件进行编程 ,并启用设备中断。
设备中断时,框架会调用驱动程序的 EvtInterruptIsr 回调函数,这将保存易失设备信息并计划驱动程序的 EvtInterruptDpc 回调函数的执行。
驱动程序的 EvtInterruptDpc 回调函数在硬件 完成处理后完成每个 DMA 传输 。 DMA 事务的最终传输完成后, EvtInterruptDpc 回调函数 完成 DMA 事务。
驱动程序可能会 重复使用其 DMA 事务对象 ,以确保它们在内存资源不足时可以运行。
驱动程序可以提供一组回调函数,用于处理 特定于 DMA 的电源管理操作。
某些驱动程序使用设备和驱动程序都可以访问的 通用缓冲区 。