1.硬件中的分页
1.1 页实现原理
- MMU的分页管理单元将线性地址转换成物理地址
- page
- 将线性地址空间划分成固定长度的管理单元;
- 内核为page 指定物理地址和访问权限,而不是整个线性地址
-
page frame
将整个物理地址空间划分成固定长度的管理单单元; -
page table
1)负责映射线性地址到物理地址
2)位于内存中
3) 在分页单元使能前,初始化page table
1.2 两级分页方案的实现
- 减少每个进程的页表需要的内存的数量
- 线性地址划分成三部分
字段 | 位数 |
---|---|
Directory | 10 bit |
Table | 10 bit |
offset | 12 bit |
-
两级页表
页目录-包含1024 entry
页表-包含1024个entry -
每个进程分配了一个页目录
页目录的物理地址存放在cr3 控制寄存器中 -
线性地址到物理地址的转换过程
1)线性地址的Directory 部分,确定cr3 指向的页目录页表中的entry,这个entry 指向合适的page table;
2)线性地址的Table 部分,确定1)中的page table 中的entry,这个entry 包含page frame的物理地址
3)线性地址的Offset 确定在page frame中的偏移
image.png
-
例子
1)线性地址0x20021406
2)线性地址的Directory 0x80部分选择页目录的entry 0x80, 这个entry指向与这个进程内存页的叶表;
3)线性地址的Table部分0x21用于选择页表的entry 0x21,这个entry指向与这个进程page的page frame;
4)线性地址的Offset 部分0x406用于选择page frame 的偏移0x406.
5)若页表的entry 0x21 的present flag 被清除了,那么这个page 不在内存中;分页管理单元会发出页错误异常。
image.png
1.3 扩展分页
- page frame 大小为4MB,而不是4KB
- 用于将大的连续的线性地址范围转换成对应的物理地址范围
- 不需要中间的叶表,节省内存
- 通过页目录entry. 的page size flag 来使能
字段 | 位数 |
---|---|
Directory | 10 bit |
Offset | 22 bit |

1.4 物理地址扩展分页机制(PAE)
- 可访问内存空间从4GB到64GB,扩展32bit 物理地址访问最大4GB空间的限制;
- 硬件增加地址线引脚从32个到36个
- cr4 PAE flag 激活PAE 功能
- 有两级分页方案改为三级方案,高2bit 引用PDPT
- 页目录和页表的entry 从32bit,增加到64bit, 这样他们的基地址从20bit扩展到24bit
名称 | 用途 |
---|---|
cr3 | 指向PDPT |
bits 31-30 | 指向PDPT中的entry1-4 |
bits 29-21 | 指向页目录中的entry 1-512 |
bits 20-12 Offset | 指向页表中的entry 1-512 |
bits 11-0 Offset | 4KB 中的偏移 |

- 页目录中PS flag 激活2MB 的page
名称 | 用途 |
---|---|
cr3 | 指向PDPT |
bits 31-30 | 指向PDPT中的entry1-4 |
bits 29-21 | 指向页目录中的entry 1-512 |
bits 20-0 Offset | 2MB 中的偏移 |
1.5 64位架构的分页机制
- x86 64位地址只使用其中的48位;
-
在32位两级分页的基础之上增加两级分页;
image.png
1.6 TLB
- 缓存page table 的entry, 加速线性地址的转换的cache,
- 每个CPU 有自己的TLB
- 当一个CPU 的cr3 修改后,硬件自动invalidate 本地TLB 的所有entry
- 第一次访问线性地址,物理地址通过访问内存中的page table 计算而来,并存到TLB 中
- 后续的访问通过TLB
2.分页在Linux 中的实现
- 为32bit 和64bit 架构采用公共的分页模型
- 2.6.10,采用三级分页,2.6.11,采用四级分页
- 四种页表:
页表类型 | 用途 |
---|---|
page global directory | 包含多个page Upper directory的地址 |
page Upper directory | 包含多个page Middle directory的地址 |
page Middle directory | 包含多个page Table的地址 |
page Table | 包含多个page table entry |
-
线性地址划分成五部分
image.png
-
分页
-
32位架构 + PAE disable 采用两级分页
1)通过set 成0bit, 去掉Page upper directory 和Page Middle directory)
2)page Upper 和 page Middle table 只有一个entry -
32位架构 + PAE enable 采用三级分页
1)page global 就是PDPT
2)去掉Page upper
3)Page Middle 对应Page directory -
64位架构
三级或四级依靠HW
image.png
-
-
每个进程有自己的一套页表
1)进程切换时,保存当前的cr3 到当前的进程描述符中,加载下一个要执行的进程的描述符的cr3
2)这样分页管理单元引用正确的一套页表
网友评论