如何通过线性地址找到对应的pte,pde指针

我们首先明确一下这个问题
也就是说你需要通过线性地址(因为开启了分页,这里也可以叫虚拟地址,我们下文都将这样称呼,假设需要找到虚拟地址vaddr)vaddr来找到对应它的pte指针。

我们知道通过虚拟地址vaddr,我们经过页变化可以找到一个确定的物理地址phy_vaddr。现在我们想要找到的是指向这个phy_vaddr的pte指针,由于页表,页表项这些都是存在于内存中的,所以其对应的是实在的物理地址。于是我们现在的目的就是:通过一个虚拟地址得到物理地址。

嗯,听起来就让人很激动呀?

让我们先来回顾一下处理器处理 32 位地址的三个步骤:
(1)首先处理高 10位 的 pde索引,从而处理器得到页表物理地址。
(2)其次处理中间 10 位 的 pte 索引,进而处理器得到普通物理页的物理地址
(3)最后是把低 12 位 作为普通物理页的页内偏移地址,此偏移地址加上物理页的物理地址,得到的地址之和便是最终的物理地址,处理器到此物理地址上进行读写操作。

也就是说,我们要创造的一个新的虚拟地址 new vaddr,它经过处理器以上三个步骤的拆分处理,最终会落到 vaddr 自身所在的 pte 的物理地址上。

第一步:高10位的构成

那么分析到这里,我们就需要知道一个知识点:在页目录表中,最后一个目录表项填的是页目录表自己的地址。

所以我们在构建新的虚拟地址的时候,在高10位,我们可以直接让其指向页目录表的最后一位,然后本该得到页表物理地址的我们得到的还是页目录表的物理地址。

即图中Dir我们让其指向Page Directory的最后一项,然后我们得到的还是一个指向Page Directory的指针,而并不是指向Page Table的指针。

由于页目录表也是4KB,所以为4*2^10 = 2^12 = 1024,由于其实下标为0,所以最后一个表项为1023,对应的16进制为0x3ff,将其左移到高10位后,变为0xffc00000

第二步:中间10位的构成

现在我们的指针是指向页目录表的,如果按照之前的规则的话,我们此时看图,应该是Table与上一个结果相加,得到Physical Address Space的地址,而我们最终想得到的是指向物理地址Phy.Addr的那个指针,也就是我们想知道的pte指针,那么这一步我们就应该找到Page Table的地址。

所以,我们构造中间10位的时候,将原本的Dir作为偏移地址,这样,通过其与第一步我们得到的页目录表的地址相加,就可以得到指向Page Table的指针,也就是我们要得到的页表的地址。

于是中间10位的构成为图中Dir的值

第三步:低12位的构成

我们现在已经有了指向Page Table的指针了,那我们如何找到指向物理地址Phy.Addr的那个指针呢?我们可以想一下,初始的时候我们是通过加上Table的值得到指向物理地址Phy.Addr的指针的,所以我们此时也是将其作为低12位。

但是这里又有一个问题了,其为10位,而我们需要的是12位,怎么办呢?

我们通过将其左移2位,即可得到新的地址,即将其值乘以4即可。

同样pde指针也是同理,大家自己可以思考一下哦?
(answer : 当32位的地址中高20位位0xffff时,就表示访问到的是最后一个页目录项。即其高10位位0x3ff,中间10位也为0x3ff)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五月的天气

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

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

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

打赏作者

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

抵扣说明:

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

余额充值