虚拟内存的地址翻译

地址翻译


形式上来说,地址翻译是一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)中元素之间的映射,
MAP:VAS->PAS U ∅
这里


下图展示了MMU如何利用页表来实现这种映射
CPU中的一个控制寄存器,页表基址寄存器(PTBR)指向当前页表。n位的虚拟地址包含两个部分:一个p位的虚拟页面偏移(VPO)和一个(n-p)位的虚拟页号(VPN),MMU利用VPN来选择适当的PTE。例如,VPN0选择PTE0,VPN1选择PTE1,以此类推。
将页表条目中物理页号(PPN)和虚拟地址中的VPO串联起来,就得到相应的物理地址。
注意,因为物理和虚拟页面都是P字节的,所以物理页面偏移(PPO)和VPO是相同的。

下图展示了当页面命中时,CPU硬件执行的步骤。
第1步:处理器生成一个虚拟地址,并把它传送给MMU
第2步:MMU生成PTE地址,并从高速缓存/主存请求得到它
第3步:高速缓存/主存向MMU返回PTE
第4步:MMU构造物理地址,并把它传送给高速缓存/主存
第5步:高速缓存/主存返回所请求的数据字给处理器

页面命中完全是由硬件来处理的,与众不同的是,处理缺页要求硬件和操作系统内核协作完成,如上图b所示。
第1步到第3步:和上图a中的第1步到第3步相同
第4步:PTE的有效位是0,所以MMU触发了一次异常,传递CPU中的控制到操作系统内核中的缺页异常处理程序
第5步:缺页处理程序确定出物理内存中的牺牲页,如果这个页面已经被修改了,则把它换出到磁盘
第6步:缺页处理程序页面调入新的页面,并更新内存中的PTE
第7步:缺页处理程序返回到原来的进程,再次执行导致缺页的指令。CPU将引起缺页的虚拟地址重新发送给MMU。因为虚拟页面现在缓存在物理内存中,所以就会命中,在MMU执行了图a中的步骤之后,主存就会将请求字返回给处理器

结合高速缓存和虚拟内存

在任何既使用虚拟内存又使用SRAM高速缓存的系统中,都有应该使用虚拟地址还是使用物理地址来访问SRAM高速缓存的问题。大多数系统是选择物理寻址的。使用物理寻址,多个进程同时在高速缓存中有存储块和共享来自相同虚拟页面的块成为很简单的事情。而且,高速缓存无需处理保护问题,因为访问权限的检查是地址翻译过程的一部分。
下图展示了一个物理寻址的高速缓存如何和虚拟内存结合起来
主要的思路是地址翻译发生在高速缓存查找之前。注意,页表条目可以缓存,就像其他的数据字一样。

利用TLB加速地址翻译

我们看到,每次CPU产生一个虚拟地址,MMU就必须查阅一个PTE,以便将虚拟地址翻译为物理地址。在最糟糕的情况下,这会要求从内存多取一次数据,代价是几十到几百个周期。如果PTE碰巧缓存在L1中,那么开销就下降到1个或2个周期。然而,许多系统都试图消除即使是这样的开销,它们在MMU中包括了一个关于PTE的小的缓存,称为翻译后备缓冲器(TLB)
TLB是一个小的、虚拟寻址的缓存,其中每一行都保存着有由单个PTE组成的块。TLB通常有高度的相联度。如下图所示,用于组选择和行匹配的索引和标记字段是从虚拟地址中的虚拟页号中提取出来的。如果TLB有T=2^t个组,那么TLB索引(TLBI)是由VPN的t个最低位组成的,而TLB标记(TLBT)是由VPN中剩余的为组成的。

下图a展示了当TLB命中时(通常情况)所包括的步骤。这里的关键点是,所有的地址翻译步骤都是在芯片上的MMU中执行的,因此非常快。
第1步:CPU产生一个虚拟地址
第2步和第3步:MMU从TLB中取出相应的PTE
第4步:MMU将这个虚拟地址翻译成一个物理地址,并且把它发送到高速缓存/主存
第5步:高速缓存/主存将所请求的数据字返回给CPU
当TLB不命中时,MMU必须从L1缓存中取出相应的PTE,如下图b所示。新取出的PTE存放在TLB中,可能会覆盖一个已经存在的条目。

