wjnong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:1546回复:5

问一个问题: 总线主控设备的DMA编程方面的问题

楼主#
更多 发布于:2004-08-22 11:11
我看了Windows Driver Model那本书,书中提到:
如果设备是总线主控方式,那么你不能获得DMA资源。即你的资源提取循环语句中不需要CmResourceTypeDma类型的case子句。PnP管理器不赋予你任何DMA资源,因为硬件本身包含有执行DMA传输所必须的所有电路逻辑,所以系统没必要赋予你DMA资源。


那么,下面这些语句,还需不需要呢?
 
DEVICE_DESCRIPTION dd;
RtlZeroMemory(&dd, sizeof(dd));
dd.Version = DEVICE_DESCRIPTION_VERSION;
dd.InterfaceType = bustype;
dd.MaximumLength = 0x1000;
dd.Dma32BitAddresses = TRUE;
dd.Master = TRUE;

pdx->AdapterObject = IoGetDmaAdapter(pdx->Pdo, &dd, &pdx->nMapRegisters);
if (!pdx->AdapterObject)
AthlonxpX86
驱动小牛
驱动小牛
  • 注册日期2002-11-10
  • 最后登录2013-07-17
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-30 15:53
但还有一个问题,我怎么获得物理地址?而且我怎么能保证那片物理地址是连续的呢?

DMA内存使用方案有许多种,最好使用不连续的物理内存,尽管效率上可能低了些,但对于操作系统来说降低了系统要求,

1 将应用程序分配的数据缓冲区锁定到内存MmLockPagableDataSection
2 得到缓冲MDL描述,通过MDL得到物理页面表
3 提交给DMA控制器
AthlonxpX86(桃源村)
wjnong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-26 23:01
但还有一个问题,我怎么获得物理地址?而且我怎么能保证那片物理地址是连续的呢?
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-26 10:09
完全不需要,你要做的就是把你的DMA用的内存物理地址传递给你的硬件就可以了
wjnong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-23 22:50
谢谢指导,我也觉得主控设备的硬件已有发起DMA的能力,所以怀疑需不需要那些东西。
AthlonxpX86
驱动小牛
驱动小牛
  • 注册日期2002-11-10
  • 最后登录2013-07-17
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-22 13:06
可能是书的翻译有些错误,一般情况下DMA资源是分配给系统DMA(即8237)的,因为系统DMA只有一个,每一时刻都只有一个设备能使用,因此需要DMA适配器来同步设备对DMA的使用,其实就是个互斥量,如果你的设备自己拥有DMA能力(PCI设备一般都具有),那就可以不用适配器(当然也可以用,比如你的驱动程序的几个线程需要共享你自己的DMA),申请资源也是没有任何用处的,因为别的设备驱动根本不会占用你的DMA资源,因此你的那段代码可以不要,由你自己决定怎样控制你的DMA晶片
AthlonxpX86(桃源村)
游客

返回顶部