3. 单级页表原理:线性页表结构、页表基址寄存器、地址转换过程

单级页表(也称线性页表)是分页机制最基础的实现形式。它将虚拟地址空间划分为固定大小的页,物理内存划分为相同大小的页框,通过一个线性数组——页表——建立虚拟页号到物理页框号的映射。理解单级页表是掌握多级页表、倒排页表等复杂结构的前提。

3.1 线性页表结构

线性页表本质上是一个存储在物理内存中的一维数组。数组的每个元素称为页表项(PTE, Page Table Entry),其下标对应虚拟页号(VPN),存储的值包含物理页框号(PPN)及权限位、存在位等控制信息。

概念 说明 典型大小
页表基址寄存器(PTBR) CPU 内部寄存器,保存当前进程页表在物理内存中的起始地址 64 位(x86-64)或 32 位
页表项(PTE) 每个 PTE 包含物理页框号 + 标志位(存在位 R/W/U/S/D/A) 4 字节(32 位)或 8 字节(64 位)
页表大小 虚拟地址空间大小 ÷ 页大小 × PTE 大小 4 MB(32 位,4 KB 页,4 B PTE)
页表项数量 等于虚拟地址空间中页的数量 2^20(32 位,4 KB 页)
关键设计点:线性页表要求页表在物理内存中连续存放。对于 32 位系统(4 KB 页,4 B PTE),页表大小为 4 MB,意味着必须找到一块连续的 4 MB 物理内存来存放页表。这在嵌入式或内存碎片严重的系统中可能成为瓶颈。

3.2 页表基址寄存器(PTBR)

页表基址寄存器(Page Table Base Register)是 MMU 进行地址转换的起点。每个进程拥有独立的页表,进程切换时操作系统会更新 PTBR 指向新进程的页表。在 x86 架构中,PTBR 对应 CR3 寄存器;在 ARM 中对应 TTBR0/TTBR1。

PTBR 的典型工作流程:

  1. 进程创建:操作系统在物理内存中分配页表空间,将页表基址写入 PTBR。
  2. 进程切换:调度器将新进程的页表基址加载到 PTBR,同时刷新 TLB。
  3. 地址转换:MMU 每次访问内存时,从 PTBR 获取页表基址,结合 VPN 计算 PTE 地址。
性能提示:PTBR 的加载操作属于特权指令(如 x86 的 MOV CR3),只能在内核态执行。频繁的进程切换会导致 PTBR 更新和 TLB 刷新,这是上下文切换开销的主要来源之一。

3.3 地址转换过程

单级页表的地址转换分为三个核心步骤:拆分虚拟地址、查找页表项、拼接物理地址。以下以 32 位系统、4 KB 页大小为例说明。

3.3.1 虚拟地址拆分

32 位虚拟地址被拆分为两部分:

  • 高 20 位:虚拟页号(VPN),作为页表数组的索引。
  • 低 12 位:页内偏移(Offset),直接作为物理地址的低 12 位。
虚拟地址(32 位): 0x12345678
二进制拆分:
  VPN (20 位) = 0x12345
  Offset (12 位) = 0x678
页表项地址 = PTBR + VPN × PTE_SIZE
           = PTBR + 0x12345 × 4
           = PTBR + 0x48D14

3.3.2 页表项查找与物理地址拼接

MMU 从 PTBR 出发,以 VPN 为索引读取 PTE。若 PTE 的存在位为 1,则提取其中的物理页框号(PPN),与页内偏移拼接得到完整物理地址。

物理地址 = PPN × 页大小 + Offset
         = PPN × 4096 + Offset
         = (PPN << 12) | Offset
常见错误:初学者容易混淆“页表项地址”和“物理地址”。页表项地址是页表在物理内存中的位置,而物理地址是最终访问的数据所在位置。页表项地址 = PTBR + VPN × PTE_SIZE,物理地址 = PPN × 页大小 + Offset。

3.4 单级页表地址转换流程图

单级页表地址转换流程 虚拟地址 (32 位) VPN (高 20 位) Offset (低 12 位) 页表项地址 = PTBR + VPN × 4 PTBR (CR3) 读取 PTE 存在位 = 1 ? 提取 PPN 物理地址 = PPN∥Offset 缺页异常 关键公式 PTE 地址 = PTBR + VPN × PTE_SIZE 物理地址 = PPN × 页大小 + Offset 页大小 = 2^Offset_Bits 示例参数 32 位地址,4 KB 页 VPN = 20 位,Offset = 12 位 页表大小 = 2^20 × 4 B = 4 MB

3.5 单级页表的局限与改进方向

局限 具体表现 改进方案
页表连续内存需求 32 位系统需要 4 MB 连续物理内存存放页表 多级页表(第 4 章)
页表空间浪费 即使进程只使用少量虚拟地址,页表仍占满整个 VPN 空间 多级页表 + 按需分配
地址转换延迟 每次内存访问需额外一次页表读取(2 次物理访问) TLB 缓存(第 6 章)
进程切换开销 切换 PTBR 后 TLB 全部失效 ASID 标签 TLB(第 7 章)
总结:单级页表以最简单的线性数组形式实现了虚拟地址到物理地址的映射,是理解分页机制的基石。其核心操作——VPN 索引 + PTE 读取 + PPN 拼接——在所有页表变体中保持一致。然而,连续内存需求和空间浪费促使现代系统普遍采用多级页表结构。