标签:老师 一个 存储空间 虚拟 http 离散化 偏移量 地址 坑爹
页目录自映射中,老师一句“当然”让我想了两天,这两天又让我感受到了高中学数论时“xx的证明是平凡的”的恐惧。好不容易想明白,就用人话给自己再讲一遍吧。虽然有很多不必要的重复废话,但比“当然”要好懂多了。
假设虚拟地址空间为4GB(32位逻辑地址空间),分页时每个页的大小是4KB(即地址上用12位表示页内偏移量),每个页表项占用的空间是4B。
破除存储的连续性假设,即:我们只需要保证我们的存储空间在用虚拟地址访问的时候,虚拟地址是连续的,但是实际在内存中存放的物理位置可以是不连续的。
对于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的空间,但是我们成功地让页表也离散存储了,还是可以接受的
这个新的表,就叫做页目录,可以参考上图。
我们总想消除二级页表中第一级页表(即页目录)消耗的空间
考虑这么一件事:我们取一个页目录项,那么,这个页目录项记录了某张二级页虚实转化关系。
对于一页二级页,它有1K个表项,每个表项记录的是4GB虚拟地址空间中的某个4KB的虚实转化关系
所以说,一页二级页,记录了1K*4KB=4MB的虚拟地址和物理地址的转化关系
所以,一个页目录项,记录了4MB的虚拟地址和物理地址的转化关系
再考虑一件事情,如果我们把4GB虚拟地址空间从虚拟地址为0开始,每4MB切割一下,就能分成1K个部分
而我们的二级页表,大小正好为4MB!
所以,我们可以把我们的二级页表放在这1K个部分中的某个中。
还记得我们有多少个二级页吗?4MB/4KB=1K个。
所以,我们的每页二级页,都表示了这4GB虚拟地址按照4MB大小切割之后的某个4MB块的虚实转化关系
突然想到,我们的二级页表本身,也是保存在某个4MB的块里面的!
所以,有一页特殊的二级页,它记录了整个二级页表本身的虚实转化关系
用图形表述,大概是这样:
这个关系,恰好是我们的一级页表想做的事情
所以,我们可以直接拿这个特殊的二级页,来作为我们的一级页表
所以,就不需要额外的一级页表空间
这,就叫页目录自映射。
在本例子中,其表现为:当我们想用二级页表机制时,我们不需要单独的空间存储一级页表,而只需要在二级页表中找到(更准确的说,是计算出)某一特殊页,它就是我们的一级页表(页目录)。
标签:老师 一个 存储空间 虚拟 http 离散化 偏移量 地址 坑爹
原文地址:https://www.cnblogs.com/BUAA-Wander/p/12573208.html