CSDN趣味图解 | 什么是缺页错误 Page Fault?( 二 )


CSDN趣味图解 | 什么是缺页错误 Page Fault?
本文插图
MMU在2级页表的情况下进行了2次检索和1次读写 , 那么当页表变为N级时 , 就变成了N次检索+1次读写 。
可见 , 页表级数越多查询的步骤越多 , 对于CPU来说等待时间越长 , 效率越低 , 这个问题还需要优化才行 。
>> 本段小结 敲黑板 划重点 <<1.页表存在于进程的内存之中 , MMU收到虚拟地址之后查询Page Table来获取物理地址 。
2.单级页表对连续内存要求高 , 于是引入了多级页表 , 但是多级页表也是一把双刃剑 , 在减少连续存储要求且减少存储空间的同时降低了查询效率 。
4.2 MMU和TLB的故事MMU和TLB的故事就这样开始了...
CPU觉得MMU干活虽然卖力气 , 但是效率有点低 , 不太想继续外包给它了 , 这一下子把MMU急坏了 。
CSDN趣味图解 | 什么是缺页错误 Page Fault?
本文插图
MMU于是找来了一些精通统计的朋友 , 经过一番研究之后发现CPU用的数据经常是一小搓 , 但是每次MMU都还要重复之前的步骤来检索 , 害 , 就知道埋头干活了 , 也得讲究方式方法呀!
找到瓶颈之后 , MMU引入了新武器 , 江湖人称快表的TLB , 别看TLB容量小 , 但是正式上岗之后干活还真是不含糊 。
CSDN趣味图解 | 什么是缺页错误 Page Fault?
本文插图
当CPU给MMU传新虚拟地址之后 , MMU先去问TLB那边有没有 , 如果有就直接拿到物理地址发到总线给内存 , 齐活 。
TLB容量比较小 , 难免发生Cache Miss , 这时候MMU还有保底的老武器页表 Page Table , 在页表中找到之后MMU除了把地址发到总线传给内存 , 还把这条映射关系给到TLB , 让它记录一下刷新缓存 。
CSDN趣味图解 | 什么是缺页错误 Page Fault?
本文插图
TLB容量不满的时候就直接把新记录存储了 , 当满了的时候就开启了淘汰大法把旧记录清除掉 , 来保存新记录 , 彷佛完美解决了问题 。
CSDN趣味图解 | 什么是缺页错误 Page Fault?
本文插图
在TLB和Page Table加持之下 , CPU感觉最近MMU比较给力了 , 就问MMU怎么做到的?MMU就一五一十告诉了CPU 。
CPU说是个不错的路子 , 随后说出了自己的建议:TLB还是有点小 , 缓存不命中也是经常发生的 , 要不要搞个大的 , 这样存储更多访问更快?
MMU一脸苦笑说道大哥TLB很贵的 , 要不你给涨点外包费?话音未落 , CPU就说涨工资是不可能了 , 这辈子都不可能了 。
>>>高能预警 敲黑板 本段小结<<<1. CPU要根据用户进程提供的虚拟地址来获取真实数据 , 但是它并不自己做而是交给了MMU 。
2. MMU也是个聪明的家伙 , 集成了TLB来存储CPU最近常用的页表项来加速寻址 , TLB找不到再去全量页表寻址 , 可以认为TLB是MMU的缓存 。
3. TLB的容量毕竟有限 , 为此必须依靠Page Table一起完成TLB Miss情况的查询 , 并且更新到TLB建立新映射关系 。
缺页异常Page Fault大揭秘 设想CPU给MMU的虚拟地址在TLB和Page Table都没有找到对应的物理页帧或者权限不对 , 该怎么办呢?
没错 , 这就是缺页异常Page Fault , 它是一个由硬件中断触发的可以由软件逻辑纠正的错误 。
CSDN趣味图解 | 什么是缺页错误 Page Fault?
本文插图
5.1 PageFault , 它来了假如目标内存页在物理内存中没有对应的页帧或者存在但无对应权限 , CPU 就无法获取数据 , 这种情况下CPU就会报告一个缺页错误 。
由于CPU没有数据就无法进行计算 , CPU罢工了用户进程也就出现了缺页中断 , 进程会从用户态切换到内核态 , 并将缺页中断交给内核的 Page Fault Handler 处理 。


推荐阅读