阅读:1546回复:5
问一个问题: 总线主控设备的DMA编程方面的问题
我看了Windows Driver Model那本书,书中提到:
如果设备是总线主控方式,那么你不能获得DMA资源。即你的资源提取循环语句中不需要CmResourceTypeDma类型的case子句。PnP管理器不赋予你任何DMA资源,因为硬件本身包含有执行DMA传输所必须的所有电路逻辑,所以系统没必要赋予你DMA资源。 那么,下面这些语句,还需不需要呢? DEVICE_DESCRIPTION dd; |
|
沙发#
发布于:2004-08-30 15:53
但还有一个问题,我怎么获得物理地址?而且我怎么能保证那片物理地址是连续的呢? DMA内存使用方案有许多种,最好使用不连续的物理内存,尽管效率上可能低了些,但对于操作系统来说降低了系统要求, 1 将应用程序分配的数据缓冲区锁定到内存MmLockPagableDataSection 2 得到缓冲MDL描述,通过MDL得到物理页面表 3 提交给DMA控制器 |
|
|
板凳#
发布于:2004-08-26 23:01
但还有一个问题,我怎么获得物理地址?而且我怎么能保证那片物理地址是连续的呢?
|
|
地板#
发布于:2004-08-26 10:09
完全不需要,你要做的就是把你的DMA用的内存物理地址传递给你的硬件就可以了
|
|
地下室#
发布于:2004-08-23 22:50
谢谢指导,我也觉得主控设备的硬件已有发起DMA的能力,所以怀疑需不需要那些东西。
|
|
5楼#
发布于:2004-08-22 13:06
可能是书的翻译有些错误,一般情况下DMA资源是分配给系统DMA(即8237)的,因为系统DMA只有一个,每一时刻都只有一个设备能使用,因此需要DMA适配器来同步设备对DMA的使用,其实就是个互斥量,如果你的设备自己拥有DMA能力(PCI设备一般都具有),那就可以不用适配器(当然也可以用,比如你的驱动程序的几个线程需要共享你自己的DMA),申请资源也是没有任何用处的,因为别的设备驱动根本不会占用你的DMA资源,因此你的那段代码可以不要,由你自己决定怎样控制你的DMA晶片
|
|
|