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在管理态和用户态之间相互转换