windows下由于启用了页机制,所有软件层面的地址操作都是VA,通过descriptor(base address(32bit))+offset得到的线性地址并不直接对应物理地址,而是经过页转换机构再做一次转换得到物理地址,这样的转换是硬件提供的能力,转换过程被说的比较多了,大体是通过cr3寄存器得到page direcotry的物理地址,Vitrual Address的高10位就是一个(pde)page direcotry entry的index,或许可以像这样表示cr3[VA>>22],一个pde又指向了一个page table,VA接下来的10bit就是page table中的一个索引,即一条pte(page talbe entry),pte中存放了page的地址,低12位就是在前述转换过程中得到的page中的offset。

需要特别说明的是,pde and pte中存放的是物理帧号(physical frame number)位于pde or pte的高20bit,也就是说可以表示1M个物理帧,每个物理帧大小是4kb,这样就可以表示4GB的内存。

说了半天还没到自映射机制,前面说的都是硬件提供的能力,只要是拿到一个VA硬件层面都进行相同的转换步骤,windows要做内存管理,就需要维护page directory和 page tables,如何通过一个VA得到它所在的页的VA以及所在的页表的VA呢?

微软提供了下面几个宏处理给定的VA

#define MiGetPdeAddress(VA)  ((PMMPTE)(((((ULONG)(VA)) >> 22) << 2) + PDE_BASE))//此处PDE_BASE为0xc0300000(这也是一个VA,经页转换后得到的是PD的起始地址,下面就是所谓的自映射了,页转换机构利用VA的高十位(0x300)索引到一个PDE,这个PDE的特别之处是并没有指向一个page table而是指向了page directory的起始地址,一个PD占据一页,一个PT也占据一页),继续把page directory作为一个page table,再用VA的中间10位(还是0x300)又索引到了page directory的起始位置,低12位是0,即offset为0,最终得到的就是Page Directory的起始地址。那么VA先右移22,再左移2(相当于乘以4)加上PDE_BASE经过得到一个VA,经过两次自映射,加上offset后,得到的物理地址就是PDE的物理地址。

#define MiGetPteAddress(va) ((PMMPTE)(((((ULONG)(va)) >> 12) << 2) + PTE_BASE))
这里的PTE_BASE是一个常量,为0xC0000000,也就是说page directory entry的索引(0x300)仍然索引到page directory的起始位置,和上面的宏一样,又是一次自映射。

#define MiGetVirtualAddressMappedByPte(PTE) ((PVOID)((ULONG)(PTE) << 10))//如果是给了一个VA,想要得到所在page的起始地址,只需将VA的低12位清零就可以得到VA所在页的VA,但这里给的是PTE(相当于(*PDE)),因为pte的高十位总是指向PD的起始位置,左移10位之后就相当于取消了这次自映射,当然这里的转换只对利用自映射的va有效。

再说一下,exe载入内存的时候,如何建立描述符,首先根据image的大小分配若干页的内存,这里假设image 在内存中占80kb,基址是0x00400000h,系统共分配20页的内存,起始页的VA假设是1110010000|1101110000|000000000000b(pde index(0x390):pte index(0x370):offset(0x0)),则descriptor.base+00400000h=E4370000h->descriptor.base=E3F70000h,那么code段描述符中的基址就可以根据其相对于00400000h的偏移加上E4370000h得到,比如code段的va是00401000h,那么他的描述符中的基址为E3F71000h,正好是从内存中image的第2页开始。更进一步,将新建code段描述符在GDT中的index(选择子)载入到cs,程序就可以运行了。

总起来说,硬件的转换机制并没有改变,只是windows利用硬件提供的这种能力使自己能方便的维护PD和PT

经过后来的相关资料的学习,PDE_BASE这个值是一个线性地址,微软通过一个宏来指定他的值,而CR3总的值一定是物理地址,并且在切换进程的时候这个值是会改变的

另外描述符实际上是对PE中的VA进行了一层包装

VA:vitual address

PTE:page table entry

PDE:page directory entry

PD:page directory

PT:page table

