文章目录

  • 非PAE 非物理地址扩展
    • 线性地址 有效地址 物理地址
    • CR3
    • PDE/PTE
    • 物理页的属性
  • 通过线性地址访问PDT和PTT
    • 指向PDT的线性地址 0xC0300000
      • 总结
    • 指向PTT的线性地址 0xC0000000/C0001000
      • 总结
    • 访问PDT与PTT公式总结

非PAE 非物理地址扩展

线性地址 有效地址 物理地址

如下指令:

mov eax,dword ptr ds:[0x12345678]

这个地址如果想访问成功,首先取决于段机制,看当前的环境能否通过段权限检查以及是否超过limit限制等等。其次,取决于页机制。

  • 其中,0x12345678是有效地址
  • ds.base+0x12345678是线性地址
  • 线性地址也不是真正的地址,还有一个地址被称为物理地址

CPU会通过这个线性地址作为一个目录,去索引物理地址。问题在于A进程有一个地址0x12345678,B进程也有一个地址0x12345678。那么CPU通过什么去分别找到这两个相同内存地址的不同的物理地址呢?答案是页目录基址。

CR3

每个进程都有一个CR3寄存器,保存页目录基址。这个基址是物理地址。CR3指向一个物理页,一共4096字节,如图:

PDE/PTE

  • CR3寄存器保存的物理地址指向页目录表PDT,里面的每一个成员叫PDE。页目录表大小为4KB,每个成员为4个字节。
  • 每一个PDE又指向页表PTT,里面的每一个成员叫PTE。页表大小为4KB,每个成员为4个字节。
  • 每一个PTE都指向物理页,每个物理页大小为4096个字节
  • PDE与PTE都是4个字节(32位),前20位是物理地址,后12位是属性
  • PTE可以没有物理页,也可以指向物理页,但只能对应一个物理页
  • 多个PTE可以指向同一个物理页
  • 每一个线性地址都会经过一个PDE和PTE最终指向一个物理页,这个物理页能不能读写取决于经过的PDT和PTE的后12位

物理页的属性

  • 物理页的属性由PDE和PTE共同决定
  • P:是否有效
  • R/W:是否可读可写,0代表只读,1代表可读可写
  • U/S:U/S=0 物理页只允许特权用户访问;U/S=1 物理页普通用户也能访问。高2G以上的内存只有内核才能访问的原因是U/S位设置的问题,如果将内核的某个页设置为1,就可以在R3进行访问了
  • A:是否被访问过,访问过设置为1。即使只访问一个字节也会导致PDE和PTE置1
  • D:是否被写过;0没有被写过,1被写过
  • PS:只对PDE有意义,PS==PageSize的意思。当PS==1的时候PDE直接指向物理页,无PTE,低22位是页内偏移。此时,线性地址只能拆成两段:大小为4MB,俗称大页
  • 9-11位:当P位为0时,CPU会产生缺页异常,此时这两位标识了该线性地址是否有效,也标识了该线性地址对应的物理内存所在

通过线性地址访问PDT和PTT

指向PDT的线性地址 0xC0300000

现在问题来了,如果我们想访问0这个地址,那么就必须找到PDT和PTT,而CR3里面保存的PDT是物理地址,提供给CPU使用的,代码只能访问线性地址。

如何解决这个问题呢?有一个线性地址,指向的是PDT,这个地址就是0xC0300000,下面对这个地址进行拆分

0xC0300000
#二进制为:
1100 0000 0011 0000 0000 0000 0000 0000
#拆成10:10:12
1100 0000 00------>0x300*4=C00
11 0000 0000------>0x300*4=C00
0000 0000 0000

将这个线性地址拆分之后,找到的对应的物理页就是CR3保存的页目录PDT基址所在的物理页。那就意味着我们可以直接通过这个线性地址去修改PDT。

**结论:**C0300000存储的值就是PDT,如果我们要访问第N个PDE,那么有如下公式:

0xC0300000+N*4

总结

  1. 通过0xC0300000找到的物理页就是页目录表
  2. 这个物理页既是页目录表本身也是页表
  3. 页目录表是一张特殊的页表,每一项PTE指向的不是普通的物理页,而是指向其他的页表

指向PTT的线性地址 0xC0000000/C0001000

也就是说通过0xC0300000这个线性地址可以任意修改页目录表,但如果我们要设置某个线性地址PDE和PTE那么还要能够访问PTT,如何访问呢?

答案是通过这两个线性地址:0xC0000000/C0001000。

通过拆分可以知道,访问0xC0000000这个地址就等于是访问第一个PTT表;访问C0001000这个地址就等于是访问第二个PTT表。两个地址之间相差0x1000。如果想访问第三个PTT表的话以此类推。

总结

  1. 页表被映射到了从0xC0000000到0xC03FFFFF的4M空间
  2. 在这1024个表中有一张特殊的表:页目录表
  3. 页目录表被映射到了0xC0300000开始处的4K地址空间

访问PDT与PTT公式总结

PDI:页目录表索引

PTI:页表索引

访问页目录表的公式:0xC0300000+PDI*4

