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中内存的字节数.
MDL内存描述符详解
本文详细介绍了MDL(Memory Descriptor List)的概念及其在驱动程序中的应用。MDL用于描述一段内存,记录内存的起始页、页内偏移及映射至系统空间的地址。文章还列举并解释了与MDL相关的多个函数,如初始化、分配、释放MDL等操作。
1550

被折叠的 条评论
为什么被折叠?