windows的页自映射机制的更多相关文章

  1. x86平台上的Windows页表映射机制

    首先,在x86架构的处理器上,一个正常页面大小为4KB,非PAE模式下,CR3持有页目录页面的物理地址,PDE和PTE格式相同大小为4字节.此时每个页表页面包含1024个PTE,可以映射1024个页面 ...

  2. 深入解析Windows操作系统笔记——CH3系统机制

    3.系统机制 微软提供了一些基本组件让内核模式的组件使用: 1.陷阱分发,包括终端,延迟的过程调用(DPC),异步过程调用(APC),异常分发以及系统服务分发 2.执行体对象管理器 3.同步,包括自旋 ...

  3. linux 逆向映射机制浅析

    2017-05-20 聚会回来一如既往的看了会羽毛球比赛,然后想到前几天和朋友讨论的逆向映射的问题,还是简要总结下,免得以后再忘记了!可是当我添加时间……这就有点尴尬了……520还在写技术博客…… 闲 ...

  4. 操作系统学习笔记(二) 页式映射及windbg验证方式

    页式映射 本系列截图来自网络搜索及以下基本书籍: <Windows内核设计思想> <Windows内核情景分析> <WINDOWS内核原理与实现> 一个32位虚拟地 ...

  5. Windows内核开发-6-内核机制 Kernel Mechanisms

    Windows内核开发-6-内核机制 Kernel Mechanisms 一部分Windows的内核机制对于驱动开发很有帮助,还有一部分对于内核理解和调试也很有帮助. Interrupt Reques ...

  6. MFC编程入门之五(MFC消息映射机制概述)

    在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什 ...

  7. VS2010/MFC编程入门之五(MFC消息映射机制概述)

    VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...

  8. MFC消息映射机制

    1.MFC应用框架主要类之间的关系 MFC自动生成的框架中重要的类有:C-App.CMainFrame.C-Doc和C-View. 其他的类如CClassView.CFileView等都是在框架窗口( ...

  9. MFC的消息映射机制揭秘

    MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快.为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息映射的机制就是其中之一 ...

随机推荐

  1. Activity(活动)-再讲

    通过多天的学习,大家也了解了adb.exe 是用来进行 客户端(pc)-服务器端(android) 数据交互的. 用户可以使用工具Eclipse 中DDMS 隐示使用  adb.exe 进行连接,也可 ...

  2. 关于 IOS 发布的点点滴滴记录(一)

    今天又是发布 APP 审核的时候,哎,说来也悲催. 我们产品连这次好像是第四次被苹果公司拒绝了,想想都有点伤感.其实对于里面的内容我到是不是很关心.我关心的是在这过程中我所碰到的奇怪的事情.  (这次 ...

  3. Notification通知栏

    Notification通知栏 首先实现的功能就是通知栏显示Notification,Notification是显示在系统的通知栏上面的,所以Notification 是属于进程之前的通讯.进程之间的 ...

  4. hdu 2077

    PS:汉诺塔问题....找规律...观察发现,先是小的移动到B,然后大的移动到C(两步),然后小的移动到C,完成.刚开始就以为是f(n)=2f(n-1)+2..然而,小的移动一步是需要f(n)=3f( ...

  5. 关于oracle存储过程的一些知识点

    一.创建一个存储过程,批量清空数据库中所有表的数据. --清空数据库中所有表的数据 create or replace procedure truncateAllTables as v_sql ); ...

  6. UNION语句查询(转载)

    联合查询   在对数据信息进行操作时,有时需要将不同数据表中的数据信息组合在一起,这时需要使用联合查询.联合查询指的是将多表中的行数据组合在一个数据集中进行显示.本节将讲解有关联合查询方面的相关知识. ...

  7. GIT之一 起步篇

    关于版本控制 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.如果你是位图形或网页设计师,可能会需要保存某一幅图片或页面布局文件的所有修订版本.采用版本控制系统(VCS) ...

  8. HDU 5823 (状压dp)

    Problem color II 题目大意 定义一个无向图的价值为给每个节点染色使得每条边连接的两个节点颜色不同的最少颜色数. 对于给定的一张由n个点组成的无向图,求该图的2^n-1张非空子图的价值. ...

  9. [转Go-简洁的并发 ]

    http://www.yankay.com/go-clear-concurreny/ Posted on 2012-11-28by yankay 多核处理器越来越普及.有没有一种简单的办法,能够让我们 ...

  10. 在Runbook中添加Checkpoint-workflow

    本文说明的是使用Checkpoint-workflow的一种场景(当然还有其他场景需要Checkpoint-workflow). 起因:Windows Azure对Automation账户中的Runb ...