多级页表

如果我们有一个32位的地址空间、4KB的页面和一个4字节的PTE,那么即使应用所引用的只是虚拟地址空间很小的一部分,也总是需要一个4KB的页表驻留在内存中。对于地址空间为64位的系统来说,问题将变得更复杂。
用来压缩页表的常用方法是使用层次结构的页表。用一个具体的示例是最容易理解这个思想的。假设32位虚拟地址空间被分为4KB的页,而每个页表条目都是4字节。还假设在这一时刻,虚拟地址空间有如下形式:内存的前2K个页面分配给了代码和数据,接下来的6K个页面还未分配,再接下来的1023个页面也未分配,接下来的1个页面分配给了用户栈。
如下图所示,展示了我们如何为这个虚拟地址空间构造一个两级的页表层次结构。

一级页表中的每个PTE负责映射虚拟地址空间中一个4MB的片,这里的每一片都是由1024个连续的页面组成的。比如,PTE0映射第一片,PTE1映射接下来的一片,以此类推。假设地址空间是4GB,1024个PTE已经足够覆盖整个空间了。
如果片i中的每个页面都未被分配,那么一级PTEi就为空。例如下图,片2~7是未被分配的。然而,如果在片i中至少有一个页是分配了的,那么一级PTEi就指向一个二级页表的基址。例如,在下图中,片0、1、8的所有或者部分已被分配,所以它们的一级PTE就指向二级页表。
二级页表中的每个PTE 都负责映射一个4KB的虚拟内存页面,就像我们查看只有一级的页表一样。注意,使用4字节的PTE,每个一级和二级页表都是4KB字节,这刚好和一个页面的大小是一样的。
这种方法从两个方面减少了内存要求。
第一,如果一级页表中的一个PTE是空的,那么相应的二级页表就根本不会存在。这代表着一种巨大的潜在节约,因为对于一个典型的程序,4GB的虚拟地址空间的大部分都是未分配的。第二,只有一级页表才需要总是在主存中;虚拟内存系统可以在需要时创建、页面调入或调出二级页表,这就减少了主存的压力;只有最经常使用的二级页表才需要缓存在主存中。

下图描述了使用k级页表层次结构的地址翻译。虚拟地址被划分为k个VPN和1个VPO。每个VPNi都是一个到第i级页表的索引,其中1<=i<=k。第j级页表中的每个PTE,1<=j<=k-1,都指向第j+1级的某个页表的基址。第k级页表中的每个PTE包含了某个物理页面的PPN,或者一个磁盘块的地址。为了构造物理地址,在能够确定PPN之前,MMU必须访问k个PTE。和只有一级页表结构一样,PPO和VPO是相同的。
访问k个PTE,第一眼看上去昂贵而不切实际。然而,这里TLB能够起作用,正是通过将不同层次上页表的PTE缓存起来。实际上,带多级页表的地址翻译并不比单级页表慢很多。

端到端的地址翻译

我们通过一个具体的端到端的地址翻译示例,来综合一下之前将的内容,这个示例运行在有一个TLB和L1 d-cache的小系统上。为了保证管理性,我们做出如下假设
内存是按字节寻址的。
内存访问是针对1字节的字的(不是4字节的字)
虚拟地址是14位长的(n=14)
物理地址是12位长的(m=12)
页面大小是64字节(P=64)
TLB是四路组相联的,总共有16个条目
L1 d-cache是物理寻址、直接映射的,行大小为4字节,而总共有16个组。
下图展示了虚拟地址和物理地址的格式。因为每个页面是2^6=64字节,所以虚拟地址和物理地址的低6位分别作为VPO和PPO。虚拟地址的高8位作为VPN。物理地址的高6位作为PPN。

