确定 I/O 操作的缓冲方法
与设备驱动程序一样,文件系统负责在用户模式应用程序和系统设备之间传输数据。 操作系统提供以下三种方法来访问数据缓冲区:
在 缓冲 I/O 中,I/O 管理器为非分页池中的操作分配系统缓冲区。 I/O 管理器将数据从此系统缓冲区复制到应用程序的用户缓冲区,反之亦然,在启动 I/O 操作的线程上下文中。
在 直接 I/O 中,I/O 管理器探测并锁定用户缓冲区。 然后,它 (MDL) 创建内存描述符列表,以映射锁定的缓冲区。 I/O 管理器在启动 I/O 操作的线程上下文中访问缓冲区。
在 缓冲 I/O 和直接 I/O 中,I/O 管理器不会分配系统缓冲区,也不会锁定或映射用户缓冲区。 相反,它只是将缓冲区的原始用户空间虚拟地址传递到文件系统堆栈。 驱动程序负责确保它们在启动线程的上下文中执行,并且缓冲区地址有效。
在尝试使用微筛选器驱动程序之前,必须先验证用户空间中的任何地址。 I/O 管理器和筛选器管理器不验证此类地址,也不验证嵌入到传递给微筛选器驱动程序的缓冲区中的指针。
对于大多数 I/O 处理,所有标准 Microsoft 文件系统既不使用缓冲 I/O,也不使用直接 I/O。
有关缓冲方法的详细信息,请参阅 访问数据缓冲区的方法。
对于基于 IRP 的 I/O 操作,使用的缓冲方法是特定于操作的,由以下因素决定:
正在执行的 I/O 操作的类型
文件系统卷DEVICE_OBJECT结构的 Flags 成员的值
对于 I/O 控制 (IOCTL) 和文件系统控制 (FSCTL) 操作,是定义 IOCTL 或 FSCTL 时传递给CTL_CODE宏的 TransferType 参数的值
具有缓冲区的快速 I/O 操作始终不使用缓冲 I/O 或直接 I/O。
文件系统回调操作没有缓冲区。
本节包括: