对于32位处理器来说,32位的线性地址被分成三部分,如下图。其中,最低12位表示偏移量,中间的10位表示页表项,最高10位表示页目录项。由线性地址转换成物理地址经过两部,也就是所谓的二级页表。

32位线性地址寻址过程如下:

\

说明:控制寄存器cr3中存放了页目录的物理地址,通过cr3寄存器可以找到页目录,而线性地址中的Directory部分决定页目录中的目录项,而页目录项中存放了要找的页表的物理基地址,再结合线性地址中的中间10位(Page Table部分),就可以找到页框的物理地址。一个页框大小为4096字节,线性地址中的Offset部分占12位,因此页框的物理地址结合线性地址Offset部分就可以找到页框中的任何一个字节。

问题来了,为什么要用二级页表而不使用一级页表,或者说使用二级页表比一级页表的优势在哪里?

(1)使用多级页表可以使得页表在内存中离散存储。多级页表实际上是增加了索引,有了索引就可以定位到具体的项。举个例子:比如虚拟地址空间大小为4G,每个页大小依然为4K,如果使用一级页表的话,共有2^20个页表项,如果每一个页表项占4B,那么存放所有页表项需要4M,为了能够随机访问,那么就需要连续4M的内存空间来存放所有的页表项。随着虚拟地址空间的增大,存放页表所需要的连续空间也会增大,在操作系统内存紧张或者内存碎片较多时,这无疑会带来额外的开销。但是如果使用多级页表,我们可以使用一页来存放页目录项,页表项存放在内存中的其他位置,不用保证页目录项和页表项连续。

(2)使用多级页表可以节省页表内存。使用一级页表,需要连续的内存空间来存放所有的页表项。多级页表通过只为进程实际使用的那些虚拟地址内存区请求页表来减少内存使用量(出自《深入理解Linux内核》第三版51页)。举个例子:一个进程的虚拟地址空间是4GB,假如进程只使用4MB内存空间。对于一级页表,我们需要4M空间来存放这4GB虚拟地址空间对应的页表,然后可以找到进程真正使用的4M内存空间。也就是说,虽然进程实际上只使用了4MB的内存空间,但是为了访问它们我们需要为所有的虚拟地址空间建立页表。但是如果使用二级页表的话,一个页目录项可以定位4M内存空间,存放一个页目录项占4K,还需要一页用于存放进程使用的4M(4M=1024*4K,也就是用1024个页表项可以映射4M内存空间)内存空间对应的页表,总共需要4K(页表)+4K(页目录)=8K来存放进程使用的这4M内存空间对应页表和页目录项,这比使用一级页表节省了很多内存空间。当然,在这种情况下,使用多级页表确实是可以节省内存的。但是,我们需要注意另一种情况,如果进程的虚拟地址空间是4GB,而进程真正使用的内存也是4GB,如果是使用一级页表,则只需要4MB连续的内存空间存放页表,我们就可以寻址这4GB内存空间。而如果使用的是二级页表的话,我们需要4MB内存存放页表,还需要4KB内存来存放页目录项,此时多级页表反倒是多占用了内存空间。注意在大多数情况都是进程的4GB虚拟地址空间都是没有使用的,实际使用的都是小于4GB的,所以我们说多级页表可以节省页表内存。

那么使用多级页表比使用一级页表有没有什么劣势呢?

当然是有的。比如:使用一级页表时,读取内存中一页内容需要2次访问内存,第一次是访问页表项,第二次是访问要读取的一页数据。但如果是使用二级页表的话,就需要3次访问内存了,第一次访问页目录项,第二次访问页表项,第三次访问要读取的一页数据。访存次数的增加也就意味着访问数据所花费的总时间增加。

总结:

多级页表优势:

1.可以离散存储页表。

2.在某种意义上节省页表内存空间。

多级页表劣势:

增加寻址次数,从而延长访存时间。

