阅读:5287回复:6
关于 MmGetSystemAddressForMdlSafe 没有锁住页面的问题
在Passive_level的IRQ下面,MmGetSystemAddressForMdlSafe没有锁住内存。设备的Flags是DO_DIRECT_IO
以下是部分代码 case IRP_MJ_READ: pSysBuf = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority); 当我往pSysBuf 中Copy数据的时候,发现在pSysBuf+4096之后的数据有时候会被修改。 按照我的理解,MmGetSystemAddressForMdlSafe函数是将内存页面映射到系统的线性虚拟内存中,共驱动程序去操作,而x86系统的页面大小是4K, 而刚刚好pSysBuf+4096之后的数据有时候会被修改。 所以我怀疑是不是MmGetSystemAddressForMdlSafe并没有将这些页面锁住? 有没有朋友碰到我一样的情况? |
|
沙发#
发布于:2007-09-20 11:31
MmGetSystemAddressForMdlSafe其实只是个宏
代码如下: #define MmGetSystemAddressForMdlSafe(MDL, PRIORITY) \ (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \ MDL_SOURCE_IS_NONPAGED_POOL)) ? \ ((MDL)->MappedSystemVa) : \ (MmMapLockedPagesSpecifyCache((MDL), \ KernelMode, \ MmCached, \ NULL, \ FALSE, \ (PRIORITY)))) |
|
|
板凳#
发布于:2007-09-20 11:36
是啊,我知道这个函数是一个宏的啊。
但是谁能解释我的问题呢? |
|
地板#
发布于:2007-09-21 13:42
还有人知道这个问题吗?
|
|
地下室#
发布于:2007-10-10 23:11
帮你顶,我也想知道
|
|
5楼#
发布于:2007-10-14 11:32
是否一次只能锁住一个页面的大小?
|
|
|
6楼#
发布于:2010-02-17 19:59
关注一下!等待高手回答!
|
|