阅读:2489回复:3
使用DMA环境的问题
初学者求教:
学习得知DMA一般使用在DO_DIRECT_IO模式的驱动下.但最近我在学习一个pci驱动.他使用了DMA,但定义的IOCTL码又是METHOD_BUFFERED的,那就是说是DO_BUFFERED_IO模式,这就和前面矛盾了,所以我也矛盾了. 那么DMA是不是只能使用在DO_DIRECT_IO模式下的?如果不是,像DO_BUFFERED_IO模式下又怎么使用呢?难道DeviceIoControl又是可以随意使用? 好吧!这个驱动是DriverStudio编写的,难道是DriverStudio特别实现的?我本来是想把这个驱动改成WDM形式的,所以纠结中... |
|
沙发#
发布于: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 |
|
板凳#
发布于:2010-12-04 19:25
谢谢!
对于这个问题我知道了,定义IOCTL码的Method模式和驱动的读写模式根本就是两会事,不会冲突的. 现在有个更要命的问题了.WDM驱动 问一下RemoveLock删除锁怎么用. 我根据文档,在AddDevice时用IoInitializeRemoveLock初始删除锁,在I处理RP_MN_REMOVE_DEVICE时用IoReleaseRemoveLockAndWait等待所有IRP动作完. 但现在我停不了设备或是删除设备(在系统中,不是驱动程序中),一旦停止或删除设备就蓝屏.文档中特别提醒IoReleaseRemoveLockAndWait要在删除所有资源或摘除设备,删除设备前使用.我是这么做的啊,在PnpRemoveDevice中是第一个调用的,为什么还是出错了呢? |
|
地板#
发布于:2010-12-07 12:29
如果使用DMA,建议用DO_DIRECT_IO
------------------------------------------------------------------ 张帆的驱动开发论坛 http://bbs.kerneldev.com/ 张帆的驱动开发QQ群1# 49944346(满) 张帆的驱动开发QQ群2# 64778681(目前开放中...) |
|
|