什么是缺页错误 Page Fault?( 二 )


2.单级页表对连续内存要求高,于是引入了多级页表,但是多级页表也是一把双刃剑,在减少连续存储要求且减少存储空间的同时降低了查询效率 。
 
4.2 MMU和TLB的故事MMU和TLB的故事就这样开始了...
CPU觉得MMU干活虽然卖力气,但是效率有点低,不太想继续外包给它了,这一下子把MMU急坏了 。

什么是缺页错误 Page Fault?

文章插图
MMU于是找来了一些精通统计的朋友,经过一番研究之后发现CPU用的数据经常是一小搓,但是每次MMU都还要重复之前的步骤来检索,害,就知道埋头干活了,也得讲究方式方法呀!
找到瓶颈之后,MMU引入了新武器,江湖人称快表的TLB,别看TLB容量小,但是正式上岗之后干活还真是不含糊 。
什么是缺页错误 Page Fault?

文章插图
当CPU给MMU传新虚拟地址之后,MMU先去问TLB那边有没有,如果有就直接拿到物理地址发到总线给内存,齐活 。
TLB容量比较小,难免发生Cache Miss,这时候MMU还有保底的老武器页表 Page Table,在页表中找到之后MMU除了把地址发到总线传给内存,还把这条映射关系给到TLB,让它记录一下刷新缓存 。
什么是缺页错误 Page Fault?

文章插图
TLB容量不满的时候就直接把新记录存储了,当满了的时候就开启了淘汰大法把旧记录清除掉,来保存新记录,彷佛完美解决了问题 。
什么是缺页错误 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?

文章插图
 
缺页异常Page Fault大揭秘设想CPU给MMU的虚拟地址在TLB和Page Table都没有找到对应的物理页帧或者权限不对,该怎么办呢?
没错,这就是缺页异常Page Fault,它是一个由硬件中断触发的可以由软件逻辑纠正的错误 。
什么是缺页错误 Page Fault?

文章插图
 
5.1 PageFault,它来了假如目标内存页在物理内存中没有对应的页帧或者存在但无对应权限,CPU 就无法获取数据,这种情况下CPU就会报告一个缺页错误 。
由于CPU没有数据就无法进行计算,CPU罢工了用户进程也就出现了缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的 Page Fault Handler 处理 。
什么是缺页错误 Page Fault?

文章插图
缺页异常并不可怕,只要CPU要的虚拟地址经过MMU的一番寻址之后没有找到或者找到后无权限,就会出现缺页异常,因此触发异常后的处理流程将是重点内容 。
 
5.2 缺页错误的分类处理缺页中断会交给PageFaultHandler处理,其根据缺页中断的不同类型会进行不同的处理:
  • Hard Page Fault也被称为Major Page Fault,翻译为硬缺页错误/主要缺页错误,这时物理内存中没有对应的页帧,需要CPU打开磁盘设备读取到物理内存中,再让MMU建立VA和PA的映射 。
  • Soft Page Fault也被称为Minor Page Fault,翻译为软缺页错误/次要缺页错误,这时物理内存中是存在对应页帧的,只不过可能是其他进程调入的,发出缺页异常的进程不知道而已,此时MMU只需要建立映射即可,无需从磁盘读取写入内存,一般出现在多进程共享内存区域 。
  • Invalid Page Fault翻译为无效缺页错误,比如进程访问的内存地址越界访问,又比如对空指针解引用内核就会报segment fault错误中断进程直接挂掉 。

什么是缺页错误 Page Fault?


推荐阅读