page fault-页异常流程

缺页异常(Page Faults) 和 Kernel Oops打印调用流程_痒痒挠963的博客-CSDN博客

阶段1:判断缺页异常是否发生在内核线程或原子上下文中(中断也属于一种原子上下文),是的话执行do_kernel_fault尝试修复或报段错误。

阶段2:判断是否是内核态访问用户地址空间的情况,是的话判断是否是指定的三种情况,是则报段错误。

阶段3:进入_do_page_fault, 查找异常地址所在的vm_area_struct域,并走表(page table walk)查找address对应PGD PUD PMD,最终找到PTE。

阶段4:进入handle_pte_fault(),判断PTE为空的话,说明用户空间申请了虚拟地址后第一次访问,尚未映射物理页面。在根据页面类型分别执行do_anonymous_page或do_fault。

阶段5:PTE非空表示已经建立过映射。判断PTE的present位是否为真,非真说明页面被swapping到磁盘上,随即执行do_swap_page。

阶段6:判断PTE_PROT_NONE是否为真,若为真执行do_numa_page产生页面迁移。

阶段7:判断错误类型,若是写类型的错误,再判断PTE的读写权限。只读的话说明页面是写保护的,调用do_wp_page。

阶段8: 为了兼容ARM32,ARM32体系架构的Hardware PTE中不支持DIRTY YOUNG等bit位,所以通过软件上配合缺页异常进行模拟。

------------------------------------------------------------------其他文章的扩展-------------------------------------------------------------------

由于造成内核空间和用户空间的page fault的原因不尽相同,因此其处理流程也有所区别。

对于用户空间,需要区分多种情况,page fault的处理显得更为复杂。

首先,访问的内存地址必须是合法的,所谓「合法」,就是该地址一定是落在进程的某个VMA区间内。

假设现在一个进程的地址空间分布如下,那么address B是合法的(good area),address A就是非法的(bad area)

猜你喜欢

转载自blog.csdn.net/y13182588139/article/details/125903900