多级页表&页目录自映射学习记录_BUAAOS

多级页表&页目录自映射学习记录

在做虚拟内存管理时,有很多搞不懂的地方,所以在这里记录下来,以便日后查阅复习

多级页表

为什么采用多级页表

一级页表存在的问题

首先明确页表的概念,每个进程有一个页表,用于描述该进程占用的物理页面及逻辑排列顺序。页表记录虚页号和实页号的对应关系。页面大小固定 → \rightarrow 页面偏移量固定;虚页大小由逻辑地址决定,除去页面偏移量的固定位数,剩余的就是虚页号了。那么如果逻辑地址空间很大,虚页就会很多,意味着我们要一片大大的连续地址空间 来存储一张好大好大的页表,页表是要放在物理内存里的,我们向硬件要这么大的连续空间实在太为难硬件了。

那么我们该怎么解决这个问题呢???

于是引入了多级页表来分散物理页表空间。

多级页表理解

在老师的ppt中,对多级页表的描述只有一句话:

多级页表结构中,指令所给出的地址除偏移之外的个部分全是各级页表的页表号或页号,而各级页表中记录的全是物理页号,指向下级页表或真正的被访问页。

什么意思呢???一句一句分析来看看:

  • 指令所给出的地址除偏移之外的个部分全是各级页表的页表号或页号

    一级页表结构:逻辑地址 = 一级页表号(虚页号) + 偏移量

    二级页表结构:逻辑地址 = 一级页表号(页目录号) + 二级页表号(虚页号) + 偏移量

    也许这里理解起来有点困难,不如像这个例子:我们的教材是分章节的对吧,一级页表就就相当于一本只分节,没有章的书;而二级页表就相当于将节划分为不同的章,再在各个章里面分别编号。这里的虚页号就相当于节,页目录号就相当于章,有没有一点点懂了呀~

  • 各级页表中记录的全是物理页号

    一级页表结构:页表首地址由系统设定,并存在页表寄存器中,然后直接根据虚页号就能找到对应的表项读出物理页号,从而找到物理地址。

    二级页表结构:一级页表(页目录)的首地址仍是由系统设定,并存在页表寄存器中,然后根据一级页表号(页目录号)就可以在页目录中找到对应页目录项读出二级页号,这里的二级页号就是物理页号,然后根据虚页号在二级页表中找到对应的页表项读出物理页号,从而找到物理地址(配图食用效果更佳)

在这里插入图片描述
在这里插入图片描述

为什么说是物理页号呢??其实我也不清楚为什么要选择存物理页号,但是我认为这个设计相比直接存储物理地址是可以省空间的,这样就留出了一些空余位置来存放一些其他信息。但是为什么不存储虚页号呢?我还没搞懂,等搞懂再补充。。。。(我菜www)

有一个很重要的一点就是在我们实验的操作系统(32位 = 10 + 10 + 12)中,页目录表为4KB,每一个二级页也是4KB,物理页面大小也是4KB。

页目录自映射

示意图:

在这里插入图片描述

页目录:页表页的地址映射;1024个页表页逻辑连续,物理分散,逻辑-物理映射关系记录在页目录中。

关键点理解

  • 存储页表的4MB地址空间中是整个4GB虚拟地址空间的一部分,即这4MB在4GB中
  • 记录这4MB连续地址空间到物理地址空间的映射关系的是一个4KB的页目录
  • 记录这4MB连续地址空间到物理地址空间的映射关系的是一个4KB的页表页(4MB页表中的一员)

所以,页目录和页表页内容相同,页目录无需额外分配单独的存储空间,即有一个4KB的空间可以同时作为页目录和一个页表项,这个4KB的空间表示了整个页表的4MB地址空间与物理地址空间的映射关系。这就是自映射

第两点的理解:页目录记录着1024个页表页的对应物理页号,而这1024个页表页逻辑连续,就相当于页目录记录了着1024*4KB = 4MB的连续地址空间到物理空间的映射关系;

自映射:页目录中有一条PDE指向自身物理地址,这个地址就是页目录基址。

页目录自映射机制构建

PT_base:页表基址,应4M对齐

PD_base:页目录基址,PD_base = PT_base + PT_base >> 10

解释:页目录第一个页目录项一定也是记录着第一个页表页的页表项。 P T b a s e > > 12 PT_{base} >> 12 PTbase>>12表示第一个页表页的物理页号,一个页表项占4B空间,所以记录第一个页表页的页表项 相对页表的偏移为 ( P T b a s e > > 12 ) < < 2 = ( P T b a s e > > 10 ) (PT_{base}>>12)<<2 = (PT_{base}>>10) (PTbase>>12)<<2=(PTbase>>10),可得记录第一个页表页的页表项的地址为 P T b a s e + P T b a s e > > 10 PT_{base} + PT_{base}>>10 PTbase+PTbase>>10,这就是页目录第一个页目录项的地址,即页目录基址。

PDE_self_mapping:自映射目录表项, PDE_self_mapping = PT_base + PT_base >> 10 + PT_base >> 20

解释:已经得到页目录基址,只需计算出该页目录项相对于页目录基址的偏移。页目录项对应的是页表页,那么只需要计算当前页表页的页表页号即可。已经计算出来第一个页表页的页表项地址(即页目录基址)相对页表基址的偏移为 ( P T b a s e > > 10 ) (PT_{base}>>10) (PTbase>>10),一个页表页4KB,所以页目录的页表页号为 ( ( P T b a s e > > 10 ) > > 12 ) ((PT_{base}>>10)>>12) ((PTbase>>10)>>12),一个页表项4B,故偏移为 ( ( P T b a s e > > 10 ) > > 12 ) < < 2 ((PT_{base}>>10)>>12)<<2 ((PTbase>>10)>>12)<<2

在这里插入图片描述

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yeeman_Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值