阅读:2083回复:8
DMA中的缓冲区
我用DS做DMA,涉及到缓冲区.
DS里的类KCommonBuffer,表示通用缓冲区,但还有一个缓冲区,就是readfile或 writefile或deviceioctl传下来的缓冲区 ,请问这两者有什么区别? 怎样确定是否需要KCommonBuffer? 谢谢先 |
|
|
沙发#
发布于:2003-05-03 10:26
app 中的readfile 的buffer是用户buffer,经mdl传给驱动,转换为虚拟地址,驱动程序才能使用。
在dma时。在使用公共缓冲区,要获得该缓冲区的虚拟地址给驱动程序使用。同时获得给缓冲区的物理地址给dam控制器使用。 仅共参考。 |
|
板凳#
发布于:2003-05-03 14:10
谢谢楼上大哥的回答,但我还是没有明白,他们二者有什么联系和区别?
|
|
|
地板#
发布于:2003-05-03 16:24
我也是菜鸟一个,现在正在做一个pci总线的采集卡的驱动(2K DDK),可能跟你遇到的问题可能差不多。
我想,app 中的readfile的buffer是用户buffer,通过该buffer 可把顶层的数据发送给驱动程序,驱动程序在通过公共缓冲区(在驱动程序中申请得到)把要发送的数据传给硬件板卡。 use buffer common buffer app data -----------> driver -------------> hardware app data <----------- driver <------------- hardware 再问问高手。 |
|
地下室#
发布于:2003-05-03 18:20
我也是菜鸟一个,现在正在做一个pci总线的采集卡的驱动(2K DDK),可能跟你遇到的问题可能差不多。 再次感谢楼上大哥的回答,听你的意思,通用缓冲区是必需的?? 我理解:我们在用户态分配一块内存,并且把返回的地址指针作为参数传递给::Writefile 这个地址就是用户太虚拟地址。在驱动程序的处理函数中,调用函数 MmGetSystemAddressForMdlSafe来得到核心态虚拟地址,这些都与通用缓冲区无关。 当我们分配COMMON BUFFER的 时候我们可以得到两种地址:核心态虚拟地址和逻辑地址。这个核心虚拟地址和前面那个映射的应用层的核心虚拟地址不是一回事!那么通用缓冲区就不是必须存在的! 如果我们在驱动中不申请通用缓冲区的话,就用映射的应用层的那个缓冲区来存取数据。如果申请通用缓冲区的话,那么这两个核心虚拟地址有什么关系? |
|
|
5楼#
发布于:2003-05-04 09:52
我的问题其实也就是通用缓冲是不是一定需要,看书上说,不一定需要 :有两种形式的传输:基于PACKET形式的传输和基于通用缓冲区形式的传输。前者不需要,后者需要。
我的理解是:通用缓冲申请到后,能得到DMA传输用的逻辑地址,我们知道逻辑地址是必需的。如果用基于PACKET形式的传输,那么这个逻辑地址从哪里得到??? 我觉得很矛盾! 请高手指点迷津! |
|
|
6楼#
发布于:2003-05-04 09:57
在做DMA时有两种方法:
1。基于包的DMA。这种方法不需要申请COMMON BUFFER,但吞吐数据量小。 2。基于公共缓冲区的DMA。这种方法就需要申请COMMER BUFFER,吞吐数据量大。 因此是否申请COMMON BUFFER ,完全根据你的实际需要而定。 |
|
7楼#
发布于:2003-05-04 10:09
楼上的大哥说的很对,一点不错,是这么回事!
如果用基于包的DMA的话,逻辑地址是怎样产生的? |
|
|
8楼#
发布于:2003-05-10 21:39
大概每次2k左右,只需要基于包的dma吧?是吗?谢谢!
|
|