| 项目 | 值 |
|---|---|
| 核心概念 | 页表结构详解 |
| 关键公式 / 性质 | 每个 PTE 4 字节 → 页表大小 = 4MB |
| 考试频率 | ⭐⭐⭐⭐⭐ |
页表是虚拟地址到物理地址的映射表,每个进程拥有独立的页表。
┌────────────────────────────────────────────────┐
│ 物理页框号 (PFN) │ 控制位 │
├───────────────────────────────────┼───────────┤
│ 31 12 │ 11 0│
│ 物理页框号(20bit) │ 标志位 │
└───────────────────────────────────┴───────────┘
| 位 | 名称 | 说明 |
|---|---|---|
| 0 | Present (P) | 页是否在内存中 |
| 1 | Read/Write (R/W) | 读写权限 |
| 2 | User/Supervisor (U/S) | 用户 / 内核访问权限 |
| 3 | Page-level Cache Disable (PCD) | 禁用缓存 |
| 4 | Accessed (A) | 是否被访问过(用于置换算法) |
| 5 | Dirty (D) | 是否被修改过(写回策略) |
| 6 | Page Size (PS) | 页大小(用于大页) |
| 7 | Global (G) | 全局页(TLB 不失效) |
虚拟地址: [页号(20bit)] [页内偏移(12bit)]
↓
查页表
↓
物理页框号 + 页内偏移 → 物理地址
虚拟地址 (32bit):
┌──────────┬──────────┬──────────┐
│ 一级索引 │ 二级索引 │ 页内偏移 │
│ (10bit) │ (10bit) │ (12bit) │
└────┬─────┴────┬─────┴──────────┘
│ │
▼ │
一级页表(页目录) │
┌─────────┐ │
│ PDE[0] │────┼──→ 二级页表0
│ PDE[1] │ │ ┌─────────┐
│ ... │ └───→│ PTE[0] │──→ 物理页框
│ PDE[1023]│ │ PTE[1] │──→ 物理页框
└─────────┘ │ ... │
└─────────┘
虚拟地址 (48bit有效):
┌──────┬──────┬──────┬──────┬──────────┐
│ PML4 │ PDPT │ PD │ PT │ Offset │
│(9bit)│(9bit)│(9bit)│(9bit)│ (12bit) │
└──────┴──────┴──────┴──────┴──────────┘
Level4 Level3 Level2 Level1
四级页表结构:
CR3寄存器 → PML4表 → 页目录指针表(PDPT)
→ 页目录(PD)
→ 页表(PT)
→ 物理页框
| 级别 | 条目数 | 每项大小 | 表大小 |
|---|---|---|---|
| PML4 | 512 | 8 字节 | 4KB |
| PDPT | 512 | 8 字节 | 4KB |
| PD | 512 | 8 字节 | 4KB |
| PT | 512 | 8 字节 | 4KB |
PD项的PS位=1 → 该PD项直接映射2MB物理区域
减少一级页表查找,提高TLB覆盖率
PDPT项的PS位=1 → 直接映射1GB物理区域
用于数据库、虚拟机等大内存应用
传统页表以虚拟页号为索引,64 位地址空间页表过大。
以物理页框号为索引,表项记录哪个进程的哪个虚拟页映射到此。
物理页框号 进程PID 虚拟页号
──────────────────────────────
0 P1 5
1 P2 10
2 P1 3
3 (空闲)
...
输入: (PID, 虚拟页号)
→ 搜索倒排页表(用哈希加速)
→ 找到对应的物理页框号
→ 物理地址 = 物理页框号 + 页内偏移
| 优点 | 缺点 |
|---|---|
| 内存占用与物理内存成正比 | 地址转换需要搜索(哈希查找) |
| 适合 64 位大地址空间 | 共享内存实现困难 |
| 需要哈希表辅助 |
CPU发出虚拟地址VA
│
▼
┌──────────────┐
│ 查TLB │
│ (用VPN查) │
└──────┬───────┘
│
┌────┴────┐
│ 命中? │
└────┬────┘
Yes │ No
┌───┘ └───┐
▼ ▼
直接获得PFN 遍历页表
│ │
│ ┌─────┴─────┐
│ │ 页表项有效? │
│ └─────┬─────┘
│ Yes │ No
│ ┌─────┘ └──→ 缺页中断
│ ▼
│ 更新TLB
│ │
└─────┤
▼
物理地址 = PFN + Offset
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。