20145337 《信息安全系统设计基础》第十四周学习总结
教材学习内容总结
- 现代系统提供对主存的抽象概念——虚拟存储器;虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件及内核软件的完美交互,为进程提供了一个大的、一致的、私有的地址空间
- 虚拟存储器的3个能力:
- 将主存看作是一个存储在磁盘上的地址空间的高速缓存,在主存中只保护活动的区域,并根据需要在磁盘和主存之间来回传送数据;
- 为每个进程提供了一致的地址空间,从而简化了存储器管理;
- 保护了每个进程的地址空间不被其它进程破坏
物理和虚拟寻址
- 物理寻址(PA):主存中每个字节都有唯一的物理地址;依靠此来寻址,就叫做物理寻址;
- 虚拟寻址(VA):CPU生成一个虚拟地址然后用这个地址访问主存,这个虚拟地址在送到存储器之前先被转换成适当的物理地址(这个过程叫做地址翻译)
地址空间
- 系统分为 虚拟地址空间、物理地址空间
- 虚拟存储器基本思想:主存中的每个字节都有一个选自虚拟空间的虚拟地址和选自物理地址空间的物理地址
虚拟存储器作为缓存工具
- 每个字节都有唯一的虚拟地址。VM通过将虚拟存储器分割为虚拟页,处理主存和磁盘的传输
- 虚存页面集合
- 未分配的:VM系统没有将它们与任何数据关联起来,也不占用任何磁盘空间;
- 缓存的:当前缓存在物理存储器中的已分配的页;
- 未缓存的:没有还存在物理存储器中的已分配页;
页表
- 作用:将虚拟页映射到物理页。每次地址翻译硬件将一个虚拟地址转换为物理地址时都会读取页表。操作系统负责维护页表中的内容。
- 结构:页表就是一个页表条目(PTE)数组;虚拟地址空间中的每个页在页表中一个固定偏移量处都有一个PTE。为了我们的目的,我们假设每个PTE是由一个有效位和一个n位的地址字段组成的。有效位表明了该物理页的起始位置,这个物理页中缓存了该虚拟页。
缺页
- 缺页:就是指DRAM缓存不命中。
- 缺页异常:会调用内核中的缺页异常处理程序,选择一个牺牲页。
- 页:虚拟存储器的习惯说法,就是块
- 交换=页面调度:磁盘和存储器之间传送页的活动
- 按需页面调度:直到发生不命中时才换入页面的策略,所有现代系统都使用这个。
局部性
- 局部性原则保证了在任意时刻,程序将往往在一个较小的活动页面集合上工作,称为工作集
- 当工作集大小超出物理存储器大小,那么程序将产生颠簸
虚拟存储器作为存储器管理的工具
- 操作系统为每个进程提供了一个独立的页表,因而也是一个独立的虚拟地址空间
- 多个虚拟页面可以映射到同一个共享物理页面上
- VM简化了链接、加载、代码、数据共享,以及应用程序的存储器分配
地址翻译
一、地址翻译:形式上说,地址翻译是一个N元素的虚拟地址空间(VAS)中的一个元素和一个M元素的物理地址空间(PAS)之间的映射;
二、过程:
- CPU中的一个控制寄存器,页表基址寄存器指向当前页表;
- n位的虚拟地址包括以下两个部分:一个p位的虚拟页面偏移和一个(n-p)位的虚拟页号;
- MMU用后者选择适当的PTE,再将物理页号和虚拟地址中的VPO串联起来得到物理地址;
- 因为物理和虚拟页面都是P字节的,所以物理页面偏移和VPO是相同的
三、CPU执行步骤(页面命中)
- 处理器生成一个虚拟地址,并把它传递给MMU;
- MMU生成一个PTE地址,并从高速缓存/主存中请求得到它;
- 高速缓存/主存向MMU返回PTE;
- MMU构造物理地址,并把它传给高速缓存/主存;
- 高速缓存/主存返回所请求的数据字给处理器
四、CPU执行步骤(缺页)
- 处理器生成一个虚拟地址,并把它传递给MMU;
- MMU生成一个PTE地址,并从高速缓存/主存中请求得到它;
- 高速缓存/主存向MMU返回PTE;
- PTE中有效位是0,触发了一次异常,传递CPU中的控制到操作系统内核中的缺页异常处理程序;
- 缺页处理程序确定物理存储器中的牺牲页,如果这个页已经被修改了,则把它换出到磁盘;
- 缺页处理程序调入新的页面,并更新存储器中的PTE;
- 缺页处理程序返回到原来的进程,再次执行导致缺页的指令。CPU将引起缺页的虚拟地址重新发送给MMU;
- 因为虚拟页面现在缓存在物理存储器中,所以发生命中。
linux虚拟存储器系统
- linux为每个进程维持了一个单独的虚拟地址空间,其中,内核虚拟存储器位于用户栈之上;
- 内核虚拟存储器包含内核中的代码和数据结构,还有一些被映射到一组连续的物理页面(主要是便捷地访问特定位置,比如执行I/O操作的时候需要的位置)
- linux将虚拟存储器组织成一些区域(也叫做段)的集合。一个区域就是已经存在的(已分配的)虚拟存储器的连续片;
- 意义:允许虚拟地址空间有间隙;内核不用记录那些不存在的页,这样的页也不用占用存储器;
- 区域结构
- vm_start:指向这个区域的起始处;
- vm_end:指向这个区域的结束处;
- vm_prot:描述这个区域内所包含的所有页的读写许可权限;
- vm_fags:描述这个区域内的页面是与其他进程共享的,还是这个进程私有的,等等;
- vm_next:指向链表的下一个结构
存储器映射
- 概念:linux(以及一些其他形式的unix)通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容;
- 类型:
- unix文件系统中的普通文件:一个区域可以映射到一个普通磁盘文件的连续部分,例如一个可执行目标文件;
- 匿名文件:一个区域也可以映射到一个匿名文件,匿名文件由内核创建,包含的全是二进制零(CPU第一次引用这样一个区域内的虚拟页面的时候,内核就在物理存储器中找到合适的牺牲页面然后用二进制零将其覆盖)
动态存储器分配
- 堆:是一个请求二进制0的区域,紧接在未初始化的bss区域后开始,并向上(更高的地址)生长。有一个变量brk指向堆的顶部
- 分配器的两种基本风格
- 显示分配器-malloc和free
- 隐式分配器/垃圾收集器
- 为什么要使用动态存储器分配?
- 因为经常知道程序实际运行时,它们才知道某些数据结构的大小。
- 分配器的要求和目标:
- 要求:
- 处理任意请求序列
- 立即响应请求
- 只使用堆
- 对齐块
- 不修改已分配的块
- 目标:
-
最大化吞吐率(吞吐率:每个单位时间里完成的请求数)
-
最大化存储器利用率——峰值利用率最大化
-
碎片:
虽然有未使用的存储器,但是不能用来满足分配请求时,发生这种现象。
1、内部碎片
(1)发生在一个已分配块比有效载荷大的时候
(2)易于量化。
2、外部碎片
(1)发生在当空闲存储器合计起来足够满足一个分配请求,但是没有一个单独的空间块足以处理这个请求时发生
(2)难以量化,不可预测。
其他(感悟、思考等,可选)
虚拟存储器很复杂……你掌握了这些细节,就能手工模拟一个小系统的虚拟存储机制,虚拟存储器的概念将不再神秘
- 这章的有些地方,是看的似懂非懂,但是收获很大。不光巩固了操作系统所讲的页式存储的知识,更明白了虚拟存储器的工作原理。这一章作为本学期学习任务的最后一章,让我对计算机有了更加深入的了解。老师曾说,学好这本书,对计算机了解就比较全面了,攻坚克难更容易些,对于这本书的学习,我做的远远不够,每个章节囫囵吞枣的看下来,对本书的这几个模块没有关联起来,每个部分也存在停留在文字表面意思的阶段。这是我的不足。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第十四周 | 200/200 | 2/2 | 20/20 | 虚拟器存储、页式管理 |