2025-05-04
Status: #idea
Tags: rCore ch4
1. 基础概念
1.1 页式存储基本原理
页式存储将内存分成一小段一小段的固定大小单元:
- 虚拟内存中的单元称为页面(Page)
- 物理内存中的单元称为页帧(Frame)
1.2 地址组成
虚拟地址由两部分组成:
- 虚拟页号(VPN, Virtual Page Number)
- 页内偏移(Offset)
物理地址由两部分组成:
- 物理页号(PPN, Physical Page Number)
- 页内偏移(Offset)
其中,页内偏移的位数决定了页面大小,例如:
- 偏移量为12位时,页面大小为 2^12 = 4KB
- 在48位虚拟地址系统中,VPN为36位(48-12)
2. 地址转换原理
2.1 基本转换过程
虚拟地址转换为物理地址的核心是:保持偏移量不变,将VPN映射为PPN。
2.2 页表的作用
页表是维护VPN到PPN映射关系的数据结构:
- 输入:虚拟页号(VPN)
- 输出:页表项(PPN + 标志位)
- 页表项大小通常为64位(8字节)
3. 页表实现面临的挑战
3.1 页表大小问题
如果为整个虚拟地址空间创建完整页表:
- 以27位VPN为例,需要 2^27 个页表项
- 每个页表项8字节,完整页表需要 2^27 × 8B = 1GB 空间
- 这对于每个程序都占用1GB内存来说代价太高
3.2 可能的解决方案
方案一:缩小虚拟地址空间
- 将虚拟地址空间从512GB缩减至32GB(VPN从27位减至23位)
- 页表大小减少到64MB
- 问题:多个程序运行时(如200个进程)总页表空间仍达12.5GB,效率低下
方案二:按需分配页表项
- 只为程序实际使用的虚拟地址创建页表项
- 这是更为实用的解决方案
4. 页表优化策略
4.1 页表存储优化
当需要进行地址转换时:
- 操作系统将页表项存储在物理页帧中
- 一个4KB页帧可存储512个页表项(4KB/8B=512)
- 应用使用4MB空间需要1024个页表项,占用2个物理页帧
4.2 查找效率优化
应用隔离
- 将不同应用的页表项存储在不同页帧中
- 优点:
- 减少遍历次数
- 无需为每个页表项添加应用标记
- 只需为页帧添加应用标记
- 内存浪费问题:
- 每个应用专用页帧最多浪费2MB空间
- 200个应用约400MB,远小于完整页表方案
4.3 索引优化
利用虚拟页号的位结构进行优化:
- 一个页帧可存储512(2^9)个页表项
- 使用VPN的后9位作为页帧中的索引
- 剩余27位用于定位不同的页帧
5. 多级页表实现
5.1 多级页表原理
将36位VPN分为4部分,每部分9位:
- 第4级(最高9位):用于索引四级页表
- 第3级(次高9位):用于索引三级页表
- 第2级(次低9位):用于索引二级页表
- 第1级(最低9位):用于索引一级页表,指向最终PPN
5.2 多级页表查找过程
- 操作系统为应用创建四级页表,并分配页帧
- 根据四级页表项查找三级页表
- 根据三级页表项查找二级页表
- 根据二级页表项查找一级页表
- 一级页表项直接指向物理页帧号(PPN)
- 完成地址转换
5.3 多级页表的空间效率
- 初始阶段:4个页帧(16KB)
- 应用程序使用S空间时,页表占用约 S/512 的空间
- 对于小型应用,页表空间远小于完整页表方案
6. 总结
-
分离地址组成部分:
- 将虚拟地址分为虚拟页号(VPN)和页内偏移(Offset)
- 在我们的例子中,48位虚拟地址分为36位VPN和12位偏移量
-
多级页表查找:
- 取VPN的最高9位,作为四级页表的索引,找到三级页表的物理地址
- 取VPN的次高9位,作为三级页表的索引,找到二级页表的物理地址
- 取VPN的次低9位,作为二级页表的索引,找到一级页表的物理地址
- 取VPN的最低9位,作为一级页表的索引,找到最终的物理页帧号(PPN)
-
合成物理地址:
- 将找到的物理页帧号(PPN)和原始的页内偏移(Offset)组合
- 物理地址 = (PPN << 12) | Offset
-
访问物理内存:
- 使用组合得到的物理地址直接访问物理内存
- 完成数据读写操作