两级页表

单级页表的问题

单级页表结构如下:
单级页表.png

考虑如下情况:
某计算机系统按字节寻址,支持32位的逻辑地址,采用分页存储管理,页面大小为4KB,页表项长度为4B。\(4KB=2^{12}B\),因此页内地址要用12位表示,剩余20位表示页号。

因此,该系统用户进程最多有\(2^{20}\)页,相应的,一个进程的页表中,最多会有\(2^{20}=1M=1,048,576\)个页表项,所以一个页表最大需要\(2^{20}*4B=2^{22}B\)共需要\(2^{22}/2^{12}=2^{10}\)个页框存储该页表

根据页号查询页表的方法:\(K号页对应的页表项存放位置=页表始址+K\times4\)
要在所有的页表项都连续存放的基础上才能用这种方法找到页表项

所以在这个系统中,需要专门给进程分配\(2^{10} = 1024\)个连续的页框来存放它的页表

根据局部性原理可知,很多时候,进程在一段时间内只需要访问某几个页面就可以正常运行了。因此没有必要让整个页表都常驻内存

总结来看,单级页表有以下两个问题:

  1. 页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框
  2. 没有必要让整个页表常驻内存,因为进程在一段时间内很可能只需要访问某几个特定的页面

两级页表解决单级页表连续存储

页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框

思路

将页表进行分组,使每个内存块刚好可以放入一个分组(比如上个例子中,页面大小4KB,每个页表项4B,每个页面可存放1K个页表项,因此每1K个连续的页表项为一组,每组刚好占一个内存块)再将各组离散地放到各个内存块中

同时,为了找到这些离散分布的页表,我们还需要一个类似目录的结构:要为离散分配的页表再建立一张页表,称为页表目录,或称外部页表,或称顶层页表

逻辑地址结构

单级页表

32位逻辑地址空间,页表项大小为4B,页面大小为4KB,则页内地址占12位

31-12 11-0
页号 页内偏移量

单级页表结构.png

二级页表

按上述解决思路进行拆分

两级页表结构的逻辑地址结构

31-22 21-12 11-0
一级页号 二级页号 页内偏移量

二级页表结构.png

地址变换

步骤 1:拆分逻辑地址

将逻辑地址 0x00401ABC 转换为二进制(32 位):

0000 0000 0100 0000 0001 1010 1011 1100

按两级页表结构拆分:

  • 一级页号(前 10 位):0000 0000 01 → 0x001(十进制 1)
  • 二级页号(中间 10 位):00 0000 0001 → 0x001(十进制 1)
  • 页内位移(后 12 位):1010 1011 1100 → 0xABC

步骤 2:查询一级页表(页目录)

  1. 计算一级页表项地址

    • 页目录起始地址:0x8000

    • 一级页号(0x001) × 页表项大小(4 字节):

      0x8000 + (0x001 × 4) = 0x8004
      
  2. 读取一级页表项内容

    • 从物理地址 0x8004 读取 4 字节数据 → 假设值为 0x5000
    • 解析:一级页表项指向 二级页表的物理起始地址为 0x5000

步骤 3:查询二级页表

  1. 计算二级页表项地址

    • 二级页表起始地址:0x5000

    • 二级页号(0x001) × 页表项大小(4 字节):

      0x5000 + (0x001 × 4) = 0x5004
      
  2. 读取二级页表项内容

    • 从物理地址 0x5004 读取 4 字节数据 → 假设值为 0x123(物理页框号)。
    • 解析:该页对应的物理页框号为 0x123(即物理页框起始地址为 0x123000,因为页大小为 4KB)。

步骤 4:生成物理地址

  • 物理页框基址0x123000(物理页框号 × 页大小)。

  • 页内位移0xABC

  • 最终物理地址

    0x123000 + 0xABC = 0x123ABC
    

两级页表解决冗余内存占用问题

没有必要让整个页表常驻内存,因为进程在一段时间内很可能只需要访问某几个特定的页面

思路

可以在需要访问页面时才把页面调入内存(虚拟存储技术)。

  • 可以在页表项中增加一个标志位,用于表示该页面是否已经调入内存
  • 若想访问的页面不在内存中,则产生缺页中断,然后将目标页面从外存调入内存

注意事项

  1. 若采用多级页表机制,则各级页表的大小不能超过一个页面分级依据.png

  2. 两级页表的访存次数分析(假设没有快表机构)

    • 第一次访存:访问内存中的页目录表
    • 第二次访存:访问内存中的二级页表
    • 第三次访存:访问目标内存单元
    • 这里可以注意到,多级页表提升了内存的使用效率,但是增加了访问次数,是一种时间换空间的做法

参考内容

posted @ 2025-05-24 14:42  Vcats  阅读(83)  评论(0)    收藏  举报