存储管理-页目录自映射

关于页目录自映射的一些理解

页目录自映射的一些计算

前提

  • 在39位的三级页式存储系统中,虚拟空间大小为512GB,一个页表的大小是4KB,一个页表项是8B

  • 给出的PTbase为虚拟存储空间的虚拟地址,只有这样页表才会在内存(虚拟)中连续排布。

  • 页目录指的是一级页表。

  • 多级页表的映射是按照顺序进行的,即内存中划分的第一个页块由上一级页表的第一个页表项映射,而这个页表项所在的页表是由上一个页表的第一个页表项映射,依次类推。

    以二级页表为例

    7f63aa499c124b4c27cd4e1ef319fbc

其中第一个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

多级页表

根据以上的例子,我们就可以推广到多级页表中,只需要从最低一级的页表层层向上推进,就可以得到最终结果。其实看起来是有规律的。

Search by:GoogleBingBaidu