CSAPP : 虚拟内存

本章我们学习操作系统中最重要的概念之一,虚拟内存。

物理和虚拟寻址

CPU访问内存的方式,最原始也是最直接的当然是物理寻址,即便是现在,在简单的嵌入式微计算机中,内存也不复杂,所以仍然采用物理寻址。
虚拟寻址,顾名思义,CPU通过一个虚拟地址(Virtual Address)来访问主存,那么中间这个地址翻译的过程就需要专门的硬件——位于CPU上的内存管理单元(MMU)来搞定了。


一个使用虚拟寻址的系统.jpg

使用虚拟内存主要是基于下面三个考虑:

  1. 更有效的使用内存
  2. 简化内存管理:每个进程都有统一的线性地址空间
  3. 隔离地址控件:进程之间不会相互影响;用户程序不能访问内核信息和代码

虚拟内存的三个角色

CSAPP中介绍虚拟内存的三个主要角色,相比现代操作系统里直接撸概念要更有方向性:

  1. 作为缓存的工具
  2. 作为内存管理的工具
  3. 作为内存保护的工具

下面依次介绍

1. 作为缓存工具

一个VM系统是如何使用主存作为缓存的.jpg

虚拟内存被分割为被称为虚拟页(page)的大小固定的块,物理内存当然分割为物理页啦(也叫页帧page frame)。
大致的思路和之前的 cache memory 是类似的,就是利用 DRAM 比较快的特性,把最常用的数据换缓存起来。如果要访问磁盘的话,大约会比访问 DRAM 慢一万倍,所以我们的目标就是尽可能从 DRAM 中拿数据,所以要做到:

  • 页尺寸(page size):通常是 4KB,有的时候可以达到 4MB
  • 全相联(Fully associative):每一个虚拟页(virual page)可以放在任意的物理页(physical page)中,没有限制。
  • 因为访问磁盘慢,所以总是采用写回

Write-through: 命中后更新缓存,同时写入到内存中
Write-back: 直到这个缓存需要被置换出去,才写入到内存中(需要额外的 dirty bit 来表示缓存中的数据是否和内存中相同,因为可能在其他的时候内存中对应地址的数据已经更新,那么重复写入就会导致原有数据丢失)

操作系统为了对虚拟内存管理,需要一个类似目录的东西,这个数据结构叫做页表(page table),存放在物理内存中,每次地址翻译都要读取页表,操作系统负责维护更新页表。
要注意,每个进程都有一个独立的虚拟地址空间,所以每个进程也都有自己的页表哦。

页表.jpg

那么当操作系统查询页表的时候,会有两种情况出现:
一种是命中,也就是已缓存,而另外一种是未命中,也就是你要的数据还在磁盘上呢,此时会触发一个缺页异常,调用内核的缺页异常处理程序,替换一个在物理内存中的页。这样你需要的数据就真正放在内存中啦。

因为局部性原理,程序将趋向于在一个较小的活动页面集合上工作(也就是工作集/常驻集合),所以实际上页面调度不会太低效的。

2. 作为内存管理工具

前面提到,每个进程都有自己的虚拟地址空间,这样一来,对于进程来说,它们看到的就是简单的线性空间(但实际上在物理内存中可能是间隔、支离破碎的),具体的映射过程可以用下图表示:


进程独立的地址空间.jpg

注意:多个虚拟页面可以映射到同一个共享物理页面上

按需页面调度和独立的虚拟地址空间的结合,对系统中内存的使用和管理影响深远,具体如下:

  1. 简化链接:每个进程的内存格式都类似,简化链接器的设计和实现
  2. 简化加载:很容易向内存中加载可执行文件和共享对象文件,linux加载器只需要为代码和数据段分配虚拟页,然后标记成未缓存的,将页表条目指向目标文件的位置。具体将数据从磁盘复制到内存的工作则在具体执行指令时CPU引用。
  3. 简化共享:将不同进程中适当的虚拟页面映射到相同的物理页面,就能使多个进程共享操作系统内核代码啦(如printf),而不用每个进程自己都搞一个副本
  4. 简化内存分配:页表的存在,使得操作系统不需要分配连续的物理内存不需要是连续的

3. 作为内存保护的工具

页表项中有许可位,MMU通过检查这些位来进行权限控制(读、写、执行)。
如果指令违反,那么就会报告段错误(segmentation fault)。


虚拟内存提供页面级内存保护.png

地址翻译

先看图


地址翻译.jpg

页表基址寄存器是CPU中的一个控制寄存器,也就是用来放页表的地址的。
地址翻译又根据是否命中分为两种情况:

页面命中

  1. 处理器生成一个虚拟地址,传送给MMU
  2. MMU生成页表项地址,并从主存请求
  3. 主存向MMU返回页表项内容
  4. MMU构造物理地址,并把这物理地址传送给主存
  5. 主存返回所请求的数据给处理器


    页面命中.jpg

缺页

  1. 第一步到第三步,与上面相同
  2. 页表项中有效位是零,所以MMU触发了一次异常,传递CPU中的控制到操作系统内核中的缺页异常处理程序
  3. 缺页处理程序确定出物理内存中的牺牲页,如果修改过,写回磁盘
  4. 缺页处理程序调入新的页面,更新内存中的页表项
  5. 缺页处理程序返回到原来的进程,再次执行导致缺页的指令


    缺页.jpg

TLB加速地址翻译

每次CPU都让MMU查页表项也太烦了,不如再搞个缓存,同样利用局部性原理,对这个地址翻译的过程加速一下。于是就有了TLB(Translation Lookaside Buffer),也叫快表,这个东西直接在MMU里的,反正就是快。

多级页表

虽然页表是一个表,但因为往往虚拟地址的位数比物理内存的位数要大得多,所以保存页表项(PTE) 所需要的空间也是一个问题。举个例子:

假设每个页的大小是 4KB(2 的 12 次方),每个地址有 48 位,一条 PTE 记录有 8 个字节,那么要全部保存下来,需要的大小是:


公式.png

整整 512 GB!所以我们采用多层页表,第一层的页表中的条目指向第二层的页表,一个一个索引下去,最终寻找具体的物理地址,整个翻译过程如下:


k级页表的地址翻译.jpg

具体的地址翻译过程我猜就不用掌握了吧。。。躺。。。

总之,先总结这些,后面内存映射单独拿出来写,动态内存分配和垃圾收集就放到Malloc Lab里好了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 概述 我们都知道一个进程是与其他进程共享CPU和内存资源的。正因如此,操作系统需要有一套完善的内存管理机制才能防止...
    SylvanasSun阅读 3,749评论 0 25
  • 概述 现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空...
    要上班的斌哥阅读 16,266评论 2 55
  • 虚拟存储器又叫做虚拟内存,我们现在的操作系统普遍都支持了虚拟内存,这样做是因为我们同时运行着太多的程序了,就目前我...
    唐鱼的学习探索阅读 4,618评论 1 25
  • 1 内存寻址 1.1 物理地址、虚拟地址以及线性地址 物理地址: 物理内存的内存单元地址 虚拟地址: 程序员看到的...
    疯狂小王子阅读 2,715评论 3 21
  • 高中那会理发是5块钱,步入大学也就15元了。我不禁感叹,我的头可是越来越值钱了。是高中那会的三倍。也就是说你要是在...
    孙小拽阅读 759评论 0 0