超标量处理器设计——第三章_虚拟存储器
参考《超标量处理器》姚永斌著
3.2 地址转换
- 分页机制, 虚拟地址划分以页为单位(page),典型大小为4KB
- 物理地址也有页,与虚拟地址的页大小相同,但是称为帧(frame)
- 虚拟地址: VA ; 物理地址:PA
- VA由两部分组成:
- VPN(Virtual Page Number), 用来索引虚拟页
- Page offset, 页内偏移,对于4KB的页来说偏移需要12位
- PA也由两部分组成:
- PFN(Physical Frame Number), 用来索引物理页
- Page offset, 物理页内偏移,一般与虚拟地址的offset相同
- MMU负责VA到PA的转换

3.2.1 单级页表
- 当处理器只需要的页不在物理内存中,就发生了Page Fault; 处理该异常需要ms级别,需要尽量避免
- 页表(Page Table,PT)用来存储VA到PA的映射关系。这样VA的一个页就可以放在物理地址的任意一个帧上了
- 页表放在物理内存中,每个进程都有自己的页表
- 页表寄存器(Page Table Register,PTR)用来索引页表
- PTR和VA寻址页的过程如下:

- 单级页表中,VPN只有20位,也就是说一个页表的表项数就是2^20也就是1M, 每个表项存储的是PFN,也就是18bit,但是物理内存数据位宽是32bit,所以剩下的14bit就可以用来存有效位,页读写属性等
- 因此单级页表大小为1M*4B=4MB大小,显然是很庞大的,如果每个进程都有一个4MB的页表,那…
- 单级页表访问内存(两次访问物理内存):
- 根据PTR定位物理内存中的页表
- 根据VPN访问页表中的PFN
- 根据PFN访问物理内存
-
3.2.2 多级页表
- 单级的页表一张就要4MB的巨大空间,而且还要是连续的
- 多级页表将单级页表进行进一步划分, 从而实现更小的子页, 也不需要巨大的连续的地址空间
- 下面是一个多级页表的案例:

- 用PTR索引到第一级页表在物理内存中的位置
- 用VA的p1部分寻址第一级页表中的PFN, 根据一级页表PFN寻址第二级页表
- 用VA的p2部分寻址第二级页表中的PFN, 根据二级页表PFN寻址最终的页
- 操作系统动态地创建一二级页表: 当p1发生变化时, 会创建新的二级页表, p2变化时则不会创建新的页表
- 一个一级和二级页表都有2^10个表项, 因为物理内存是32位, 所以大小均为4KB, 正好可以放进物理内存的一个页内
- 一级页表4KB大小一般是不可避免的, 而二级页表则是根据需求逐步创建的, 操作系统会尽量让虚拟地址集中, 减少二级页表的开辟
- 易于扩展, 当处理器增加到64位, 可以通过增加级数来减少页表的占用:

- 虚拟内存的优点:
- 让每个进程都能独占地址空间
- 方便管理物理内存, 可以将连续的虚拟地址映射到不连续的物理地址, 从而减小物理内存的碎片
- 为所有进程分配的总物理内存之和可以大于实际的物理内存大小, 因为有些页可能存在磁盘的swap区
- 可以实现管理每个页的访问权限
3.2.3 Page Fault
- 一个进程的虚拟地址访问页表时, 发现对应的PTE有效位为0, 表示这个页还没有放到物理