• 1797阅读
  • 1回复

分页机制之虚拟内存地址到物理内存地址的转换 [复制链接]

上一主题 下一主题
离线天道酬勤
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-10
— 本帖被 天道酬勤 从 驱动保护 移动到本区(2016-05-19) —
<楔子>.写在开头的话
今天学习了 分页机制中的 虚拟内存地址到物理内存地址的转换,做些笔记。



首先也是非常需要注意的是这个 PAE ( 物理 地址 扩展),这个东西是默认开启的,由于 不开启 PAE 时候的计算要相对简单一些,所以从简单开始的时候需要关闭这个玩意




[cpp] view plain copy
print?

  1. // 摘自百度知道  


[cpp] view plain copy
print?

  1. CMD 命令:  
  2. 开启: bcdedit /set pae forceenable  
  3. 关闭:bcdedit /set pae forcedisable  
  4. CMD : bcdedit 可以看见修改后的状态  


题外话: 可以通过检查 cr4 的 bit :5 来检测 PAE 是否开启
< 零 >.从一张图说起
这一张图 截取自 Intel 手册的 第三卷


[plain] view plain copy
print?

  1. To select the various table entries, the linear address is divided into three sections:  
  2. • Page-directory entry—Bits 22 through 31 provide an offset to an entry in the page  
  3. directory. The selected entry provides the base physical address of a page table.  
  4. • Page-table entry—Bits 12 through 21 of the linear address provide an offset to an entry in  
  5. the selected page table. This entry provides the base physical address of a page in physical  
  6. memory.  
  7. • Page offset—Bits 0 through 11 provides an offset to a physical address in the page.  
  8. Memory management software has the option of using one page directory for all programs and  
  9. tasks, one page directory for each task, or some combination of the two.  



因为我觉得个人的解释可能还没有 手册上解释的清楚,这里首先搬出手册上面的解释。


<一> .自我感觉良好的过程
在未开启 PAE 的情况下, 虚拟地址可以分为 3个部分


页目录索引          页表索引               页内偏移

  10位                        10位                      12位


1.  使用 页目录表索引 到 页目录表中 寻找 相应的 页目录
2.  使用 页表索引 到 页目录 中 寻找相应的 页表
3. 在找到相应的页表地址后,加上页内偏移即可


使用 windbg 演示过程如下
[*]  由于实质上 为 启动 PAE 的缩水版本,所以这里省略了。


<二>.向更深的深渊前进


这一张图 截取自 Intel 手册的 第三卷


[plain] view plain copy
print?

  1. To select the various table entries, the linear address is divided into three sections:  
  2. • Page-directory-pointer-table entry—Bits 30 and 31 provide an offset to one of the 4 entries  
  3. in the page-directory-pointer table. The selected entry provides the base physical address  
  4. of a page directory.  
  5. • Page-directory entry—Bits 21 through 29 provide an offset to an entry in the selected page  
  6. directory. The selected entry provides the base physical address of a page table.  
  7. • Page-table entry—Bits 12 through 20 provide an offset to an entry in the selected page  
  8. table. This entry provides the base physical address of a page in physical memory.  
  9. • Page offset—Bits 0 through 11 provide an offset to a physical address in the page.  


同样是来自手册上的图片和解释。
<三>.深渊内的修罗场
可以从图中看到 PAE 被开启的时候 整个虚拟地址被分为了 四个部分


2位 (31 ~ 30)           9位 (29~21)        9位 (20~12)            12位(11~0)
页目录指针的索引       页目录索引       页表索引               页内偏移



多出来的这个部分被称为 页目录指针的索引
也就是比上面所说的 多出了一个步骤来
即 使用 页目录指针的索引页目录指针表 里面寻找相应的 页目录指针(即页目录表)
剩下的部分并没有太大的区别。


需要说明的是。


[plain] view plain copy
print?

  1. // 引用来自 《软件调试》  
  2. 启用 PAE 后,每个 PDE (页目录) 和 PTE(页表)的长度都增大为 64 位,但包含的标志变化不大。  



过程演示:


首先 找到进程的页目录指针表 的地址 和 进程的基本信息



切换当前进程上下文信息



假设待转换的虚拟地址为  003ede20 ,先将其拆解




获取页目录表指针


获取页目录


获取页表地址


得到物理地址


003ede20 的物理地址即为 0050ae20
测试之




题外话,关于 windbg 指令的使用 问题 和 为什么 页目录指针表 、页目录 和 页表项 的 元素 的 低12位 为0的问题 可以参考 《软件调试》一书
离线v2680267313

只看该作者 沙发  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个