什么是缺页错误 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信号结束进程,这种属于可以导致进程挂掉的一种缺页错误 。

什么是缺页错误 Page Fault?

文章插图
什么是缺页错误 Page Fault?

文章插图
 
全文总结本文粗浅地和大家一起学习了Page Fault的相关知识点,包括Linux虚拟地址和物理地址的关系、CPU获取内存数据的过程、MMU和TLB&页表的协同配合、缺页异常产生的原因和分类处理 。
【什么是缺页错误 Page Fault?】本文并没有对MMU的内部机制、内核态&用户态缺页异常、缺页异常处理函数等内容进行展开,主要是因为这部分内容相对晦涩,还得靠自己深入研究 。
本文旨在把火点燃而不是把桶填满,对于文中相关知识点,欢迎交流沟通学习 。




推荐阅读