asslittle
驱动牛犊
驱动牛犊
  • 注册日期2003-12-18
  • 最后登录2004-09-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2867回复:6

DO_DIRECT_IO还是DO_BUFFERED_IO?

楼主#
更多 发布于:2004-03-05 19:39
1、DO_DIRECT_IO还是DO_BUFFERED_IO?这两种方式有什么区别?分别对应什么情况使用?

2、应用程序中writefile、readfile会进入ds封装好的write、read,但我如果在write、read中写了几个pipe的传输,怎么在应用程序中控制?

3、同步方式与异步方式与Isochronous Transfer有什么关系吗?
我理解的同步方式、异步方式是指对irp的处理,异步方式也可以建立Isochronous Transfer吧?

现在开始有些乱了,还请高手讲讲,谢谢!

最新喜欢:

r2109twr2109t...
asslittle
驱动牛犊
驱动牛犊
  • 注册日期2003-12-18
  • 最后登录2004-09-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-07 14:09
懂的人能给指点一下吗?
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-07 19:43
1、DO_DIRECT_IO还是DO_BUFFERED_IO?这两种方式有什么区别?分别对应什么情况使用?
答:
DO_DIRECT_IO常用于传输大块的讲求速度的数据。DO_BUFFERED_IO常用于传输小块的,慢速的数据。DO_DIRECT_IO的效率较高(只需内存锁定即可),代价是牺牲物理内存。DO_BUFFERED_IO的内存效率高,但速度差(它要分配内存,复制数据)。造成这种区别的主要原因还是因为处理器的Ring 0到Ring4的穿越造成的(微软只用了两层)。你无法两全其美,只能取其一(当然有时候能两全其美,后面会提到)。
DO_DIRECT_IO主要用于使用DMA的底层驱动。Mass Storage也用。
DO_BUFFERED_IO主要用于HID(包括Mouse,Keyboard), 一些Video, 还有串口,并口什么的。
不过我看绝大多数设计者都挺自私的,上来就用DIRECT IO,  :)

2、应用程序中writefile、readfile会进入ds封装好的write、read,但我如果在write、read中写了几个pipe的传输,怎么在应用程序中控制?
答:
我没太看懂你是什么意思。我猜你是说如何在应用程序中控制Driver中的Read、Write函数中的执行细节-即有选择地执行指定的代码。如果是这样,那你最好是加入IO CTRL或Vendor Request什么的外部控制。然后在Driver和固件中使用全局变量即可。

3、同步方式与异步方式与Isochronous Transfer有什么关系吗?
我理解的同步方式、异步方式是指对irp的处理,异步方式也可以建立Isochronous Transfer吧?

答:同步方式与异步方式是一种概念,到处都在使用,也更容易混淆和混乱。你可以在软件、通信、甚至电机领域都见得到他们。跟它们类似的还有“中断”-让论坛上的兄弟们头大的又一杀手!
你说的“同步方式与异步方式”是指Request的操作模式。对应于软件中的编程。Windows更提倡采用异步方式,界面更友好,效率更高。同步方式更古典,简单,适合初学者。简单地说,对于一个长时间的操作(放在一个函数里),异步操作立刻返回STATUS_PENDING,至于什么时候完成或超时,你自己再去查询。同步操作会傻在那里直到操作完成或超时。如果做过串口编程或网络编程会很容易理解这两个概念。异步操作配合Windows的消息机制可以做出很漂亮的接口和界面。
Isochronous Transfer则完全是USB的一种传输方式:主有用于多媒体流。你可以设想:如果Usb传输出错,对于资料传输(例如文件传输)而言事必要重发。而对于音视频,则完全可以丢弃,因为同步连续才是最重要的。因为即便你重传,声音和图像也已经停顿或扰动了。所以同步传输关心的是在此时此刻把当前的数据发送出去。完全不理会前一个包是否有问题。就像电视机一样,关注于实时性。
所以结论是:“我理解的同步方式、异步方式是指对irp的处理,异步方式也可以建立Isochronous Transfer”可以这样理解。

最后,提到关于两全其美的事情:可以DO_DIRECT_IO和DO_BUFFERED_IO两种都不用,达到内存与效率兼顾。但是(说到“但是”总是令人失望,真是没办法!)只能用于高层驱动程序(是指它运行于用户线程空间),诸如FSD等。这种IO方式的使用还有一堆罗里罗唆的要求,比如ProbeForRead,ProbeForWrite什么的。初学者可以暂时不去玩它。
A strong man can save himself. A great man can save another.
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-07 19:53
另外,提到分数问题。
分数不是必需的,可给可不给。但是是对别人的一种肯定。必定一分钱一分货。
我可以写一行,也可以写十行。毕竟拿人钱财,与人消灾。得到分数的人肯定会更有回答问题的积极性。

如果你的分数不多,有两种选择:
1。努力回答别人的提问。(这也就是分数设计的目的)
2。给别人一个解释,没人会太贪财的。

我认为免费的东西是毫无价值甚至会害人的。
我们国家已经被微软免费的操作系统还苦了。(我认为这就是鸦片战争!!!)

我们做研发的要争气呀,不能给中国人丢脸!
A strong man can save himself. A great man can save another.
asslittle
驱动牛犊
驱动牛犊
  • 注册日期2003-12-18
  • 最后登录2004-09-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-08 09:07
谢谢!!!

基本上清楚了,至于加IO CTRL或Vendor Request什么的外部控制,我再想想.

哈哈,不过我还是觉得分数这东西真的是很无聊,每个人的观念不同嘛~
如果你在北京,我可以请你去搓一顿,这可比分数实在多了:p



zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-08 09:33
最近,电脑老是受到病毒的骚扰,就是那个SVCHOST.EXE中招。
SVCHOST是干什么的呢?
它是为了节约系统资源的。说白了就是:如果好多功能都使用各自单独的进程,则系统开销就会很大。所以Windows系统使用SVCHOST+若干服务DLL的做法。每个DLL都是一个功能服务,但公用一个SVCHOST进程。省是省了,惹得病毒也上来了,并且失去了多进程的安全性优势。可惜可惜。
对比之下:用VB开发的程序员有几个会考虑资源啊效率啊什么的!

Windows看起来有点像勒禁裤腰带请客的那种,自己弄得紧巴巴的,让上层软件随便吃!
不过,每个操作系统都这样。 呵呵!
A strong man can save himself. A great man can save another.
zzh520420
驱动牛犊
驱动牛犊
  • 注册日期2008-07-24
  • 最后登录2011-05-16
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望59点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-11-24 11:32
学到东西了,加油!谢谢提问的 asslittle 和解答的zmwk
游客

返回顶部