【1000个Linux内存知识-002】-缺页异常的本质是什么?谁缺页?如何根据多级页表和10-10-12分页机制的虚拟地址找到真正物理地址的?

缺页是缺什么页?谁缺页?

虚拟地址需要映射到物理页。缺页是指访问虚拟地址时候,对应的物理地址还没有映射到虚拟地址空间。

所以这里缺页缺的就是这个物理页。

缺页的人也就是VA(虚拟地址)。

也就是后图中某个页面找不到,或者说PTE里面存的是空的。

另外虚拟地址访问的机制是使用页表机制,所以也可以理解为页表缺页了,页表缺物理页了。

页表的C语言本质是多级指针,如果按照两级页表管理方式:PDE PTE offer的维度来看页表是如何访问的:(分析参考图)

- 页目录PDE 算是第一级指针,通过从CR3或者TTBR拿到页表基地址(也就是页表的第一个地址),找到一级页表那块内存地址,然后加上VA中的高10b的值(也就是pde的offset),得到存储二级页表地址的内存单元,根据内存单元的值中获取到PT所在。

- 类似的拿到PT的所在内存块的基地址之后,根据PTE的偏移,拿到存储PAGE地址的内存单元,根据内存单元的值获取到真正需要访问的页表的地址

- 然后使用页内偏移得到真正所指向的地址单元所在的地址

CR3才是真正的指针的基地址,其他的值都是偏移。所以VA从某种程度看就是3种偏移值,或者3段偏移值(32位为例子)。

真正拿内存地址存的值的操作,在C语言里面就是 *,比如:

* 0x12ff 1234

其中:*就是去取内存地址的值,0x12ff 1234就是虚拟地址

0x12ff 1234

其中:

PDE的10bit:

    0x12和ff中的高2位:0b(0001001011) 就是PDE的偏移,十进制是:(1+2+8+64)=75 所以在第75个偏移

PTE的10bit:

    0xff中的低6位和0x1234的高四位:0b(11 1111 0001),就是PE的偏移,十进制是:(1+16+32+64+128+256+512)=1009,所以在第1009个偏移(倒数第14个)

页内偏移的12bit:

    0x234 就是页内偏移 (4+3*16+2*256) = 564

所以0x12ff34的虚拟地址获取到对应物理地址的流程如下:

所以虚拟地址的本质能找到对应物理地址中对应值,虚拟地址只是个表项,根源还是靠CR3里面才能索引到。CR3又是根据每个task动态切换。所以每个task对应页表管理基地址才是溯源物理地址的核心。

所以对用户而言有VA就能找到物理地址吗?VA只是一个相对值,中流砥柱还是得靠CR3,CR3本质又是进程task struct里面管理的进程的页表。

所以再进一步看又回到了虚拟地址的本质是给每个进程用的,是每个进程的地址空间。进程地址空间管理要映射到物理地址,就靠这个页表管理,管理的所谓页表,就是物理页的页表。

最后,综述几个本质:

- 页表管理,其实核心是物理页表管理。缺页缺的是物理页

- 进程地址空间,才是需要页表管理的根源

- 进程管理页表的牛耳朵是存储的页表基地址(切换的时候存储到CR3寄存器)

所以执牛耳,而后牵VA就找到真正存储值的房间了。所谓的VA仅仅是存放房间的门牌号的盒子。

门牌号对应的房子建好了没?以及房子建在哪?

如果没有建好,就是缺页。

建好后把实际地址存到VA就是映射。(把所在单位范围存到VA的PTE里面,把在单位范围内的详细位置放到OFFSET中去)

背后也反应了如果把物理内存当做一个国家,是按照固定大小分配出去,然后用的地址需要用固定大小所在单位范围的地址,加上在单位范围内的偏移。

最后总结结论:

缺页是缺什么页?谁缺页?

缺页是指访问虚拟地址时候,对应的物理地址还没有映射到虚拟地址空间。缺的就是这个物理页。

如何根据VA找到真正物理地址的?

从进程上下文拿到页表基地址(PTBA),切换进程的时候存到CR3寄存器(intel平台),然后用PTBA结合VA里面的一级级的偏移找到对应页表,然后根据最后一个偏移找到VA对应的真正物理地址。

最后补充一句,为什么搞得这么麻烦(还要用缺页的逻辑插一脚到访问虚拟地址)?干嘛不直接在用之前就映射好?其本质是动态映射,动态映射的本质是按需映射,按需映射的本质是多级页表的核心作用--省内存的一种实现方式。动态映射与多级页表又是什么关系?多级页表真的比一级页表更省内存还是动态多级页表比一级页表更省内存?以后文章逐渐更新完善

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值