MDL: 内存描述列表。
一个MDL会描述一块虚拟地址空间,该空间可能在用户空间,也可能在系统空间。在进行IO操作时,如果采用 DEVICE_IN_DIRECT和DEVICE_OUT_DIRECT时,将一块用户空间在系统空间建立映射。就是用户虚拟地址空间和系统虚拟地址空间都同时指向一块物理内存,然后锁定该内存不允许其换出,这样就能够在系统内核中操作用户空间了。

MDL的结构:
typedef struct _MDL {
  struct _MDL  *Next;
  CSHORT  Size;          //MDL大小  = sizeof(MDL)+ n*siezof(PFN_NUMBER)
  CSHORT  MdlFlags;
  struct _EPROCESS  *Process;
  PVOID  MappedSystemVa;      //映射后系统空间首地址
  PVOID  StartVa;          //用户空间地址
  ULONG  ByteCount;        //大小
  ULONG  ByteOffset;        //首地址距离首页的偏移
} MDL, *PMDL;


MDL只是一个内存地址列表的头部,后面还跟有一个ULONG数组,MDLPages【n】.建立了描述表时,该表指向物理内存页号。 当在物理空间建立映射后:该数组指向系统空间虚地址页号。

相关的操作:

IoAllocateMDL :在系统空间分配一个MDL大小的空间,包括MDLPages数组。然后挂入Irp->MDLAddress队列。

MmInitializeMDL: 简单初始化各个成员变量。


MmProbeAndLockPages:  根据进程的页面映射表将这些虚拟页面转换成物理页面,并且锁定这些物理页面不让倒出。MDLPages指向物理页面页号。


MmMapLockedPages: 将物理页面映射成系统地址空间虚拟内存。 MDLpages指向系统虚拟地址空间。 系统虚拟地址空间的首地址: MDL-> MappedSystemVa


MmMapLockedPages是在MmGetSystemAddressForMDLSafe中调用的。所以映射是在MmGetSystemAddressForMDLSafe中完成的。

参考了 ReactOS的源码。。。。