驱动所创建的设备一般有3种方式:缓冲区方式,直接方式和其他方式(对应DO_BUFFERED_IO, DO_DIRECT_IO和0)。
比如:
fdo->Flags |= DO_BUFFERED_IO
DO_BUFFERED_IO指定当前设备以缓冲区方式工作。
通常用户模式和内核模式交互的时候,用户模式会传一个buffer进来,注意:这个buffer是用户模式的虚拟地址。尽管驱动程序可以访问用户模式的虚拟地址,但是这里有个问题,就是当进程切换的时候,同一个用户模式的虚拟地址对应不同的物理地址,这样当驱动去读取这个地址的时候就会出错,这是灾难性的错误。所以,内核模式的驱动一般都不会直接使用用户模式的虚拟地址(特殊需要也可以使用,但是需要很高的技术要求,而且需要很小心)。
缓冲区方式(DO_BUFFERED_IO)
I/O
管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区。驱动程序将使用这个系统缓冲区工作。
I/O
管理器负责在系统缓冲区和用户模式缓冲区之间复制数据。
系统缓冲区的地址用 Irp->AssociatedIrp.SystemBuffer记录,缓冲区的长度记录在IO_STACK_LOCATION里面,比如WriteFile的系统缓冲区的长度记录在IO_STACK_LOCATION的Parameters.Write.Length里面。
以缓冲区方式工作的设备,无论是读还是写,都会发生用户模式地

本文探讨了Windows驱动开发中设备内存的读写方式,重点在于缓冲区方式和直接方式。驱动通常避免使用用户模式的虚拟地址,以防进程切换导致的错误。建议优先选择缓冲区方式,对于大内存则考虑直接方式,而其他方式只在特殊情况下谨慎使用。
- 设备内存读写方式&spm=1001.2101.3001.5002&articleId=8212032&d=1&t=3&u=206e7808cc62423e907251a9990c73eb)
960

被折叠的 条评论
为什么被折叠?



