1. 本质 (First Principles)

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

image.png

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)出来救场:

  1. 中断:CPU 暂停当前程序,跳到 OS 的缺页处理程序。
  2. 搬运:OS 负责把数据从磁盘读到内存的一个空闲页框里。
  3. 更新:修改页表,把 Valid 设为 1。
  4. 重来:CPU 重新执行刚才那条指令(这次就能查到了)

4. 关联链接