下图展示了小内存系统的一个快照,包括TLB(下图a)、页表的一部分(下图b)和L1高速缓存(下图c)。在TLB和高速缓存的图上面,我们还展示了访问这些设备时硬件是如何划分虚拟地址和物理地址的位的。
1、TLB。TLB是利用VPN的位进行虚拟寻址的。因为TLB有4个组,所以VPN的低2位就作为组索引(TLBI)。VPN中剩下的高6位作为标记(TLBT),用来区别可能映射到同一个TLB组的不同的VPN。
2、页表。这个页表是一个单级设计,一共有2^8=256个页表条目(PTE)。然而,我们只对这些条目中的开头16个感兴趣。为了方便,我们用索引它的VPN来标识每个PTE;但是要记住这些VPN并不是页表的一部分,也不储存在内存中。另外,注意每个无效PTE的PPN都用一个破折号来表示,以加强一个概念:无论刚好这里存储的是什么位值,都是没有任何意义的。
3、高速缓存。直接映射的缓存是通过物理地址中的字段来寻址的。因为每个块都是4字节,所以物理地址的低2位作为块偏移(CO)。因为有16组,所以接下来的4位就用来表示组索引(CI)。剩下的6位作为标记(CT)。

小内存系统的TLB,页表以及缓存。TLB、页表和缓存中所有的值都是十六进制表示的。

给定了这种初始化设定,让我们来看看当CPU执行一条读地址0x03d4处字节的加载指令时会发生什么。
为了开始这种手工的模拟,我们发现写下虚拟地址的各个位,标识出我们会需要的各种字段,并确定它们的十六进制值,是非常有帮助的。当硬件解码地址时,它也执行相似的任务。

开始时,MMU从虚拟地址中抽取出VPN(0x0F),并且检查TLB,看它是否因为前面的某个内存引用缓存了PTE 0x0F的一个副本。TLB从VPN中抽取出TLB索引(0x03)和TLB标记(0x3),组0x3的第二个条目中有效匹配,所以命中,然后将缓存的PPN(0x0D)返回给MMU。
如果TLB不命中,那么MMU就需要从主存中取出相应的PTE。然而,在这种情况中,我们很幸运,TLB会命中。现在,MMU有了形成物理地址所需要的所有东西。它通过将来自PTE的PPN(0x0D)和来自虚拟地址的VPO(0x14)连接起来,这就形成了物理地址(0x354)。
接下来。MMU发送物理地址给缓存,缓存从物理地址中抽取出缓存偏移CO(0x0)、缓存组索引CI(0x5)以及缓存标记CT(0x0D)。

因为组0x5中的标记与CT相匹配,所以缓存检测到一个命中,读出在偏移量CO处的数据字节(0x36),并将它返回给MMU,随后MMU将它传递回CPU。
翻译过程的其他路径也是可能的。例如,如果TLB不命中,那么MMU必须从页表中的PTE中取出PPN。如果得到的PTE是无效的,那么就产生有一个缺页,内核必须调入合适的页面,重新运行这条加载指令。另一种可能性是PTE是有效的,但是所需要的内存块缓存中不命中。

