目录
1.为什么引入虚存的概念?
- 一个系统中的进程与其他进程共享CPU和主存资源,存储器更加难以管理。
- 虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件、内核软件的完美交互
- 为每个进程提供一个大、一致的私有地址空间。
能力:
- 高效使用主存:将主存看成存储在磁盘上的地址空间的高速缓存,主存中只保持活动区域,根据需要在主存&&磁盘间来回传送数据。
- 简化存储器管理:为每个进程提供一致的私有地址空间。
- 保护每个进程的地址空间不被其他进程破坏。
2.物理和虚拟寻址
物理寻址:主存被组织成一个M个连续的,字节大小的单元,组成的数组。每个字节一个物理地址。CPU生成一个物理地址->送到存储器。
虚拟寻址:CPU生成一个虚拟地址(VA)->转换为适当的物理地址->送到存储器。
地址翻译:
- CPU硬件和操作系统的密切配合
- CPU芯片上的存储管理单元的专用硬件,利用主存中的查询表动态翻译虚拟地址(表的内容操作系统管理)
3.地址空间
- 一个非负整数地址的有序集合(如果是连续:线性地址空间)
- n位地址空间:
- 物理地址空间:M不要求是2的幂次
- 主存中的每个字节都有一个选自虚拟地址空间的地址,和一个选自物理地址空间的地址。
4.虚拟存储器作为缓存的工具
- 磁盘上的数据被分割成块,作为磁盘和主存之间的传输单元。
- 分割成块:虚拟存储器->虚拟页,物理存储器->物理页(页帧)都是字节
- 虚拟页面的集合分为(不相交子集):
①未分配的:VM系统还未分配(或创建)的页,没有任何数据关联,不占磁盘空间
②缓存的:当前缓存在物理存储器的已分配页
③未缓存的:没有缓存在物理存储器的已分配页
①DRAM缓存的组织结构:
- 虚拟存储器系统的缓存,在主存中缓存虚拟页
- DRAM缓存的不命中比SRAM缓存的不命中昂贵,由磁盘服务
- 虚拟页比较大(4KB~2MB)
- DRAM缓存全相联,替换算法更复杂
- 使用写回
直写式 WT,Write Through 与 回写式 WB,Write Back 指的是缓冲内存的工作方式 直写式缓存方式是 当 CPU 要将数据写入内存时除了更新缓冲内存上的数据外也将数据写在 DRAM中以维持主存与缓冲内存的一致性 当要写入内存的数据一多 速度自然就慢了下来
回写式的缓存方式是 每当 CPU 要将数据写入内存时 只会先更新缓冲内存上的数据 随后再让缓冲内存在总线不塞车的时候才把数据写回 DRAM 所以速度自然快得多
②页表
- 虚拟页在DRAM中吗?在哪个物理页?
- PTE页表项:虚拟地址空间中每个页都在页表中对应一个条目:1有效位+n地址段(假设)
下图:VP0、VP5未分配,VP3、VP6分配未被缓存,其他被缓存
③页命中
如上图,假如读VP2中的虚拟存储器中一个字节,通过虚拟地址->找到页表项PTE2->有效位=1->物理地址get√
④缺页
引用VP3中一个字->找到PTE3->有效位=0->触发一个缺页异常
->调用内核缺页处理程序->选择牺牲页VP4:
- VP4已被修改:内核将VP4拷贝回磁盘
- VP4未被修改:不拷贝
->内核从磁盘拷贝VP3到PTE3,返回->重新启动导致缺页的指令->页命中
⑤交换/页面调度
- 在磁盘和存储器中传送页的活动
- 从磁盘换入DRAM,从DRAM换出磁盘
- 按需页面调度:一直等待,当有不命中时才换入页面
⑥分配页面
操作系统分配一个新的虚拟存储器页时,例如,调用malloc->在磁盘上创建空间->更新PTE5,指向磁盘上的页面
⑦局部性
- 保证了在任意时刻,程序往往在一个较小的活动页面集合工作(工作集、常驻集)。
- 工作集的大小大于物理存储器的大小:颠簸,页面不断换进换出
unix的getrusage检测缺页数量
5.虚拟存储器作为存储管理的工具
操作系统为每个进程提供一个独立的页表:多个虚拟页面可以映射到同一个物理页面
简化链接:
- 独立的私有地址空间,每个进程的存储器映像使用相同的基本格式。总是0x80480000/0x400000开始。
- 链接器可生成全链接的可执行文件,独立于物理存储器中代码和数据的最终位置的。
简化加载:
- 容易向存储器中加载可执行目标文件,和共享对象文件
- Linux加载器,分配虚拟页的一个连续的片chunk),从0x08048000/0x400000开始虚拟页标记为无效,页表条目指向目标文件中适当位置。
- 加载器不实际从磁盘拷贝数据到存储器,引用时按需调入。
简化共享
- 独立地址空间,为操作系统提供管理用户进程,和操作系统自身间共享的一致机制。
- 私有数据、代码、堆、栈,操作系统新建页表,映射到不同物理页面。
- 共享的(内核代码,库程序),操作系统将不同进程中适当的虚拟页面映射到相同的物理页面。
简化存储器分配
- 虚拟存储器向用户进程,提供了一个简单的分配额外存储器的机制。
- 如malloc,操作系统分配k个连续的虚存页面,映射到物理存储器中任意位置的k个物理页面。
6.虚拟存储器作为存储器保护的工具
为操作系统提供手段控制对存储器系统的访问
- 不应该修改只读文本段
- 不允许读写其他进程的私有存储器
- 不允许修改共享页面除非其他所有共享者显式地允许它做
- 不允许读或修改内核的代码和数据结构
SUP:是否必须运行在内核模式下(超级用户)才能访问该页
READ:可读
WRITE:可写
违反:一般保护故障->内核异常处理程序->Unix报告段错误
7.地址翻译
A.翻译过程
页面命中时:完全由硬件处理
①处理器生成一个虚拟地址->传送给MMU
②MMU生成PTE地址,从高速缓存/主存请求得到
③高速缓存/主存向MMU返回PTE
④MMU构造物理地址,传送给高速缓存/主存
⑤高速缓存/主存返回数据给处理器
缺页时:硬件和操作系统内核协作
④PTE有效位=0,MMU触发异常,CPU控制到操作系统内核缺页处理程序
⑤缺页处理程序确定牺牲页,若该页已经被修改则换出到磁盘
⑥缺页处理程序调入新的页面,更新存储器中PTE
⑦缺页处理程序返回原来进程,再次执行导致缺页的指令,CPU将引起缺页的虚拟地址重新发送给MMU,命中
B.TLB加速地址翻译
- TLB(翻译后备缓冲器):在MMU中包括的一个关于PTE的小缓存
- 这样所有的翻译步骤都在MMU中进行,非常快
TLB命中和不命中时:
TLB命中:
①CPU产生虚拟地址
②③MMU从TLB中取出对应的PTE
④MMU将虚拟地址翻译成物理地址,发送给高速缓存/主存
⑤高速缓存/主存发送所请求的数据给CPU
TLB不命中:
MMU从L1缓存中取出相应的PTE ,放在TLB中,可能覆盖一个已存在的条目
C.多级页表
如果我们有一个 32 位的地址空间、 4KB 的页面和一个 字节的 PTE, 那么即使应用所引用的只是虚拟地址空间中很小的一部分,也总是需要一个 4MB 的页表驻留在存储器中。(4GB/4KB )*4B=4MB
如何压缩页表?
分层次
减少存储器需求:
①如果一级页表中的一个PTE是空的,那么相应的二级页表不会存在(典型的程序虚拟地址的4GB空间大部分未分配的)
②只有一级页表需要总是在主存中,虚拟存储器系统可以在需要时创建、页面调入/调出二级页表,减少主存压力,只有经常使用的二级页表才需要缓存在主存中
第 k级页表中的每个 PTE 包含某个物理页面的 PPN 或一个磁盘 块的地址。为了构造物理地址,在能够确定 PPN 之前, MMU 必须访问 k个PTE 。对于只有一级的页表结构, PPO 和VPO 是相同的。