xshanlin
驱动牛犊
驱动牛犊
  • 注册日期2007-02-21
  • 最后登录2009-09-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1963回复:1

应用层分配的缓冲可以给驱动里面做DMA的时候使用吗?

楼主#
更多 发布于:2009-09-08 15:49
步骤:
1、在应用层分配一个相应大小的缓冲区
2、通过deviceio传递给驱动缓冲的指针和大小
3、驱动里面进行
    mdl = ioallocatemdl(buf, size, false, true, null);
        try
       { MmProbeAndLockPages(mdl, KernelMode, IoModifyAccess);
         phyaddr = ( MmGetMdlPfnArray(mdl) [0] ) << PAGE_SHIFT; // 获取物理地址,用于DMA};
4、DMA完成,通知应用层
5、应用层将缓冲入队列
6、通知驱动反映射
    MmUnlockPages(mdl);
        iofreemdl(mdl);

重复以上过程。

请问这样可行吗?如果有错误的话,请指正。
SevenLuck
驱动牛犊
驱动牛犊
  • 注册日期2008-01-23
  • 最后登录2012-10-22
  • 粉丝2
  • 关注1
  • 积分37分
  • 威望55点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-11-04 11:43
DMA支持2种方式,一种是公共缓冲区,另一种是基于包的缓冲区。基于包的缓冲区,就是使用应用层的缓冲区
游客

返回顶部