MDL:memory descriptor list 用于描述一段内存,记录了内存的起始页,和页内偏移,以及映射至系统空间的地址。
驱动使用直接IO方式时,系统会把用户地址空间的页面锁定,使其不会被换出,并构造MDL描述这些页面。驱动程序应使用MmGetSystemAddressForMdlSafe来重新将地址映射到系统地址空间。
MDL结构有一个flag,对MDL操作的函数会影响其值。
MDL相关的函数有:
MmInitializeMdl:初始化一个MDL改MDL必须已经是分配好的,该函数将Flag置为0;
IoAllocateMdl:分配一个MDL,分配好的MDL之后跟着页面帧编号,该函数为Flag追加MDL_ALLOCATED_FIXED_SIZE;
IoFreeMdl:释放一个MDL,该MDL由IoAllocateMdl分配;
MmBuildMdlForNonPagedPool:为非分页内存池中的页面构造MDL,该函数为Flag追加MDL_SOURCE_IS_NONPAGED_POOL,并填充MappedSystemVa;
MmMapLockedPagesSpecifyCache:将已锁定的内存页重新映射,并指示缓存类型,该函数为Flag追加MDL_MAPPED_TO_SYSTEM_VA;
MmProbeAndLockPages:检验内存的可访问性,并将其锁定在内存中,该函数为Flag追加MDL_PAGES_LOCKED;
MmGetSystemAddressForMdlSafe:从MDL中获取系统地址,该函数检测Flag中MDL_SOURCE_IS_NONPAGED_POOL与MDL_MAPPED_TO_SYSTEM_VA,如果符合之一,则直接读取MappedSystemVa,否者调用MmMapLockedPagesSpecifyCache将其映射;
MmGetMdlVirtualAddress:直接获取MDL中内存的虚拟地址;
MmGetMdlByteCount:获取MDL中内存的字节数.