内存虚拟化
内存虚拟化 (memory virtualization) 创造出一种假象:线程拥有一块属于自己的(足够大的)连续内存空间,从高地址到低地址依次是栈,堆,数据段与代码段。
实现内存虚拟化同样需要 OS 与硬件的相关机制与策略。
目标
- 透明性 (transparency):线程不能察觉到其地址空间是虚拟的
- 效率 (efficiency)
- 保护 (protection):线程只能访问自己的地址空间,与其他线程隔离 (isolation) 开
三个假设
一步一步来。
- 假设 1:一个线程所需的地址空间远小于内存的真实物理空间 (physical memory)
- 假设 2:一个线程的地址空间必须连续地映射到物理空间中
- 假设 3:每个线程地地址空间大小相同
动态重定位与地址翻译
硬件支持:
- 每个 CPU 的内存管理单元 (memory management unit, MMU) 存储了一对寄存器:基址寄存器 (base register) 与界限寄存器 (bound register)
- 线程访问某个虚拟地址时:
- MMU 检查合法性:虚拟地址 $\leq$ 界限?若否,引发异常
- MMU 地址翻译 (address translation):物理地址 $=$ 基址 $+$ 虚拟地址 => 访问物理地址
- 为 OS 提供的特权操作:更新基址与界限寄存器,注册异常处理器等
OS 支持:
- 通过 空闲列表 (free list) 管理内存空间:分配新线程的空间,回收终止线程的空间
- 上下文切换时:
- 将当前线程的基址/界限寄存器储存到 PCB 中(它们是内核态寄存器!)
- 将下一个线程的基址/界限寄存器加载进 MMU 中
- 提供异常处理器:通常是终止非法内存访问的线程
只需要简单的修改基址寄存器,OS 可以将某个线程的地址空间在物理空间内任意移动:这个过程甚至可以在线程运行时发生。这被称为动态重定位 (dynamic relocation)。