page fault in nopaged area 怎么修复?

page fault in nopaged area  怎么修复?

内核实现只是在进程的地址空间建立好了vma区域,并没有实际的虚拟地址到物理地址的映射操作。这部分就是在Page Fault异常错误处理中实现的。

Linux内核中的Page Fault异常处理很复杂,涉及的细节也很多,malloc/mmap的物理内存映射只是它的一个子集功能,下图大概涵盖了出现Page Fault的情况:

下边就开始来啃啃硬骨头吧。

好文推荐:

字节终面:CPU 是如何读写内存的?

全网最牛Linux内核分析--Intel CPU体系结构

一文让你读懂Linux五大模块内核源码,内核整体架构设计(超详细)

嵌入式前景真的好吗?那有点悬!

一文教你如何使用GDB+Qemu调试Linux内核

Linux内核必读五本书籍(强烈推荐)

全网独一无二Linux内核Makefle系统文件详解(一)(纯文字代码)

带你深度了解Linux内核架构和工作原理!

如何读懂GDB底层实现原理(从这几点入手~)

一文彻底理解Memory barrier(内存屏障)

一篇文带你搞懂,虚拟内存、内存分页、分段、段页式内存管理(超详细)

Page Fault的异常处理,依赖于体系结构,因此有必要来介绍一下Arm64的处理。代码主要参考:arch/arm64/kernel/entry.S。

Arm64在取指令或者访问数据时,需要把虚拟地址转换成物理地址,这个过程需要进行几种检查,在不满足的情况下都能造成异常:

从上图中可以看到,最后都会调到do_mem_abort函数,这个函数比较简单,直接看代码,位于arch/arm64/mm/fault.c:

该函数中关键的处理:根据传进来的esr获取fault_info信息,从而去调用函数。struct fault_info用于错误状态下对应的处理方法,而内核中也定义了全局结构fault_info,存放了所有的情况。主要的错误状态和处理函数对应如下:

从代码中可以看出:

do_translation_fault

do_page_fault

do_page_fault函数为页错误异常处理的核心函数,与体系结构相关,上图中的handle_mm_fault函数为通用函数,也就是不管哪种处理器结构,最终都会调用到该函数。

handle_mm_fault用于处理用户空间的页错误异常:

流程如下图:

do_fault函数用于处理文件页异常,包括以下三种情况:

匿名页的缺页异常处理调用本函数,在以下情况下会触发:

如果访问Swap页面出错(页面不在内存中),则从Swap cache或Swap文件中读取该页面。由于在4.14内核版本中,do_swap_page调用的很多函数都是空函数,无法进一步的了解,大体的流程如下图:

do_wp_page函数用于处理写时复制(copy on write),会在以下两种情况处理:

关键的复制工作是由wp_page_copy完成的:

首页 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛

转载地址:深入解决Linux内存管理之page fault处理