JackyWu
驱动小牛
驱动小牛
  • 注册日期2001-10-25
  • 最后登录2011-04-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1700回复:4

关于DirectIO的实现。

楼主#
更多 发布于:2002-06-27 10:14
我想用DirectIo来实现数据的传输。但是以前没有做过。也没有看到别人的代码。所以自己看资料,然后瞎猜该怎么做。请大家看看我的想法对不对。

DirectIo通过MDL来实现,MDL主要是在用户虚拟地址空间和物理内存地址之间架起一个桥梁。当我需要往内存里面写东西的时候,需要察看MDL里面记录的物理内存地址,然后象BufferedIo一样通过READ_REGISTER_UCHAR来得到硬件设备的数据,然后再用RtlCopyMemory等函数来将数据拷贝到物理内存中。

1,我的理解是否正确?
2,有没有更简单的方法,比如将MDL直接交给某个函数,让他自动写物理内存,而不用我自己去查看MDL里面的物理内存地址。
3,设备的内存映射地址上的数据一般通过READ_REGISTER_UCHAR来获得,能否将地址直接写到RtlCopyMemory的参数里面去?这样做能不能让函数自动从设备的内存映射的地址上直接取数据,然后拷贝到物理内存中?

请各位帮忙看看我的理解是否正确。如果有经典的DirectIo的代码,能够给兄弟一观?多谢!!

[编辑 -  6/27/02 by  JackyWu]

最新喜欢:

yellowdogyellow...
多年以后,我又回来了。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-27 13:30

directio是这样的

以用户态和驱动通信为例:

我在应用程序中分配了一块缓冲区:x[100];

传给驱动,如果是directio方式

那么我在驱动中要得到的缓冲区指针就是:

PMDL Mdl = Irp->MdlAddress;
pDevExt->UserBuffer = (PUSHORT)MmGetSystemAddressForMdl(Mdl);

这时你就可以像使用x[]的方式使用pDevExt->UserBuffer 了

事实上系统是把这块缓冲区锁在内存中以防止被交换出去

[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-06-27 13:39
高人高见。 :D
JackyWu
驱动小牛
驱动小牛
  • 注册日期2001-10-25
  • 最后登录2011-04-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-27 14:21
 :D :D爽!高手的解释,看了就是爽!小弟我佩服!我给分!!赫赫。。。。
多年以后,我又回来了。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-27 14:26
过奖了

[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
游客

返回顶部