Virtual Memory: Concepts

Address spaces

A System Using Physical Addressing

在使用物理寻址的系统中,以CPU执行一条移动指令为例,生成了一个有效的物理地址,这个地址实际上是主存储器中一个字节的偏移量,如上图,CPU在这里生成的物理地址为4,然后内存从该地址获取其中保存的字,然后将其发送回CPU,实际上,这是非常简单的微控制器工作的方式,但是这并不是大多数系统的工作方式,包括手机,台式机和服务器,这些系统虚拟化这个主存储器,虚拟化这个概念在计算机科学中是非常重要的。

A System Using Virtual Addressing

请求实际上是由一块称为MMU的内存管理单元的硬件来处理的。CPU将该地址发送给MMU,这是一个称为地址转换的过程,在这个例子中,它将虚拟地址4100转换为物理地址4,这实际上对应我们想要的数据对象的地址,MMU将虚拟地址转转为物理地址之后,然后内存将返回存储再该地址中的字。

我们为什么要这么做,事实证明,虚拟化地址空间有各种充分的理由,

Address Spaces

地址空间是一个集合(set),不是数据字节的集合,而是那些字节的地址的集合,并且线性地址空间是连续的非负整数集合,虚拟地址空间是包含N=2^n个虚拟地址的集合,是线性地址空间。物理地址空间是包含M=2^m个物理地址的集合,通常虚拟地址空间比物理地址空间大得多。

物理地址空间对应于系统中实际拥有的DRAM容量,对于在该系统上运行的所有进程,虚拟地址空间是相同的。

Why Virtual Memory (VM)?

第一,虚拟内存使用DRAM作为存储在磁盘上的实际数据的缓存,可以将虚拟内存视为存储再磁盘上的数据的DRAM缓存,这样我们能够更有效的使用内存,因为我们只需要缓存经常使用的数据,(与在讨论缓存和局部性时学到的思想相同)。

第二,它大大简化了内存管理,我们可以发现,地址空间对每个进程来说是一样的,(代码和数据总是加载到固定的地址,堆栈位于用户可见地址空间的顶部),

第三,它允许我们对访存进行访问,可以防止其他进程访问,虚拟内存允许我们创建这些单独的受保护的私有地址空间。

VM as a tool for caching

虚拟内存系统中的那些块被称为页面,他们通常比我们学过的缓存块要大得多。从概念上来讲,这个虚拟内存可以看作存储再磁盘上的一系列页面,这就是所谓的虚拟页面,并且这些页面中的每一个都将标识一个数字,比如虚拟页面VP0,VP1。然后这些页面的一部分存储再物理DRAM存储器中,然后又一些映射,告诉我们哪一些page已经被缓存,有一些页面甚至没有被分配,因为它们不存在于磁盘上,因为我们真的不想把地址空间的每个页面都存储起来,因此大多数地址空间是未分配的。

DRAM Cache Organization

我们可以这么想,这个DRAM只是一个缓存,但它的组织形式与我们之前所学的缓存非常不同,而这种差异是由于未命中时的巨大代价所致,如果你有一个缓存和DRAM,那么在未命中时就要从磁盘中获取数据项,会消耗很多的时间,这就是虚拟内存缓存的设计动机。

Enabling Data Structure: Page Table

在上面的图中,有一些page被缓存在memory中,当有一个vitrual address被传入的时候,通过page查到,就表示一次hit。

page hit

当页表中存在对虚拟地址空间中的字的引用的时候,会发生页面命中,这个字包含在缓存在DRAM中的页面中。我们知道CPU在执行指令时,生成一个虚拟地址,MMU在页表中查找,我们假设此虚拟地址位于虚拟页面2中的某个位置,那么MMU就去查找第二个页表目录,然后他就会得到虚拟页面2的物理地址,那样会有一个hit(见上图),现在内存可以将该物理地址返回给MMU。

