提示:周伯阳同学已同意转载本帖内容,并保留所有权利。
线上和线下的答疑过程中,我们发现很多同学对页表自映射的理解存在一定问题,我们借用 2023 年 os 课程中周伯阳同学的帖子对 lab2 思考题中的三级页表进行一些说明。
前提
在 39 位的三级页式存储系统中,虚拟空间大小为 512GB,一个页表的大小是 4KB,一个页表项是 8B
给出的 PTbase 为虚拟存储空间的虚拟地址,只有这样页表才会在内存(虚拟)中连续排布。
页目录指的是一级页表。
多级页表的映射是按照顺序进行的,即内存中划分的第一个页块由上一级页表的第一个页表项映射,而这个页表项所在的页表是由上一个页表的第一个页表项映射,依次类推。
以二级页表为例
其中第一个 Page Table 的第一个页表项即为连续排布的页表项的第一个。
分析
二级页表
首先我们以一个二级页表引入,假设一个页表的大小是 4KB,一个页表项的大小是 4B
在虚拟地址空间中,这些页表项是连续排布的,我们暂且不谈这些页表项组成了多少页,我们现在知道的是,第 n 个页表项的映射的是虚拟地址空间中的第 n 个页。
首先我们以二级页表开始,给了出 PTbase,其实也就是虚拟内存中第一个页表项的地址。这个页表项是处于某一个页表中的,可以计算得到页号为:
PN(Page Number) = PTbase>>12
由上文可知,这个页号对应的页是由第 PN 个页表项映射得到的,即第一个页表项所在的页表由第 PN 个页表项映射得到,由页表的映射可知,第 PN 个页表项是页目录的第一个页表项,因此,这个页目录第一个页表项的地址就是页目录的基地址:
PDbase = PTbase+PN*4 = PTbase+PTbase>>10
那指向页目录的那一页表项的地址是什么呢?只需重复之前的动作,算出页目录所在的页号,得到映射到此页的页表项的项号,通过PTbase加上偏移量,即可得到映射到页目录自身的页目录项的地址:
(PDbase>>12)*4+PTbase=PTbase+PTbase>>10+PTbase>>20
三级页表
和二级页表一样,我们现在知道的是,第 n 个页表项的映射的是虚拟地址空间中的第 n 个页。
虚拟地址空间可以划分为: 239/212=227 页,即我们需要 227 个页表项进行对这些页的映射。
首先我们以三级页表开始,给了出 PTbase,其实也就是虚拟内存中第一个页表项的地址。这个页表项是处于某一个页表中的,可以计算得到页号为:
PN(Page Number) = PTbase>>12
由上文可知,这个页号对应的页是由第 PN 个页表项映射得到的,即第一个页表项所在的页表由第 PN 个页表项映射得到,由页表的映射可知,第 PN 个页表项是第一个二级页表的第一个页表项,因此,这个二级页表第一个页表项的地址就是该二级页表的基地址:
页中间目录基地址(page middle directory) 即二级页表的基地址PMDbase:
PMDbase = PTbase + PN*8 = PTbase + PTbase>>9
这个二级页表是由一级页表即页全局目录项(page global directory entry)PGDE的第一个页表项映射得到的,现在我们只需得到PMD所在的页表号,即可得到一级页表的第一页表项的项号,由此我们可以得到一级页表的基地址:
PGDEbase = (PMDbase>>12)*8 + PTbase = PTbase + PTbase>>18 + PTbase>>9
重复上面的步骤,我们可以算出一级页表所处的页表号,由此得到映射到该页表的页表项项号,通过 PTbase 加上偏移量,即可得到映射到页目录自身的页目录项的地址:
(PGDEbase >>12)*8+PTbase = PTbase + PTbase>>27 + PTbase>>18 + PTbase>>9
多级页表
根据以上的例子,我们就可以推广到多级页表中,只需要从最低一级的页表层层向上推进,就可以得到最终结果。其实看起来是有规律的。
最后修改于:
最后回复于:
回复主题帖
我想问下 \(PT_{base}\) 的值可以由什么确定吗?我的意思是,它的值是否也满足某个公式?
最后修改于:2024-04-15 21:42:11
同学你好,这个选取基本是任意的,只要保证对齐即可。
最后修改于:2024-04-16 13:00:22