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


CSDN趣味图解 | 什么是缺页错误 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错误中断进程直接挂掉 。

CSDN趣味图解 | 什么是缺页错误 Page Fault?
本文插图
5.3 缺页错误出现的原因不同类型的Page Fault出现的原因也不一样 , 常见的几种原因包括:
  • 非法操作访问越界这种情况产生的影响也是最大的 , 也是Coredump的重要来源 , 比如空指针解引用或者权限问题等都会出现缺页错误 。
  • 使用malloc新申请内存malloc机制是延时分配内存 , 当使用malloc申请内存时并未真实分配物理内存 , 等到真正开始使用malloc申请的物理内存时发现没有才会启动申请 , 期间就会出现Page Fault 。
  • 访问数据被swap换出物理内存是有限资源 , 当运行很多进程时并不是每个进程都活跃 , 对此OS会启动内存页面置换将长时间未使用的物理内存页帧放到swap分区来腾空资源给其他进程 , 当存在于swap分区的页面被访问时就会触发Page Fault从而再置换回物理内存 。
>>> 敲黑板 划重点 本段小结:<<<触发Page Fault的原因可能有很多 , 归根到底也只有几种大类:
1. 如使用共享内存区域 , 没有存储VA->PA的映射但是存在物理页帧的软缺页错误 , 在Page Table/TLB中建立映射关系即可 。
2. 访问的地址在物理内存中确实不存在 , 需要从磁盘/swap分区读入才能使用 , 这种性能影响会比较大 , 因为磁盘太慢了 , 尽量使用高性能的SSD来降低延时 。
3. 访问的地址内存非法 , 缺页错误会升级触发SIGSEGV信号结束进程 , 这种属于可以导致进程挂掉的一种缺页错误 。
CSDN趣味图解 | 什么是缺页错误 Page Fault?
本文插图
全文总结 本文粗浅地和大家一起学习了Page Fault的相关知识点 , 包括Linux虚拟地址和物理地址的关系、CPU获取内存数据的过程、MMU和TLB&页表的协同配合、缺页异常产生的原因和分类处理 。
本文并没有对MMU的内部机制、内核态&用户态缺页异常、缺页异常处理函数等内容进行展开 , 主要是因为这部分内容相对晦涩 , 还得靠自己深入研究 。
本文旨在把火点燃而不是把桶填满 , 对于文中相关知识点 , 欢迎交流沟通学习 。
【CSDN趣味图解 | 什么是缺页错误 Page Fault?】
你点的每个“在看” , 我都认真当成了喜欢


推荐阅读