阅读:1440回复:5
给点提示,给点建议吧
如果一个设备需要利用DMA传输,那么fdo的属性里面,我们必须设置成DirectIo,但是如果需要BufferedIO读写操作的话,我们必须设置成为BufferedIo。如果我们既需要DMA,又需要BufferedIo,那么是不是就不能实现了?
|
|
|
沙发#
发布于:2002-06-27 11:11
当然可以啦,定义为BufferIo即可。
|
|
板凳#
发布于:2002-06-27 11:15
如果一个设备需要利用DMA传输,那么fdo的属性里面,我们必须设置成DirectIo, 这从何得知 |
|
|
地板#
发布于:2002-06-27 11:31
Walt Oney的书的第七章的最后一个部分里面有这么一段:
执行DMA传输 现在让我们详细了解被称为“基于包(packet-based)”的DMA传输,在这种方式中,你将使用IRP携带的数据缓冲区来传输一个固定量的数据。为了简单,让我们假设面对当前最普通的情况:一个基于PCI的总线主控设备并且没有分散/聚集能力。 开始,当你创建设备对象时,你通常指定使用Direct缓冲方式,即设置DO_DIRECT_IO标志。这里你也应该使用这种方法,因为你调用的MapTransfer函数需要一个内存描述符列表作为参数,尽管这种选择会对缓冲区对齐造成一点小麻烦。除非应用程序在CreateFile调用中使用FILE_FLAG_NO_BUFFERING标志,I/O管理器从不强制设备对象的Alignment-Requirement值对齐到用户模式的数据缓冲区上。(除非在checked版本的系统中,否则绝不要对内核模式的调用者做这种强制要求) 但是,如果你的设备或HAL确实需要DMA缓冲区开始于某个特殊的边界,你应该最后把一小部分用户数据复制到正确对齐的内部缓冲区中以迎合这个对齐需求,或者干脆拒绝任何缓冲区未对齐请求。 我的理解就是从这里而来的。兄弟看看,是什么地方我理解错了。 |
|
|
地下室#
发布于:2002-06-27 13:12
是这样呀
你的理解没错,但是有些地方不明确。 在fdo的属性里面,我们设置成DirectIo,这里影响的是readfile和 writefile,所传的缓冲区是beffer还是directio的,而deviceiocontrol中的缓冲区属性是由ioctl码来决定的,所以就要看你的dma操作所需的缓冲区是怎么传给驱动的, 另外,mdl也是可以构建的,有专门关于mdl的函数,你可以看看 |
|
|
5楼#
发布于:2002-06-27 14:32
多谢!给分!! :D :D
|
|
|