CPU访问虚拟存储器的过程涉及多个硬件和软件组件的协同工作,主要通过地址转换机制、页表管理和异常处理等步骤实现。以下是详细的原理和步骤分析:
1. 虚拟地址生成与分段
CPU在执行指令时产生虚拟地址(逻辑地址),该地址由段选择符和偏移量组成(若系统使用分段机制)。现代操作系统通常采用平面内存模型,段基址设为0,使虚拟地址直接等同于线性地址。
2. 分页机制与地址转换
多数系统采用分页管理,线性地址通过页表转换为物理地址:
- 页表查询:CPU的MMU(内存管理单元)根据页表基址寄存器(如x86的CR3)定位当前进程的页表。页表层级结构(如x86-64的四级页表:PML4、PDPT、PD、PT)逐级解析虚拟地址的高位。
- TLB加速:转换旁路缓冲器(TLB)缓存常用页表项,命中时直接获取物理页框号,避免访问内存。若TLB未命中(TLB Miss),则触发页表遍历(Page Walk)。
3. 缺页异常处理
当页表项标记为无效(Present位为0)时触发缺页异常(Page Fault),由操作系统处理:
- 页面置换:若物理内存不足,OS根据算法(如LRU)选择牺牲页,若被修改则写回磁盘(Dirty Page)。
- 数据加载:从磁盘的交换文件(Swapfile)或内存映射文件中加载缺失页面到物理内存,更新页表项并重试指令。
4. 权限与保护检查
MMU会验证页表项中的权限位(如读/写/执行权限、用户/内核模式),若违反则触发段错误(Segmentation Fault)或保护异常。
5. 系统调用与共享内存
对于共享内存区域(如动态库映射),不同进程的虚拟地址可能映射到同一物理页,通过写时复制(Copy-on-Write)技术优化性能。系统调用(如`mmap`)可直接操作进程的虚拟地址空间。
扩展知识
大页(Huge Page):减少TLB Miss,提升性能,通过增大单页大小(如2MB或1GB)降低页表层级开销。
预取机制:CPU预判访问模式,主动加载可能需要的页到内存。
NUMA优化:多核系统中,优先访问本地节点内存,减少跨节点延迟。
虚拟化扩展:如Intel EPT或AMD NPT,在虚拟机中实现客户机物理地址到主机物理地址的二次转换。
虚拟存储器的核心是通过软硬件协作,将有限的物理内存扩展为连续的虚拟地址空间,同时保障隔离性和安全性。