为什么使用多级页表?相关推荐

  1. 多级页表如何节省内存

    在谈到多级页表的优势的时候,很多地方都是这么说的:32位地址空间的分页系统,如果页面大小为4KB,则每个进程可达1M个页,假设每个页表项占用4个字节,这样每个进程仅仅页表项就占用了4MB连续的内存空间 ...

  2. 2020-11-25(《深入理解计算机系统》多级页表详解)

    一.端到端地址翻译示例 从图上看,TLBI占了t位,而TLBT占了n-p-t位. 上节我们刚把TLB开了个头,多说无益,还是具体来玩个实际例子吧,具体来做一个端到端(虚拟地址到物理地址)的地址翻译示例 ...

  3. 2020-11-26((《深入理解计算机系统》多级页表详解)补充)

    今日总结: 今天主要把11-25(<深入理解操作系统>多级页表详解)第一部分看懂,并把它做了一个补充,让看博客的各位更能深刻理解,谢谢各位支持,一起加油 明日目标: 复习大学物理,线性代数 ...

  4. 2020-11-25(多级页表的补充)

    问题来了,为什么要用二级页表而不使用一级页表,或者说使用二级页表比一级页表的优势在哪里? (1)使用多级页表可以使得页表在内存中离散存储.多级页表实际上是增加了索引,有了索引就可以定位到具体的项.举个 ...

  5. 虚拟内存,页表,快表,多级页表,倒排页表

    虚拟内存 尽管基址寄存器和界限寄存器可以用于创建地址空间的抽象,还有另一个问题需要解决:管理软件的膨胀(bloatware).虽然存储器容量增长快速,但是软件大小的增长更快.需要运行的程序往往大到内存 ...

  6. 计算机组成原理:简单页表和多级页表(虚拟内存的映射)

    我们的指令和数据,都必须先加载到内存,才会被CPU拿去执行.但是程序并不能直接访问到物理内存.从这里可以知道,程序是怎么装载到内存中执行的. 我们的内存需要被分成固定大小的页(Page),然后才通过虚 ...

  7. 【操作系统/计组】页面大小 与 页表项 ( 二级页表 、多级页表 )

    [操作系统/计组]页面大小 与 页表项 结论1(一级页表) 结论2(二级.多级页表) 例题 首先,不论一级页表还是多级页表: 页面大小 = 2^(页内地址位数) 页号有多少,页就有多少个 用于存放页的 ...

  8. 18.多级页表与快表

    [README] 1.本文内容总结自 B站 <操作系统-哈工大李治军老师>,内容非常棒,墙裂推荐: 2.操作系统内存管理:分页机制+多级页表+快表来实现: [0]分页的问题 1)分页的问题 ...

  9. 页式管理 多级页表

    作业分成若干个相等的"页",内存分成相等的"块",使"页"的大小等于"块". 以"页"为单位,将作业 ...

最新文章

  1. jsp中九大内置对象
  2. 解决Layui的switch样式显示问题
  3. MySQL: load data infile 需要注意的点
  4. RequireJS 主入口加载模块经常会加载失败的问题
  5. Unable to find the ncurses libraries的解决办法
  6. c语言不定方程的二元一次,poj1061 - 同余方程,二元一次不定方程
  7. NAT应用于HSRP环境
  8. linux运行tdbshutdown,Converting Oracle Database from Linux to Windows using RMAN
  9. 【原创】PDA 实现DataGrid可编辑
  10. C#中创建线程的四种方式
  11. Maven运行时异常java.lang.UnsupportedClassVersionError的解决方案
  12. C语言实现成语接龙完整版
  13. 基于C++的Qt网络编程——聊天客户端
  14. canvas绘制太阳系
  15. 苹果审核规则研究,实时更新
  16. WPF工控组态软件之温度计
  17. uni-app 使用 jsencrypt
  18. java正则表示式方法解析与示例
  19. 计算机应用试卷分析讲评课教案,教师讲评论文10篇_发表之家
  20. 【区块链 | 智能合约】Ethereum源代码(8)- Ethereum服务和以太坊P2P协议发送广播源码分析

热门文章

  1. web3再牛 也没能逃出这几个老巨头的手掌心
  2. beast附加包安装:SNAPP安装出现问题的解决办法
  3. matlab振动信号数据,Matlab在场地微振动信号数据处理中的应用
  4. Django REST framework+Vue 打造生鲜超市(十)
  5. 《老猿Python精品文章》专栏文章目录
  6. 少儿编程重要吗?数字时代的中小学生是否需要拥有编程这项技能?
  7. 广西规范市场主体信息归集公示运用 推进社会信用体系建设
  8. 问题: Schrodinger方程的非齐次Strichartz估计
  9. web 前后台数据交互的方式
  10. CAS机制详解以及ABA问题的危害和解决方案