jper73
驱动牛犊
驱动牛犊
  • 注册日期2010-05-28
  • 最后登录2011-06-17
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2403回复:3

使用DMA环境的问题

楼主#
更多 发布于:2010-12-03 19:47
初学者求教:
学习得知DMA一般使用在DO_DIRECT_IO模式的驱动下.但最近我在学习一个pci驱动.他使用了DMA,但定义的IOCTL码又是METHOD_BUFFERED的,那就是说是DO_BUFFERED_IO模式,这就和前面矛盾了,所以我也矛盾了.
那么DMA是不是只能使用在DO_DIRECT_IO模式下的?如果不是,像DO_BUFFERED_IO模式下又怎么使用呢?难道DeviceIoControl又是可以随意使用?
好吧!这个驱动是DriverStudio编写的,难道是DriverStudio特别实现的?我本来是想把这个驱动改成WDM形式的,所以纠结中...
bbstmp
驱动牛犊
驱动牛犊
  • 注册日期2010-01-05
  • 最后登录2010-12-30
  • 粉丝1
  • 关注1
  • 积分29分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-12-04 08:39
在使用DriverStudio向导时,定义read、write、IOCTL时,会要求你选择其操作方式;

1. 对于read、write,其选择方式有:“Buffered”、“Direct”,就是你提到的:DO_BUFFERED_IO、DO_DIRECT_IO;

2. 对于IOCTL,有Buffered、In_Direct、Out_Direct三种方式,即:METHOD_BUFFERED、METHOD_IN_DIRECT、METHOD_OUT_DIRECT
jper73
驱动牛犊
驱动牛犊
  • 注册日期2010-05-28
  • 最后登录2011-06-17
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-12-04 19:25
谢谢!
对于这个问题我知道了,定义IOCTL码的Method模式和驱动的读写模式根本就是两会事,不会冲突的.
现在有个更要命的问题了.WDM驱动 问一下RemoveLock删除锁怎么用.
我根据文档,在AddDevice时用IoInitializeRemoveLock初始删除锁,在I处理RP_MN_REMOVE_DEVICE时用IoReleaseRemoveLockAndWait等待所有IRP动作完.
但现在我停不了设备或是删除设备(在系统中,不是驱动程序中),一旦停止或删除设备就蓝屏.文档中特别提醒IoReleaseRemoveLockAndWait要在删除所有资源或摘除设备,删除设备前使用.我是这么做的啊,在PnpRemoveDevice中是第一个调用的,为什么还是出错了呢?
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-12-07 12:29
如果使用DMA,建议用DO_DIRECT_IO

------------------------------------------------------------------
张帆的驱动开发论坛 http://bbs.kerneldev.com/
张帆的驱动开发QQ群1# 49944346(满)
张帆的驱动开发QQ群2# 64778681(目前开放中...)
张帆的内核学习论坛 http://bbs.kerneldev.com
游客

返回顶部