用户空间和内核的数据交换的两种方法:
1.缓冲区。进入内核后在系统空间分配一块相应的缓冲区,并从用户空间缓冲区把内容复制到系统空间的缓冲区 DO_DIRECT_IO
2.临时为用户空间缓冲区增添一个系统空间映射,这使同一组物理页面有了两个虚拟地址区间,其一就是原来的用户空间虚拟地址区间,其二是系统空间的虚拟地址区间。 DO_DIRECT_IO
采用直接方法(DO_DIRECT_IO)要通过IoAllocateMdl分配一个系统空间虚拟地址区间,并将其记录在一个“内存描述列表”(Memory Descriptor List)中备用。对于MDL列表中的每一个虚存页面,MmProbeAndLockPage通过MmGetPfnForProcess()根据当前进程的页面映射获取其所映射的物理页面,并锁定该物理页面不让倒换。这样,MDL列表中的虚存页面号就全编程了物理页面号。IoAllocateMdl需与MmProbeAndLockPages结合在一起才算完整。用完之后要释放MDL列表并撤销临时映射IoFreeMdl()来实现。