读懂操作系统之虚拟内存页表(五)

在一个拥有32位的地址空间,4KB的页面(212),并且每个PTE为4个字节,那么页表大小为4MB(4 * 232 / 212),但若为64位地址空间,4KB的页面(212)且每个PTE为4字节,那么页表大小为16TB(4 * 264 / 212),由于页表常驻内存,占用内存会很大,所以必须对页表存储结构进行优化,这就是我们本文所要讲解的内容,常见的页表数据结构为多级页表(两级、三级等)、倒置页表、哈希页表,我们来一一进行分析。

多级页表

首先我们讲讲2级页表,然后通过2级页表延伸到多级页表,现假设有16KB(214)的地址空间,并且每页大小为64(26)字节,每个PTE为4字节,那么说明页表为1KB(4 * 214 / 26),若我们有64字节的页,那么将1KB可划分为16个64字节的页面,每个页面可容纳16个PTE,前面我们讲解到虚拟地址划分为虚拟页号(VPN)和虚拟页偏移量(VPO),但虚拟页偏移量已经固定,那么我们只能从VPN下手将其作为索引用于索引页表目录,那么我们该如何利用VPN来构建各个部分的索引呢?我们首先需要构建页表目录,根据上述假设,总共有256个PTE分布在16页上,页目录在页表的每页上需要一个条目,因此它具有16个条目, 最终我们需要VPN中的4位索引到目录中,这也就意味着我们需要使用VPN的前4位,如下所示:

读懂操作系统之虚拟内存页表(五)

我们从VPN提取出了页表目录索引(PDI),那么我们就可以计算出每个PDE(Page Directory Entry)的地址值:

PDEAddress = PageDirectoryBase + (PDIndex * sizeof(PDE))。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgssj.html