理解虚拟内存:概念、动机与地址映射原理
1. 什么是虚拟内存
虚拟内存(Virtual Memory)是操作系统提供的一种内存管理技术,它把每个进程看到的地址空间与物理内存(RAM)的实际地址空间解耦。每个进程都拥有一个独立、连续、从 0 开始的虚拟地址空间,而这份虚拟地址空间并不需要全部对应到真实的物理内存上。
在虚拟内存机制下,程序访问的是虚拟地址,CPU 通过内存管理单元(MMU)把虚拟地址翻译成物理地址,再访问真正的物理内存。如果访问的虚拟页当前不在物理内存中,操作系统会通过缺页中断(Page Fault)把数据从磁盘换入内存,从而让程序感觉“内存足够大”。
虚拟内存的引入,让每个进程都以为自己独占了一块连续的大内存,而实际上物理内存可能很小,甚至多个进程共享同一块物理内存。
2. 为什么使用虚拟内存
使用虚拟内存主要出于以下几个核心动机:
- 内存隔离与保护:每个进程拥有独立的虚拟地址空间,进程 A 无法直接访问进程 B 的地址,操作系统通过页表权限位控制读写执行权限,避免进程间互相干扰,也防止恶意程序越权访问。
- 简化内存管理:程序员不需要关心物理内存的碎片、容量和布局,只需面对一个连续、统一的虚拟地址空间,大大降低了编程复杂度。
- 按需加载(Demand Paging):程序运行时,只有真正被访问到的页面才会被加载进物理内存,未使用的代码和数据可以留在磁盘上,从而让物理内存容纳更多进程,提高内存利用率。
- 支持比物理内存更大的地址空间:虚拟地址空间的大小由 CPU 位数决定(如 64 位系统可达 2^64 字节),可以远超物理内存容量,程序可以处理更大的数据集。
- 共享内存与进程间通信:多个进程可以把同一物理页面映射到各自的虚拟地址空间,实现高效的共享内存通信,例如动态库的代码段被多个进程共享。
- 内存映射文件:通过把磁盘文件映射到虚拟地址空间,程序可以像访问内存一样读写文件,简化 I/O 操作。
3. 虚拟内存如何映射到物理内存
虚拟地址到物理地址的映射由内存管理单元(MMU)配合页表(Page Table)完成,核心单位是“页”(Page)。虚拟地址空间和物理内存都被划分为固定大小的页,常见页大小为 4KB。
3.1 页表的基本结构
每个进程都维护一张页表,页表的每一项(Page Table Entry,PTE)记录了虚拟页到物理页框的映射关系,以及该页的权限和状态信息,例如:
- 有效位(Present Bit):该虚拟页是否已加载到物理内存。
- 物理页框号(Physical Frame Number):对应的物理内存页框地址。
- 权限位:读、写、执行权限。
- 脏位(Dirty Bit):该页是否被修改过,用于换出时决定是否写回磁盘。
- 访问位(Accessed Bit):该页是否被访问过,用于页面置换算法。
3.2 地址翻译过程
当 CPU 访问一个虚拟地址时,MMU 会执行以下翻译步骤:
- 把虚拟地址拆分为虚拟页号(VPN)和页内偏移(Offset)两部分。
- 以虚拟页号为索引,在页表中查找对应的页表项。
- 检查页表项的有效位:如果该页在内存中,取出物理页框号,与页内偏移拼接,得到最终的物理地址。
- 如果有效位为 0,说明该页不在内存中,触发缺页异常(Page Fault),由操作系统从磁盘加载该页到物理内存,并更新页表,然后重新执行被中断的指令。
以 32 位系统、4KB 页大小为例,虚拟地址的低 12 位是页内偏移,高 20 位是虚拟页号。物理地址 = 物理页框号 × 页大小 + 页内偏移。
3.3 多级页表与 TLB
对于 64 位系统,单级页表会占用巨大的内存空间,因此现代操作系统普遍采用多级页表结构(如 x86-64 的四级页表)。多级页表按需分配,只有实际使用的地址范围才会建立页表项,从而节省内存。
由于每次地址翻译都要访问内存中的页表,开销较大,CPU 引入了转换后备缓冲器(TLB,Translation Lookaside Buffer),它是 MMU 内部的高速缓存,缓存最近使用的虚拟页号到物理页框号的映射。命中 TLB 时无需访问内存中的页表,大幅提升翻译速度。
3.4 缺页处理与页面置换
当进程访问的页面不在物理内存中时,操作系统执行缺页处理流程:
- 检查访问地址是否合法(是否在进程地址空间内)。
- 如果合法,操作系统选择一个空闲物理页框;若无空闲页框,则通过页面置换算法(如 LRU、Clock)选择一个牺牲页换出。
- 从磁盘(交换区或映射文件)读取所需页面到该物理页框。
- 更新页表项,设置有效位,并重新执行触发缺页的指令。
4. 总结
虚拟内存通过页表把进程的虚拟地址空间映射到物理内存,实现了内存隔离、按需加载和地址空间扩展等能力。MMU 负责地址翻译,TLB 加速翻译过程,缺页机制则让程序可以透明地使用远超物理内存容量的地址空间。理解虚拟内存,是深入理解操作系统内存管理、进程隔离和性能优化的基础。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)