Windows页目录自映射方案
来源:互联网 发布:博思通软件价格多少 编辑:程序博客网 时间:2024/05/01 07:18
Windows中页表寻址之奥妙
Windows页目录自映射方案
潘爱民,2010年10月1日
在Windows的虚拟内存管理方案中,有一个设计值得特别一提,那就是Windows页目录自映射机制。Dave Probert很早在一份讲义中提到了这一机制(称为self-mapping page tables),并且给出了清楚的解释(http://i-web.i.u-tokyo.ac.jp/edu/training/ss/msprojects/data/07-ProcessesThreadsVM.pdf,2004年7月)。
首先,看下面的一个宏:
#define MiGetVirtualAddressMappedByPte(PTE) ((PVOID)((ULONG)(PTE) << 10))
此宏的含义是,给定一个PTE的虚拟地址,返回该PTE所指页面的虚拟地址。
举例而言,假设PTE的地址(虚拟地址)为0xc0390c84,即1100,0000,00|11,1001,0000,|1100,1000,0100,这里“|”符号将它分为页目录索引、页表索引、页内偏移三部分。在Windows中,页目录(CR3寄存器)的地址是0xc0300000,所以,处理器在访问该PTE的时候,首先从页目录页面中,找到1100,0000,00项,即第0x300项。这一项由系统特别设置好,它指向页目录自身(后面进一步解释为什么这么设置)。接下来查找0xc0390c84的页表索引,即11,1001,0000,处理器继续在页目录页面中查找,找到11,1001,0000,即第0x390项,这一项指向一个页表页面。最后,处理器再根据页内偏移1100,1000,0100,即0xc84,定位到第0x321项。此PTE的寻址过程如下图所示。
按照MiGetVirtualAddressMappedByPte,将0xc0390c84,左移10位,变成0xe4321000,即1110,0100,00|11,0010,0001,|0000,0000,0000,这样得到页目录索引1110,0100,00,即0x390;页表索引为11,0010,0001,即0x321;页内偏移为0。可以看到,这里复用了PTE寻址过程中的两次查表步骤。此PTE所指页面的寻址过程如下图所示。
MiGetVirtualAddressMappedByPte宏之所以能够工作的关键之处在于,页目录页面(虚拟地址为0xc0300000)的0x300项指向其自身。即下图的结构。
由此可以明白,页目录地址0xc0300000和这里的0x300项绝不是偶然的,而是精心选择的(但并非唯一)。
我在阅读Windows内核中一段分配系统PTE的代码时,看到了MiGetVirtualAddressMappedByPte宏,百思不得其解。经过两个晚上的苦思冥想,才领悟到上述寻址结构的奥妙所在。后来整理成“Windows内核原理与实现”一书中关于Windows页目录自映射方案的描述(见第202-204页)。再后来,偶然的机会看到Dave Probert的讲义中早有提及,印证了自己的想法。
- Windows页目录自映射方案
- Windows页目录自映射方案
- Windows页目录自映射方案
- 浅谈windows页目录自映射
- windows下目录映射到盘符
- 将CentOS目录映射为Windows驱动器
- Windows下如何将服务器目录映射到本地驱动器
- 在Linux系统中映射windows的目录
- 配置 Samba 并将 Linux 目录映射为 Windows 驱动器
- WINDOWS下的目录映射工具(微软官方工具)
- 通过nginx实现windows系统下本地目录的映射
- Windows下的分页模式- 页目录和页表从物理内存到虚拟映射求值
- docker 数据映射方案
- 温故:自映射机制
- SOM自组织映射
- 自组织映射网络
- [转自MOS文章]Windows 网络映射驱动器存放Oracle file的问题
- docker挂载本地目录并映射端口,生产环境中的docker部署方案(多端口多容器)
- objective-c 获取当前毫秒数
- Delphi DataModule使用方法
- 判断窗口打开
- 转:2010年最佳国外免费在线存储服务
- 求数组中第二大的元素
- Windows页目录自映射方案
- 16进制字符转10进制数字
- 基于ambarella安霸H.264编解码芯片的视频采集压缩系统
- CentOS 和用户管理有关的常用命
- 超再生无线发接模块程序
- hdu 3333 Turing Tree
- 排序算法之一——插入排序
- 关于manifest,这个文章最detail
- silverlight 判断窗口打开