各位大牛请进,请教IoAllocateMdl,MmProbeAndLockPages以及MmBuildMdlForNonPagedPool的用法

languo111 2009-07-01 03:39:37
各位大牛,
最近一直在看MDL的相关资料,有一些总结,也有一些疑惑,现在写出来,请大家不吝赐教。
第一,MDL的一个用法是提供驱动程序访问用户模式数据缓冲区的一种方式:直接I/O。也就是说通过MDL告诉驱动程序如何访问用户模式的数据缓冲区,这很好理解;
第二,第二个用法是这样的,一些驱动程序在执行直接 I/O 来满足设备 I/O 控制请求时也使用 MDL,常用的方式如下:
1,分配一个buf,可能是分页或者非分页的;
2,调用IoAllocateMdl,指向这个buf;
3,对于分页内存来说,调用MmProbeAndLockPages以及MmGetSystemAddressForMdlSafe来锁定内存页,以防止被page out出去;
对于非分页内存而言,调用MmBuildMdlForNonPagedPool映射到物理内存上。

对于第二个用法,对于分页内存可能还有意义,保证其不被page out,但对于非分页内存,我觉得除了DMA以外,别的都没有用处,既然已经是非分页内存了,直接使用就好了,为什么还要生成一个MDL去做映射?我一直都不是非常理解,有可能根本就是理解错误,请大家指教
...全文
2366 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jzxsasch 2012-01-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cuagain 的回复:]

I/O多数是异步的(如DPC),在执行I/O的过程中用户模式线程在不断切换,所以处理I/O时访问的虚拟地址已不是原先发出I/O请求的线程的地址,那样将发生错误。创建MDL将原先位于用户空间的缓冲区内容映射到系统空间,由于用户模式内存是切换的而系统模式内存对所有进程都是不变的,故不会发生以上问题。
[/Quote]
eraser2011 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cuagain 的回复:]
I/O多数是异步的(如DPC),在执行I/O的过程中用户模式线程在不断切换,所以处理I/O时访问的虚拟地址已不是原先发出I/O请求的线程的地址,那样将发生错误。创建MDL将原先位于用户空间的缓冲区内容映射到系统空间,由于用户模式内存是切换的而系统模式内存对所有进程都是不变的,故不会发生以上问题。
[/Quote]
先顶啦!
project2502 2012-01-18
  • 打赏
  • 举报
回复
非分页内存也是虚拟地址- -
codesnail 2011-09-30
  • 打赏
  • 举报
回复
学习。
namelcx 2011-09-30
  • 打赏
  • 举报
回复
哦,应该是虚拟地址和对应的物理页面的映射关系已经建立了
namelcx 2011-09-30
  • 打赏
  • 举报
回复
MmBuildMdlForNonPagedPool的主要作用并不是将MDL描述的物理页面集合映射到系统地址空间(4G虚拟地址空间的高2G部分)。传递给IoallocateMdl的虚拟地址已经被映射到系统地址空间中了,MmBuildMdlForNonPagedPool的作用只是把这种映射关系读出来并保存到MDL的结构中。
qiaofengbuhui 2011-05-20
  • 打赏
  • 举报
回复
楼上分析的很有道理呀!!!
顶!顶!顶!!!!!!!!!!1
CubieZhou 2010-10-01
  • 打赏
  • 举报
回复
你需要弄明白一件事情:分页内存也好,非分页内存也好,都是针对虚拟地址空间来说的。MDL的作用在于跟踪一段虚拟地址空间所对应的物理页面集合。虚拟地址连续,不代表物理地址连续。在x86平台上进行DMA操作时,对于有分散-集中功能的DMA控制器,就需要类似于MDL的数据结构,来与内存一次性交换物理地址虽然离散但是虚拟地址连续的数据块。
对于分页内存来说,调用MmProbeAndLockPages锁定内存页,锁定的不过是物理页面MmGetSystemAddressForMdlSafe才是用来保证物理页面所映射的虚拟地址在当前有效。物理页面在内存,并不代表虚拟地址有效:如果相关的工作集被修改(或者如果进程释放或取消映射地址范围),这些虚拟地址就不再有效。
对于非分页内存而言,调用MmBuildMdlForNonPagedPool的主要作用是将MDL描述的物理页面集合映射到系统地址空间(4G虚拟地址空间的高2G部分),你上面的理解是有问题的。
sysbbl 2010-09-30
  • 打赏
  • 举报
回复
MmProbeAndLockPages并不将物理页面映射到内核地址空间,而仅锁定物理页面
cuagain 2010-03-05
  • 打赏
  • 举报
回复
I/O多数是异步的(如DPC),在执行I/O的过程中用户模式线程在不断切换,所以处理I/O时访问的虚拟地址已不是原先发出I/O请求的线程的地址,那样将发生错误。创建MDL将原先位于用户空间的缓冲区内容映射到系统空间,由于用户模式内存是切换的而系统模式内存对所有进程都是不变的,故不会发生以上问题。
ding_net 2009-07-21
  • 打赏
  • 举报
回复
ding
mmx369 2009-07-07
  • 打赏
  • 举报
回复

mark
languo111 2009-07-03
  • 打赏
  • 举报
回复
自己顶上来。
cnzdgs 2009-07-01
  • 打赏
  • 举报
回复
有些时候需要使用MDL,例如要构造一个IRP发给另一设备驱动程序。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