阅读:1208回复:1
挑战DIRECT I/O(给分200)
你好, 各位高手,小弟想向阁下请教有关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信息的传递? 谢谢,谢谢!谢谢!实在问题多。 |
|
沙发#
发布于: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信息的传递? 就是你提工的数据读取长度 |
|
|