1. 本质 (First Principles)
- 目的:
- 扩容:让程序以为自己拥有无限大的内存(逻辑地址空间 > 物理内存)。
- 隔离:每个进程有独立的地址空间,互不干扰(安全基石)。
- 机制:将逻辑地址(VA)映射到物理地址(PA)。映射表叫页表 (Page Table)。

2. 页表结构 (Page Table)
为了管理方便,系统把虚拟空间和物理空间都切成大小一样的小块。
- 页 (Page):虚拟空间的小块(比如 4KB)。
- 页框 (Page Frame):物理内存的小块(必须和页一样大)。
- 页内偏移 = = offset
- 虚拟地址 = 虚拟页号(VPN) + offset
- PFN - 物理页框号
- 根据虚拟地址对应找到
- PA - 物理地址 = 物理页框号 + offset
操作系统维护了一张表,记录了“虚拟页号 物理页号”的对应关系。
- Valid 位(有效位):标记这一页是在内存里(1),还是被踢到磁盘上了(0)。
- Dirty 位(脏位):标记这一页有没有被修改过(如果没改过,替换时就不用写回磁盘,直接覆盖就行)。
- 全相联:虚拟页可以映射到物理内存的任意页框(Page Frame)。
- 页表项 (PTE):
- 物理页号 (PFN):映射结果。
- 有效位 (Valid):1=在内存,0=在磁盘(触发缺页异常 Page Fault)。
- 脏位 (Dirty):页面被修改过,替换时需写回磁盘。
- 访问权限 (Access):R/W/X。NX (No-Execute) 位是防御缓冲区溢出的关键。
3. 快表 (TLB) - 性能命门
- 定义:页表的 Cache。存放最近用到的 PTE。
- 流程:CPU TLB (Miss) 页表 (Miss) 磁盘。
- 上下文切换:进程切换时,TLB 必须刷新(Flush),否则会访问到上一个进程的空间。这也是Meltdown 漏洞的利用点。
如果查页表发现 Valid=0(数据不在内存,在磁盘),这就是缺页。 这时候硬件搞不定了,必须叫操作系统(OS)出来救场:
- 中断:CPU 暂停当前程序,跳到 OS 的缺页处理程序。
- 搬运:OS 负责把数据从磁盘读到内存的一个空闲页框里。
- 更新:修改页表,把 Valid 设为 1。
- 重来:CPU 重新执行刚才那条指令(这次就能查到了)
4. 关联链接
- Linux内核:
swap分区的作用。 - 容器技术:Docker 如何利用 Namespace 隔离文件系统,本质上是虚拟存储的高级应用。
- Cache与虚存对比