访问页表的公式:0xC0000000+PDI*4096+PTI*4
与PTT公式总结

PDI:页目录表索引

PTI:页表索引

访问页目录表的公式:0xC0300000+PDI*4

访问页表的公式:0xC0000000+PDI*4096+PTI*4

[保护模式]非PAE模式相关推荐

  1. python 正则表达式 re (.*?)和(.*)的区别(贪婪模式非贪婪模式)惰性匹配

    贪婪模式 .* 非贪婪模式 .*? 1. .匹配任意除换行符"\n"外的字符: 2. *表示匹配前一个字符0次或无限次: 3. +或*后跟?表示非贪婪匹配,即尽可能少的匹配,如*? ...

  2. netty-阻塞模式,非阻塞模式

    以下方法为阻塞模式(单线程) 只能干一件事. import lombok.extern.slf4j.Slf4j;import java.io.IOException; import java.net. ...

  3. Java技能树-RE-元字符-贪婪模式/非贪婪模式

    1 需求 2 语法 Greedy quantifiers X? X, once or not at all X* X, zero or more times X+ X, one or more tim ...

  4. [保护模式]PAE模式

    文章目录 PAE模式 2-9-9-12分页 非PAE模式为什么是10-10-12 PAE模式为什么是2-9-9-12 总结 PDPTE结构 PTE结构 PTE结构 XD标志位(AMD中称为NX,即No ...

  5. oracle非归档模式下如何备份,Oracle之RMAN数据库在非归档模式下的备份和恢复

    1.数据库在非归档模式下的备份 SQLgt; archive log list;数据库日志模式 非存档模式自动存档 禁用存档终点 USE_DB_RECOVERY_FIL 1.数据库在非归档模式下的备份 ...

  6. 非归档模式下重做日志覆盖后的rman恢复

    非归档模式下重做日志覆盖后的rman恢复 实验原理:在非归档模式下,数据库的重做日志不会写入归档日志中,对数据库的恢复只能依靠3个联机重做日志.当第一个重做日志满了,就切换第二个重做日志中,以此类推, ...

  7. mysql 自动归档,如何将数据库从非归档模式转为自动归档模式:

    这个问题小哥哥问过我,我一下卡住了,答不上来,他骂我,学了那么久,这么简单的东西你都不会?我低头默默无语!我确实没有反抗的权利,只能在被骂完之后赶紧学去!这个就是我的命,我的学习永远跟不上他们的步骤, ...

  8. 数据挖掘之关联分析七(非频繁模式)

    非频繁模式 非频繁模式,是一个项集或规则,其支持度小于阈值minsup. 绝大部分的频繁模式不是令人感兴趣的,但其中有些分析是有用的,特别是涉及到数据中的负相关时,如一起购买DVD的顾客多半不会购买V ...

  9. oracle 存档终点修改,Oracle 归档模式与非归档模式的切换

    Oracle 归档模式与非归档模式的切换 1.查看oracle是否处于归档模式 arichive log list; 数据库日志模式            非存档模式 自动存档            ...

最新文章

  1. java 稀疏数组和二维数组转换,并保存稀疏数组到文件后可以读取
  2. 区块链80%项目靠同一个故事拿钱,但标准链说最坏的时机就是好的开始
  3. java action 上传文件_JavaWeb框架_Struts2_(七)-----文件的上传和下载
  4. Mysql:This version of MySQL doesn’t yet support ‘LIMIT IN/ALL/ANY/SOME 错误解决
  5. [渝粤教育] 西南科技大学 理论力学 在线考试复习资料
  6. Java快速入门学习笔记8 | Java语言中的数组
  7. linux ps指令查看进程,linux下查看进程指令-ps
  8. 核心Element对象
  9. 对C#中事件的简单理解
  10. JSP电子病历管理系统
  11. 2020 CUMCM全国大学生数学建模竞赛 B题 Notes
  12. LocalDate获取时间戳
  13. C Primer Plus(6) 中文版 第6章 C控制语句:循环 6.2 while语句
  14. IT的道德和伦理-个人隐私
  15. 2022年保健品行业研究报告
  16. 【转】在数学的海洋中飘荡
  17. 通过主成分分析实现三维模型对齐【Principal Component Analysis】
  18. 工具说明书 - Beoplay E8耳机操作及电池更换
  19. 递推DP(至少和至多之间的转换
  20. 移动通信各制式、调制的速率及频谱利用率(2G-4G)

热门文章

  1. Py之matplotlib:python包之matplotlib库图表绘制包的简介、安装、使用方法(matplotlib颜色大全)详细攻略
  2. Python实现 灰色关联分析 与结果可视化
  3. MVC案例——模糊查询
  4. 一、Windows Server 2016 AD服务器搭建
  5. 数据库基础之一--DDL(数据库定义语言),DCL(数据库控制语言)
  6. Html5元素及基本语法
  7. Java解析HTML
  8. 围观窗体与组件03 - 零基础入门学习Delphi25
  9. (学)新版动态表单研发,阶段成果----1
  10. nRF5_SDK_12.3.0 编译micro-ecc摘要