MDL总结

MDL:memory descriptor list 用于描述一段内存,记录了内存的起始页,和页内偏移,以及映射至系统空间的地址。

驱动使用直接IO方式时,系统会把用户地址空间的页面锁定,使其不会被换出,并构造MDL描述这些页面。驱动程序应使用MmGetSystemAddressForMdlSafe来重新将地址映射到系统地址空间。

MDL结构有一个flag,对MDL操作的函数会影响其值。

MDL相关的函数有:

MmInitializeMdl初始化一个MDLMDL必须已经是分配好的,该函数将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中获取系统地址,该函数检测FlagMDL_SOURCE_IS_NONPAGED_POOLMDL_MAPPED_TO_SYSTEM_VA,如果符合之一,则直接读取MappedSystemVa,否者调用MmMapLockedPagesSpecifyCache将其映射;

MmGetMdlVirtualAddress直接获取MDL中内存的虚拟地址;

MmGetMdlByteCount获取MDL中内存的字节数.

你可能感兴趣的:(IO,list,System)