使用直接 I/O
一次可以传输大量数据的设备的驱动程序应使用直接 I/O 进行这些传输。 对大型传输使用直接 I/O 可降低驱动程序的中断开销,并消除缓冲 I/O 中固有的内存分配和复制操作,从而提高驱动程序的性能。
通常,大容量存储设备驱动程序为传输请求请求直接 I/O,包括使用直接内存访问 (DMA) 或编程 I/O (PIO) 的最低级别驱动程序,以及链接在它们上方的任何中间驱动程序。
I/O 管理器确定 I/O 操作正在使用直接 I/O,如下所示:
对于 IRP_MJ_READ 和 IRP_MJ_WRITE 请求,在 DEVICE_OBJECT 结构的 Flags 成员中设置 DO_DIRECT_IO 。 有关详细信息,请参阅 初始化设备对象。
对于 IRP_MJ_DEVICE_CONTROL 和 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求,IOCTL 代码的值包含METHOD_IN_DIRECT或METHOD_OUT_DIRECT作为 IOCTL 值中的 TransferType 值。 有关详细信息,请参阅 定义 I/O 控制代码。
使用直接 I/O 的驱动程序有时也会使用缓冲 I/O 来处理某些 IRP。 具体而言,驱动程序通常对需要数据传输 的IRP_MJ_DEVICE_CONTROL 请求的某些 I/O 控制代码使用缓冲 I/O,而不管驱动程序是否使用直接 I/O 执行读取和写入操作。
直接 I/O 传输的设置略有不同,具体取决于使用的是 DMA 还是 PIO。 有关详细信息,请参阅:
驱动程序必须采取措施在 DMA 和 PIO 传输期间保持缓存一致性。 有关详细信息,请参阅 维护缓存一致性。