yeammy
驱动牛犊
驱动牛犊
  • 注册日期2002-12-27
  • 最后登录2012-02-22
  • 粉丝0
  • 关注0
  • 积分63分
  • 威望12点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1209回复:1

挑战DIRECT I/O(给分200)

楼主#
更多 发布于:2003-06-14 16:24
你好, 各位高手,小弟想向阁下请教有关DIRECT I/O的驱动开发问题:
1)IRP传递MdlAddress,这个MDL好象是由I/O MANGER建立的吧?但是这个IRP是怎么建立的呢?还有这个MDL与应用程序的关系如何?我好象在很多DIRECT I/O的例子中没有看到申请内存与驱动程序的MDL,难道应用程序不指点传送大小,驱动程序就知道要传送多少了?
2)用IoAllocateMdl建立的MDL与IRP传递的MDL之间的关系?
3)PNP的各个副控制代码IRP与ReadFile.WriteFile等应用程序之间是一种什么样的合作或者分工关系?
4)在DIRECT I/O中好象有良种方式共享内存,一是驱动程序申请内存,然后映射到应用程序,二是应用程序申请内存,锁定到驱动程序,请问具体是如何实现的呢?能否提供一些例子?
 
5)DPC,ISR运行级别都在PASSIVE-LEVEL之上,是否意味着DMA DIRECT I/O只能申请非分页内存?如果是这样,用户程序如何访问驱动程序申请的内存?
6)DIRECT I/O中,应用程序能否用WriteFile直接使用驱动程序中申请的内存把数据写到硬盘上,而不用ReadFile?如何实现?
7)申请内存什么地方体现出了连续内存和非连续内存的区别?能申请的最大连续内存是多大?
8)在驱动程序的READ,WRITE IRP中都要处理parameters.read.length,但是应用程序什么地方体现出了对这个length信息的传递?
  谢谢,谢谢!谢谢!实在问题多。
    
lifeship
驱动小牛
驱动小牛
  • 注册日期2002-10-18
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-14 23:19
1)IRP传递MdlAddress,这个MDL好象是由I/O MANGER建立的吧?但是这个IRP是怎么建立的呢?还有这个MDL与应用程序的关系如何?我好象在很多DIRECT I/O的例子中没有看到申请内存与驱动程序的MDL,难道应用程序不指点传送大小,驱动程序就知道要传送多少了?
这个MDLADDRESS确实是由IO MANAGER建立的,如果是DIRECT I/O方式,IO MANAGER 首先锁住用户提供的内存,是只常驻内存,然后,为他(即用户体统的内存)建立一个MDL,要建立MDL显然需要知道有多大的一块内存,这是在用户发送请求是指定的

2)用IoAllocateMdl建立的MDL与IRP传递的MDL之间的关系?
没有关系

3)PNP的各个副控制代码IRP与ReadFile.WriteFile等应用程序之间是一种什么样的合作或者分工关系?
应用程序在调用ReadFile or WriteFile是,windows dll将实际操作,最终向驱动发出了IRP_MJ_READ ,IRP_MJ_WRITE控制码,而当驱动的iocontrol返回时,在用户缓冲中将得到用户要求的数据。如果是异步方式,用户将不等待操作完成。

4)在DIRECT I/O中好象有良种方式共享内存,一是驱动程序申请内存,然后映射到应用程序,二是应用程序申请内存,锁定到驱动程序,请问具体是如何实现的呢?能否提供一些例子?
direct io值得是如何将用户缓冲传递给驱程使用,这里的缓冲,当然是用户分配的,而且,也不一定要锁定,(如buffer方式),对于direct io方式,是io管理器所定的,驱程或者应用程序无需作额外的工作。


5)DPC,ISR运行级别都在PASSIVE-LEVEL之上,是否意味着DMA DIRECT I/O只能申请非分页内存?如果是这样,用户程序如何访问驱动程序申请的内存?
应该是这样。 用户最好不要访问驱程的缓冲,驱程可以将他缓冲的数据拷贝的用户缓冲区。假如是在要访问驱程缓冲,可以采用双隐射,即将驱程缓冲同时映射到用户空间区
6)DIRECT I/O中,应用程序能否用WriteFile直接使用驱动程序中申请的内存把数据写到硬盘上,而不用ReadFile?如何实现?
writefile最终实际上是调用文件去冬程序,进而又文件驱动调用磁盘驱动,所以,驱动内部当然可以直接写。可以用zwopen...系列函数。
7)申请内存什么地方体现出了连续内存和非连续内存的区别?能申请的最大连续内存是多大?
不太清楚,不能很大
8)在驱动程序的READ,WRITE IRP中都要处理parameters.read.length,但是应用程序什么地方体现出了对这个length信息的传递?
就是你提工的数据读取长度
杯汝前来,  老子今朝,  放荡形骸!  甚长年抱渴,  咽如焦釜,  于今喜醉,  气似奔雷!  慢说刘伶,  古今达者,  醉后何妨死便埋! 
游客

返回顶部