263-虚拟内存的地址翻译相关推荐

  1. Linux虚拟内存与线性地址翻译

    1. 虚拟内存 对于操作系统的使用者而言,内存就像是一个一排排按照从0到n被编好数字的收纳柜,每个柜子可以存放8个bit,也就是一个字节,我们将需要存放的信息切成若干个字节,放到连续的柜子中.以后我们 ...

  2. 深入理解地址翻译 CSAPP

    地址翻译, 用自己的话说一遍, 然后自己在draw.io画图理解. 术语 页表就是一个 页表条目(Page Table Entry  PTE)的数组,每一项(每个PTE)是[有效位,物理地址]. 我们 ...

  3. 【硬核】MMU是如何完成地址翻译的

    文章目录 1. 什么是虚拟内存? 2. 虚拟内存的作用 3. 虚拟内存与物理内存 3.1 CPU存取数据 3.2 物理地址常用术语 3.3 虚拟地址常用术语 3.4 页表常用术语 3.5 页命中/缺页 ...

  4. 深入了解MMU是如何完成地址翻译的?

    虚拟内存是现代操作系统中最伟大的发明之一.它为每个进程提供了一个一致的.私有的地址空间,让每个进程产生了一种自己在独享主存的错觉. 为了讲清楚MMU是如何一步一步完成地址翻译,取出数据的,本篇文章在前 ...

  5. [mmu/cache]-MMU的地址翻译(Address translation)指令介绍

    ★★★ 个人博客导读首页-点击此处 ★★★ Address translation system instructions AT指令的语法格式: 有了上面的语法格式后,就非常好理解armv8的MMU提 ...

  6. 端到端的地址翻译(虚拟地址是怎样取到相应高速缓存的数据的?)

    [0]写在前面-为什么需要虚拟存储器? 0.1)定义:虚拟存储器其实就是借用了磁盘地址空间,还记得当初我们安装CentOS,划分的swap 文件系统吗? 0.2)VM简化了链接和加载.代码和数据共享, ...

  7. 如何将中文地址翻译成英文

    中文地址翻译英文详细讲解以及例句 例如:中国广东深圳市华中路1023号5栋401房,您就要从房开始写起,Room 401, Buliding 5, No.1023,HuaZhong Road, She ...

  8. IP地址翻译成实际的物理地址

    Web API经常被那些使用成熟的公开服务(public service)的开发者所使用.例如, ESPN提供了获取运动员信息,比赛分数等信息的API.Google的开发者社区也提供了几十个API,用 ...

  9. 如何把中文地址翻译成英文?[婷停亭]

    文章出处:http://ttt.yculblog.com/post-2697.html 英文地址 Sharon @ 2003-03-11 17:38 X室 Room X X号 No. X X单元 Un ...

最新文章

  1. 图像特征点—SIFT特征点
  2. 业界 | 每天1.4亿小时观看时长,Netflix怎样存储这些时间序列数据?
  3. 归并排序(非递归,Java实现)
  4. linux脚本开机自动执行脚本文件,如何让linux开机自动执行sata里头的脚本文件
  5. 程序员自我修养笔记1
  6. django mysql返回json_Django 1.8.11 查询数据库返回JSON格式数据
  7. 汉语语言分析(2) - 短语
  8. 第十六周助教工作总结——NWNU李泓毅
  9. Android开发者指南-Manifest.xml-uses-feature
  10. 这么用 if-else,小鹿差点被辞退!
  11. phython学习第二天
  12. win10控制面板快捷键_你没玩过的全新版本 Win10这些操作你知多少
  13. 数据库视图的基本操作(sql语句)
  14. Solving environment: failed ResolvePackageNotFound: - ld_impl_linux-64==2.34=h53a641e_4
  15. Centos网络连不上网络
  16. mysql右表更新左表,mysql优化。左表是25W数据,右表目前小表,但随后是百万,千万,亿级别的表,慢慢增长...
  17. spring mvc中实现csrf安全防御简记
  18. Web前端是做什么的?就业前景好吗?
  19. 微信小程序 tab选项卡,可点击,可滑动
  20. hbase 源码分析 (14) spit 过程

热门文章

  1. 矩阵代数(五)- 矩阵因式分解
  2. 关于asterisk做呼叫转接的一点经验记录
  3. 如何用机器学习做广告反作弊(一)
  4. 阿里钉钉亮相重庆智博会,七大资本逾10亿资金赋能钉钉生态
  5. 对于CRITICAL_SECTION用法的介绍和理解
  6. 设计师的十大难题之一 ——如何选择一款好的APP原型设计工具
  7. 错误处理(三)—— 剪贴板为空。 (异常来自......)
  8. 一种神奇的数据结构—小波树
  9. 常用的一维时间序列滤波方法
  10. Git 多台电脑共用SSH Key