对于页目录自映射的理解

Posted buaa-wander

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于页目录自映射的理解相关的知识,希望对你有一定的参考价值。

页目录自映射中,老师一句“当然”让我想了两天,这两天又让我感受到了高中学数论时“xx的证明是平凡的”的恐惧。好不容易想明白,就用人话给自己再讲一遍吧。虽然有很多不必要的重复废话,但比“当然”要好懂多了。

1.基本假设

假设虚拟地址空间为4GB(32位逻辑地址空间),分页时每个页的大小是4KB(即地址上用12位表示页内偏移量),每个页表项占用的空间是4B。

2.页式存储的动机

破除存储的连续性假设,即:我们只需要保证我们的存储空间在用虚拟地址访问的时候,虚拟地址是连续的,但是实际在内存中存放的物理位置可以是不连续的。

3.二级页表

对于4GB的虚拟地址空间,我们要把它映射到物理地址空间里面去。

如果用页式存储,则这4GB可以分成1M个页,完成了对4GB空间的一个“切割”过程。(4GB/4KB=1M)

然后,我们想知道,虚拟地址空间中的某个页,在物理空间中应该放在哪里。

这时候,我们就需要用一个表来记录虚拟页与物理页的对应关系了。

由于有1M个虚拟页,对于里面的每个虚拟页,我们都要消耗空间记录它对应哪个物理页(当然,不一定真的分配物理页),由基本假设知,每记录一个对应关系,就要消耗4B空间(每条记录就是一个页表项),所以总共消耗4MB空间来记录虚拟页与物理页的对应关系,如图所示:
技术图片

如果不做其他处理,在内存中,我们刚才那张记录表本身还得是连续存储的

我们觉得4MB的记录表如果占用连续的内存的话,也太坑爹了,所以,我们想让这个4MB的记录表也离散化存储,所以我们利用多级页表。

对4MB的对应关系表进行切割,可以分成1K个页(4MB/4KB=1K)如图所示:
技术图片

想把这1K个页离散地存储在物理内存中,我们就又需要一张表来记录这1K个虚拟页与物理页的对应关系

由于有1K个页,所以有1K条对应关系要记录,这个新增的表有1K个表项

每个表项占用4B,所以这张新增的表又占用了4KB的空间。

虽然多占用了4KB的空间,但是我们成功地让页表也离散存储了,还是可以接受的
这个新的表,就叫做页目录,可以参考上图。

4.页目录自映射

我们总想消除二级页表中第一级页表(即页目录)消耗的空间

考虑这么一件事:我们取一个页目录项,那么,这个页目录项记录了某张二级页虚实转化关系。

对于一页二级页,它有1K个表项,每个表项记录的是4GB虚拟地址空间中的某个4KB的虚实转化关系

所以说,一页二级页,记录了1K*4KB=4MB的虚拟地址和物理地址的转化关系

所以,一个页目录项,记录了4MB的虚拟地址和物理地址的转化关系

再考虑一件事情,如果我们把4GB虚拟地址空间从虚拟地址为0开始,每4MB切割一下,就能分成1K个部分

而我们的二级页表,大小正好为4MB!

所以,我们可以把我们的二级页表放在这1K个部分中的某个中。

还记得我们有多少个二级页吗?4MB/4KB=1K个。

所以,我们的每页二级页,都表示了这4GB虚拟地址按照4MB大小切割之后的某个4MB块的虚实转化关系

突然想到,我们的二级页表本身,也是保存在某个4MB的块里面的!

所以,有一页特殊的二级页,它记录了整个二级页表本身的虚实转化关系

用图形表述,大概是这样:
技术图片

这个关系,恰好是我们的一级页表想做的事情

所以,我们可以直接拿这个特殊的二级页,来作为我们的一级页表

所以,就不需要额外的一级页表空间

这,就叫页目录自映射。

在本例子中,其表现为:当我们想用二级页表机制时,我们不需要单独的空间存储一级页表,而只需要在二级页表中找到(更准确的说,是计算出)某一特殊页,它就是我们的一级页表(页目录)。

以上是关于对于页目录自映射的理解的主要内容,如果未能解决你的问题,请参考以下文章

linux启动流程的理解

对于子进程生成过程的理解

还没彻底搞懂?我自罚三杯!

Linux 内核 内存管理内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 )

分页机制-看了这篇文章还没彻底搞懂?我自罚三杯!

理论+实例,带你掌握Linux的页目录和页表