这一部分对应的是讲座的 lec 28~lec 30(b 大上的参考课程为[Summer 20]),在这一部分,讲座将视角从硬件视角转换至软件 – 硬件接口的相关模块,即操作系统(OS)与虚拟内存(VM)。作为软硬交互的重要媒介,操作系统本身就是数据通路、模块控制、缓存与流水线设计的集成实现。在这一讲中,我们将从OS的基本概念和职责出发,延续“层次抽象”这一概念,并最终实现隔离与抽象两个核心目标。
Operating System
事实上,OS 是主机启动后运行的第一个程序:BIOS/UEFI 完成硬件自检和初始化后,会按照预设的启动顺序(如从硬盘、U盘、网络等)读取存储设备的主引导记录(MBR)或EFI系统分区中的引导程序(Bootloader)至内存并执行。引导程序随后负责加载操作系统内核映像到内存中,并将控制权移交给它
为什么需要将其设为第一个执行的程序?OS 在建立时,会统计和初始化当前设备上的所有可用外设,并激活对应的串口,为后续的软件调用提供系统调用(Syscall)接口。此外,OS 同时还负责对接下来运行的所有进程进行资源分配和调度管理。通过时间片轮换程序实现并发运行,从而提高设备利用效率。
基础的调度管理功能除了能提高系统效率,也为裸机提供了一定程度上的保护,通过在用户模式(User Mode)下发起的系统调用请求或触发的异常,CPU会通过陷阱(Trap)机制自动切换到内核模式(Kernel Mode),使得操作系统内核得以接管并执行特权操作。在处理完毕后,操作系统返回用户模式。这种机制有效隔离了用户程序与内核,防止了程序的无意错误或恶意行为破坏系统的稳定性和安全性
这其实是层次化的一种体现,硬件提供特权模式位(Privilege Mode Bit)和陷阱机制,OS利用模式及切换机制进行封装后来构建安全边界,只对上层暴露必要的请求接口。
Virtual Memory
在编译和链接阶段,程序被组织成从一个固定的起始地址(例如0x400000)开始。当进程被创建时,操作系统为其构建一个独立的虚拟地址空间,这使得每个进程都‘认为’自己独享整个CPU的寻址空间,从0开始。这并非物理内存中的真实地址(PA),而是程序使用的虚拟地址(VA)
那么显然问题就出现了:
- 操作系统如何进行 $\text{VA}\rightarrow \text{PA}$的映射?
- 如何确保每个映射的位置以及未来使用的空间各自独立?
lec 29 对上述问题给出了具体解释与实现,它通过页与页表(Page and Page Table)这一机制进行隔离。
页(Page)
页是虚拟内存和物理内存中固定大小的块(Block) 前者称之为虚拟页,后者物理页
页表(Page Table)
顾名思义,页表为页的集合,它是一个映射表,通过将虚拟页帧号映射到物理页帧号,并提供相应的权限位来辅助 Mem 进行读写。
那么计算方式显然:
$$\text{PA} = \text{PPN} + \text{Offset}_{P}\\\text{VA} = \text{VPN} + \text{Offset}_V$$
当访问的 VA 不存在时,OS 会抛出一个缺页异常(Page Fault Exception),经由相关的系统调用从磁盘加载对应页表到内存,然后回到中断现场,重新当前指令。
多级页表
很好理解的一个概念——多级页表是一种高效管理稀疏大地址空间的技术。它采用层次化结构,类似于书籍的‘章-节-页’目录。如果某一章(一级页表项)根本不存在,那么就无需为其分配任何‘节’(二级页表)的内存空间,从而极大地节省了内存占用。
TLB – 转换检测缓冲区
我们注意到,每次地址转换都可能需要一次甚至多次(对于多级页表)内存访问来查找页表,这会带来巨大的性能开销。
那么类似于 Cache ,我们在这引进了一个快速的硬件缓存,通过储存最近的 $\text{VPN}\rightarrow\text{PPN}$映射,显著降低寻址时的时间开销。其查找速度极快,通常只需1个时钟周期。当CPU需要转换地址时,它首先在TLB中查找,若找到(TLB命中)则直接获得物理地址;若未找到(TLB缺失),才需要执行耗时的页表遍历(Page Table Walk)操作
它的更新机制和 Cahce 类似,此处不再赘述。
上下文切换与TLB
当操作系统进行进程上下文切换时,由于新进程拥有不同的虚拟地址空间和页表,当前TLB中缓存的所有映射对新进程无效。一种简单的做法是在切换时清空(冲刷)整个TLB。然而,这会导致新进程刚开始运行时产生大量TLB缺失,性能下降。为了优化性能,现代CPU架构为TLB条目增加了地址空间标识符(ASID)标签。ASID像进程ID一样,可以区分不同进程的映射,从而允许不同进程的转换条目共存于TLB中,无需在每次上下文切换时都清空TLB,极大地减少了性能开销
这其实反映了系统设计时的一个优化问题:对当前子系统进行修改的影响是全局的,因此修改时需要进行全局考量
发表回复