阅读:1700回复:4
关于DirectIO的实现。
我想用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] |
|
最新喜欢:yellow...
|
沙发#
发布于:2002-06-27 13:30
directio是这样的 以用户态和驱动通信为例: 我在应用程序中分配了一块缓冲区:x[100]; 传给驱动,如果是directio方式 那么我在驱动中要得到的缓冲区指针就是: PMDL Mdl = Irp->MdlAddress; pDevExt->UserBuffer = (PUSHORT)MmGetSystemAddressForMdl(Mdl); 这时你就可以像使用x[]的方式使用pDevExt->UserBuffer 了 事实上系统是把这块缓冲区锁在内存中以防止被交换出去 |
|
|
板凳#
发布于:2002-06-27 13:39
高人高见。 :D
|
|
地板#
发布于:2002-06-27 14:21
:D :D爽!高手的解释,看了就是爽!小弟我佩服!我给分!!赫赫。。。。
|
|
|
地下室#
发布于:2002-06-27 14:26
过奖了
|
|
|