MDL

摘要:
1首先,mdl的数据结构。2.mdl数据结构的含义根据用法逐步解释:一般用法,First IoAllocateMdl:prototype:最常用的是VirtualAddress和Length。将NonPageablebuffer的起始地址传递给IoAllocateMdl,并将长度传递给他。根据长度和VirtualAddress,计算出该缓冲区总共跨越了几个虚拟页面。分配MDL内存-包括上述结构_ MDL,ULONG主体部分。PFN_NUMBER为ULONG,IOP_FIXED_SIZE_MDL_PFNS表示ptes的数量。这里我们展示了关键代码:这样mdl结构的整体构建就结束了,mdl的使用就开始了。使用MmMapLockedPagesSpecificCache将MDL中存储的物理地址页映射到虚拟地址。

1 先是mdl的数据结构。

MDL第1张
2 下面根据用法逐步的讲解mdl数据结构的含义:
一般用法,先是 IoAllocateMdl
原型为:

MDL第2张
最常用的是VirtualAddress和Length。把自己的NonPageable buffer的起始地址传给IoAllocateMdl ,长度也传给他。
可是这个函数具体做了啥呢(下面只是些基本的影响理解的部分,具体更多的东西,更细节的东西,自己去看WRK的代码)?

  • 根据length和VirtualAddress算出这块buffer总共跨越了几个virtual page。
  • 分配MDL的内存----包括上面介绍的struct _MDL(属于head部分),ULONG型body部分。

    MDL第3张
    其中PFN_NUMBER 为ULONG, IOP_FIXED_SIZE_MDL_PFNS代表pte的个数

  • 申请完了后,对mdl进行初始化

    MDL第4张
    从这个图中可以很明显得看书上面数据结构的含义:
    1 size---body + head部分的总大小。
    2 StartVa----代表buffer开头处所在page的开始地址。
    3 ByteOffset----代表buffer开头处相对于StartVa的偏移量。

然后使用MmBuildMdlForNonPagedPool将pte中的页表项都放入mdl中的body部分
这里show一下关键性代码:

MDL第5张


这样mdl结构整体的构建就结束了,开始使用mdl。使用MmMapLockedPagesSpecifyCache将MDL中存储的physical address page映射到虚拟地址中。
代码较多,不看了。但是看看函数原型应该就能明白:

MDL第6张
这样的话,返回值就是我们重新映射的虚拟地址。就可以使用这个虚拟地址进行访问了

以上只是最简单的基本用法,但也是最常用的。

免责声明:文章转载自《MDL》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Apache Ranger 1.1.0源码导入IDEA并运行调试security-admin web模块套接字缓冲区大小及限制下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

倒排表数据结构、通配符查询、拼写纠正详解

目录: Dictionary Data Structure 词典数据结构 Wild-Card Query 通配符查询 Spelling Correction 拼写纠正 搜索引擎里的dictionary data通常存储着这些信息: 索引词(term vocabulary)。 文档频率(document frequency,即这个词在多少个文档里出现)...

第一章 绪论

1.1数据结构的讨论范畴 Pascal语言的创始人 Niklaus Wirth 教授提出过大名鼎鼎的程序设计公式                                                                                     Algorithm + Date_Structures = Programs...

《Delphi 算法与数据结构》学习与感悟[10]: 双向链表

如果在结构中再拿出 4 个字节的地址空间指向上一个节点, 就成了双向链表了. 本例效果图: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type...

redis学习(一)

一.redis简介 Redis是基于内存、可持久化的日志型、key-value高性能存储系统。关键字(Keys)是用来标识数据块。值(Values)是关联于关键字的实际值,可以是任何东西。有时候你会存储字符串,有时候是整数,还有时候你会存储序列化对象(使用JSON、XML等)。在大多数情况下,Redis会把值看做是一个字节序列,而不会关注它们实质上是什么。...

Unity3D中常用的数据结构总结与分析

Unity3D中常用的数据结构总结与分析  c#语言规范 阅读目录 1.几种常见的数据结构 2.几种常见数据结构的使用情景 来到周末,小匹夫终于有精力和时间来更新下博客了。前段时间小匹夫读过一份代码,对其中各种数据结构灵活的使用赞不绝口,同时也大大激发了小匹夫对各种数据结构进行梳理和总结的欲望。正好最近也拜读了若干大神的文章,觉得总结下常用的数...

RedisTemplate访问Redis数据结构(四)——Set

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 SetOperations提供了对无序集合的一系列操作。首先初始化spring工厂获得redisTemplate和opsForSet private RedisTempl...