步骤 4 / 9
多级页表:省下页表本身的空间
地址空间很大但大部分没用,所以页表分层,只为用到的部分建表。
如果给整个 64 位地址空间建一张平铺的大表,光页表就要占海量内存。 x86-64 Linux 通常用 4 级页表(新 CPU 可用 5 级):像目录树一样一级级往下查,没用到的分支整片不建。 代价是一次翻译要查好几层,这正是下一步 TLB 要解决的问题。
操作系统
每个程序都以为自己独占一大片内存,其实背后有一层翻译。
以 Linux 上一个程序读取自己内存中的一个变量为例,只讲概念。
步骤 4 / 9
地址空间很大但大部分没用,所以页表分层,只为用到的部分建表。
如果给整个 64 位地址空间建一张平铺的大表,光页表就要占海量内存。 x86-64 Linux 通常用 4 级页表(新 CPU 可用 5 级):像目录树一样一级级往下查,没用到的分支整片不建。 代价是一次翻译要查好几层,这正是下一步 TLB 要解决的问题。
| 当前状态 | 发生了什么 |
|---|---|
| 用户态 | 程序想读取一个变量 |
| 用户态 | 地址落在“堆”区域 |
| 用户态 | 查页表,得到物理地址 |
| 翻译中 | 逐级查找页表 |