未命中是对未在物理内存中缓存的字的引用。在上面的例子中,虚拟页面3没有缓存在DRAM中,它存储在硬盘上,所以现在触发异常,缺页异常,在硬件中,硬件触发异常,这使得控制权转移给内核中称为缺页处理程序的代码。这段代码选择要驱逐的牺牲页。

Handling Page Fault

在上面的例子是被驱逐的牺牲页是页面4,然后从磁盘中获取虚拟页面3,将其加载到内存中,然后更新此页表条目,以反映虚拟页面4现在存储在磁盘上的事实,如果虚拟页面4曾经被修改过,那么必须将修改的内容写入磁盘。

Allocating Pages

假设你调用了需要分配大块虚拟地址空间的malloc函数,如果一个页面尚未分配,那么内核或者malloc函数必须通过调用名为sbrk的函数来分配该内存,sbrk的功能只需分配空间,只需更改此页表条目即可,然后当实际访问该页面的时候,它才会被放入缓存。

Locality to the Rescue Again!

由于程序的局部性原理,如果工作集小于主储存器大小,那么内存可以存放下工作集中的所有页面,然后事情就会很好。但是当工作集的大小超过了主存储器的大小,就会很糟糕,进程互相颠簸并导致页面来回的复制,因此这样进程永远不会将其工作集完全放入内存中,学习地址转换时,我们将学到一个称为翻译后备缓冲器的小硬件缓存,这进一步利用了程序的局部性。

好的,因此虚拟内存是一种缓存工具,也是内存的管理工具。

VM as a Tool for Memory Management

VM as a tool for memory protection

虚拟地址空间的有些部分是只读的,比如代码段,地址空间中有些部分只能由内核执行,

像x86-64这样的系统上,这是一个64位系统,意味着所有的指针和地址都是64位的,但是实际上虚拟内容是48位的,48位以后的全部是0或者全部是1,这是英特尔定义的规则,高位的地址都是1的地址是为内核保留的,是内核中的代码或者数据,高位都是0的地址是为用户代码保存的。

通过向PTE添加位的简单技术,我们提供了这种自动的方式,保护虚拟空间的地址的不同部分免受未经授权的访问。MMU在每次检查时访问这些位,比如如果你在尝试做一个操作,但是相应的权限位是0,那么它就会抛出一个异常,由内核来处理。

Address translation

接下来就是深入了解细节,了解地址翻译到底是怎么运作的。

我们有N个元素的虚拟地址,M个元素的物理地址,通常N比M大,但也不是必须这样,这也完全没有理由(哈哈哈教授好可爱,还摊手),M也有可能比N大很多。

因此给定地址空间,我们有一个map函数,可以从V映射到P与一个空元素的并。

对于虚拟地址a,如果虚拟地址a处的数据位于物理地址a',那么MAP(a)=a'.

Summary of Address Translation Symbols

Address Translation With a Page Table

前面的p位移对应于页面偏移,剩余的位对应于虚拟页号,这是全相联的,所以只有一组。

地址转换的目的是为了对于给定的一个虚拟地址,得到相应的物理地址。

物理地址中的物理页号来自页表条目(page table entry)。有趣的是,物理地址的物理页面偏移部分来自虚拟页面偏移,这两个偏移是相同的。

Address Translation: Page Hit

Address Translation: Page Fault

Speeding up Translation with a TLB

Accessing the TLB

TLB Hit

TLB Miss

Multi-Level Page Tables

后面听的懵逼了。。emmm

