5.4.1 虚拟存储器基本概念

分页:将内存分成固定长且较小的存储块,每个进程也划分为固定长度的程序块。程序块对应内存可用的存储块

页表逻辑地址(指令所用的地址)和物理地址(存放指令和数据的实际内存地址,可能为主存,可能为磁盘)的一一对应的关系表。操作系统为每个进程生成一个页表。

按需调页:根据程序访问局部性,可以将当前的页面调入主存,而其余放到磁盘上。这样可以节省主存的空间。 这样给每个进程一个假象:每个内存都“独占”主存且空间极大,实际上是通过按需调页来实现。

5.4.2 虚拟存储器的组织方式

各部件的组织形式

  • CPU:产生虚拟地址
  • MMU:输出物理地址
  • L1/L2/L3 Cache:按照物理地址查找
  • 主存:RAM
  • 磁盘:外存(用DMA传送)

页式虚拟存储器

  • 虚存分为若干虚页,逻辑地址格式:虚页号+页内地址
  • 主存分为若干实页,物理地址格式:实页号+页内地址
  • 页表:建立虚页到实页的映射关系,用 页表基址寄存器 保存在主存中的起始地址
    • 页表内容:装入位 (Valid)、修改位 (Dirty)、替换控制位、访问权限位、禁止访存位、实页号
    • Valid 位记录对应是主存 (1) 还是磁盘 (0),如果为 0 表示缺页 (Page Fault),需要读磁盘放到主存中。
  • 页大小比 Cache 中的块大得多(避免页表太大)
  • 采用全相联映射(最大限度利用物理内存)
  • Write Back 写策略(减少磁盘写操作)
  • 通过软件处理缺页(操作系统)

5.4.3 快表(TLB)

最难的知识点、层次结构、查询地址的路径流程、三种hit/miss的原因、所有路径的完整具体流程要非常清晰

TLB (Translation Lookaside Buffer, 转换后备缓冲器):使用 Cache 存储页表项,包含最新访问的那些页表项。以减少每次虚存需要的两次存储器访问。

索引步骤:

  • 先由虚页号到TLB中找
  • 若TLB中的V=0 或Tag≠VA,则页表中找
  • 若页表中V=0,则缺页,到磁盘中找

索引的可能路径

  • 总体路径VA --(TLB hit/miss)--> --(页表 hit/miss)--> PA --(Cache hit/miss) --> Data.
  • 寻找地址
    • TLB hit/miss:先查页表有没有对于当前 VA 的映射。
    • 页表 hit/miss:(如果 TLB miss)再查页表有没有对于当前 VA 的映射。
    • Cache hit/miss:(已得到 PA)查 Cache 是否有当前 PA 对应的地址。
  • 数据回写
    • TLB miss:将对应的页表项复制到 TLB 里面;
    • 页表 miss:将磁盘读取一整页放到主存中,更新页表,并把对应的页表项放到 TLB 中。
    • Cache miss:将主存的数据复制到 Cache.

页式虚拟存储器的特点

  • 优点:简单、开销少
  • 缺点:页之间离散,管理不方便

段式虚拟存储器:将程序按照逻辑结构分为若干段,每段对应着主存中的一个连续地址。

段式虚拟存储器的特点

  • 优点:每段逻辑独立,动态可变,可自由调度
  • 缺点:主存分配麻烦,容易留下很多零碎空间

段页式虚拟存储器:段表+页表。每个程序在段表中是连续的,段表中的每个元素对应一个页,每个页是离散的。

5.4.4 存储保护

存储保护:保证程序之间不相互干扰,每个程序只能访问自己的存储区和共享区。

存储保护的功能:

  • 两种运行模式:管理模式、用户模式
  • 使一部分CPU状态只能由系统进程写,而不能由用户进程写。
  • 允许CPU在管理态和用户态之间相互转换