页表

页表自映射

本文假定读者对页式存储管理有基础的了解

禁用一级二级页表

我们在描述页式存储管理时,引入了一级页表,二级页表,页目录等很多本质相同但形式不一样的概念,我认为这些概念无助于对页式存储管理的理解,故尝试在这一篇博客中抛弃

同时,我们只需要知道两个概念:页表页表项

对页表影响最大的其实只有:页总数,每一页可以存储多少个页表项

一个的例子

image-20230401202121284

规则1

一个页表占据一页,页表总是连续存在的

解释

的配置中,总共需要张页表,也就是需要4页来存储页表,那么应该是哪4页来存储页表呢?这是不确定的,唯一确定的是,这4页应该连续地排在一起,例如:

image-20230401202514187

以上三种情况均有可能

规则2

页表到物理页的映射是固定的,是线性的

解释

image-20230401204020982

即第0个页表映射到物理页的第0~3页,第1个页表映射到物理页的第4~7页......

可以发现不同的页表排布方式,会导致有一个feature时有时无:左图所示情况,第一个页表映射的区域全是页表所在区,而右图则不存在这个特性。在实际情况下,我们更愿意让左图的情况发生,这会带来诸多好处,所以页表段(一段连续的存储页表的空间)的起始地址至少应该是 的倍数(但其实还有一个更严格的条件,即起始地址是的倍数,其中的含义是级页表)

概览

以图中的箭头为边,我们进行一个DAG编号

image-20230401205115962

type-0页就是普通页,type-1页是存放了指向普通页的页表的页,type-2页是存放了指向指向普通页的页表的页表的页

观察黑色加粗的描述,很有趣的情况出现了,这其实就是一个二级页表,type-2既是页目录,也可以说是一个恰好指向的数据都是type-1页的页表

要让完美的这么一个页表结构出现还是需要一点点约束的,首先得有来保证不会有页表项的浪费,其次是,用来保证一定可以满足规则2(同时的大小暗示了这是一个级页表)

一个的例子

image-20230401212156451

页表是如何拓展的

假设我们现在只知道,并不确定这是一个几级页表,假设它是一个级页表,在我们逐步增加的过程中,设为页目录上边的页数量与下边的页数量的比值,容易发现每次增加上边的页数量与下边的页数量的比值不会发生改变,永远维持在

显然推广到一般情况也成立

image-20230401213732299

那么假设,总页数为

如何计算页目录所处的页呢?

如何计算映射到页目录的页表项呢?

练习

image-20230401214238818

易知

页表段的长度为

总空间为,页表段的范围是

所以页目录所处页为

所以最终地址为