CMU 15-213 Introduction to Computer Systems学习笔记(16) Virtual Memory: Concepts相关推荐

  1. Introduction to Computer Networking学习笔记(十五):Queue Model 包交换中的缓冲模型

    本章知识点比较零散,因此一篇文章进行总结,并且不具有连贯性,仅记录自己认为有价值的内容. 将较大的包拆分为小包进行传输,可以减小端对端延迟,原因如下图: 数据传输时,突发大量的数据包会增加延迟,简单周 ...

  2. cocos2d-x学习笔记16:记录存储1:CCUserDefault

    cocos2d-x学习笔记16:记录存储1:CCUserDefault 一.简述 CCUserDefalt作为NSUserDefalt类的cocos2d-x实现版本,承担了cocos2d-x引擎的记录 ...

  3. SpringBoot学习笔记(16)----SpringBoot整合Swagger2

    Swagger 是一个规范和完整的框架,用于生成,描述,调用和可视化RESTful风格的web服务 http://swagger.io Springfox的前身是swagger-springmvc,是 ...

  4. Hadoop学习笔记—16.Pig框架学习

    Hadoop学习笔记-16.Pig框架学习 一.关于Pig:别以为猪不能干活 1.1 Pig的简介 Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin, ...

  5. 台大李宏毅Machine Learning 2017Fall学习笔记 (16)Unsupervised Learning:Neighbor Embedding

    台大李宏毅Machine Learning 2017Fall学习笔记 (16)Unsupervised Learning:Neighbor Embedding

  6. Linux 学习笔记16 信号量

    Linux 学习笔记16 信号量Semaphore 信号量概念 信号量(或信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是控制进程(或线程)同步(谁先执行,谁后执行 ...

  7. Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析)

    Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析_2020.06.25) 前言: Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一 ...

  8. 区块链学习笔记16——ETH交易树和收据树

    区块链学习笔记16--ETH交易树和收据树 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 交易树和 ...

  9. 【论文学习笔记-16】立体匹配:360SD-net

    [论文学习笔记-16]立体匹配:360SD-net Contribution RelatedWork Method Experiment 本文利用两张360°摄像机获得的球形图片进行立体匹配,与双目立 ...

  10. Python学习笔记16:实操案例十三(编写程序实现乐手弹奏乐器,设计自定义类表达出租车和家用轿车信息)

    Python学习笔记16:实操案例十三(编写程序实现乐手弹奏乐器,设计自定义类表达出租车和家用轿车信息) 1.编写程序实现乐手弹奏乐器 注意Python的多态是"鸭子类型",只要有 ...

最新文章

  1. 每天一个 Linux 命令(13):less 命令
  2. Flink中GroupWindow和OverWindow各自的作用+window体系+文档阅读方式
  3. 设置width不生效_关于padding被计算在width中问题——box-sizing相关
  4. 可做fft分析吗_小吃店生意好做吗,小吃业行情分析
  5. FFmpeg non-existing PPS 0 referenced问题描述
  6. python可视化案例书籍推荐_我用python5年后,我发现学python编程必看的三本书!...
  7. 设计模式——代理模式与装饰模式的异同
  8. 使用 ESLint 禁止项目导入特定模块
  9. Android内核剖析pdf
  10. 直播app源码用php做直播平台开发怎么样?
  11. 广告关闭php,电脑右下角的广告怎么去掉
  12. 嘉兴 机器人仓库 菜鸟_菜鸟智能机器人仓库启用 助力包裹分得又快又好
  13. 前端开发环境搭建(工具使用)
  14. 如何修改第三方DLL文件名
  15. gta5 android ps4,gta5导演模式怎么玩好玩_gta5怎么进入导演模式怎么玩ps4导演模式怎么打开_攻略...
  16. 华为桌面云虚拟机卸载VM Tools工具计算机蓝屏开机不了-完美解决
  17. 【网络同步】浅析帧同步和状态同步
  18. python 基于pygame实现俄罗斯方块
  19. ioredis pipeline用法
  20. 老调重弹:JDBC系列 之 驱动加载原理全面解析

热门文章

  1. 64位电脑上安装MySQL进行MFC开发的相关问题
  2. 802.11n 重新扬帆
  3. UML学习系统(一)
  4. MySQL回滚日志(undo log)总结
  5. 【React】绑定this的5种方法总结
  6. es6-3.webpack应用
  7. CentOS6.5 linux 逻辑卷管理 调整分区大小
  8. 10、Cocos2dx 3.0游戏开发找小三之容器篇:Vector、Map、Value
  9. JTA分布式事务处理
  10. 《C语言及程序设计》程序阅读——数组与指针