整个缺页异常的处理过程非常复杂,我们这里只简单介绍一下缺页涉及到的内核函数。

当CPU产生一个异常时,将会跳转到异常处理的整个处理流程中。对于缺页异常,CPU将跳转到page_fault异常处理程序中,该异常处理程序会调用do_page_fault()函数,该函数通过读取CR2寄存器获得引起缺页的线性地址,通过各种条件判断以便确定一个合适的方案来处理这个异常。

do_page_fault()该函数通过各种条件来检测当前发生异常的情况,但至少do_page_fault()会区分出引发缺页的两种情况:由编程错误引发异常,以及由进程地址空间中还未分配物理内存的线性地址引发。对于后一种情况,通常还分为用户空间所引发的缺页异常和内核空间引发的缺页异常。内核引发的异常是由vmalloc()产生的,它只用于内核空间内存的分配。我们这里需要关注的是用户空间所引发的异常情况。这部分工作从do_page_fault()中的good_area标号处开始执行,主要通过handle_mm_fault()完成。

handle_mm_fault()该函数的主要功能是为引发缺页的进程分配一个物理页框,它先确定与引发缺页的线性地址对应的各级页目录项是否存在,如何不存在则分进行分配。具体如何分配这个页框是通过调用handle_pte_fault()完成的。

handle_pte_fault()该函数根据页表项pte所描述的物理页框是否在物理内存中,分为两大类:请求调页:被访问的页框不再主存中,那么此时必须分配一个页框。写时复制:被访问的页存在,但是该页是只读的,内核需要对该页进行写操作,此时内核将这个已存在的只读页中的数据复制到一个新的页框中。用户进程访问由malloc()分配的内存空间属于第一种情况。对于请求调页,handle_pte_fault()仍然将其细分为三种情况:

1.如果页表项确实为空(pte_none(entry)),那么必须分配页框。如果当前进程实现了vma操作函数集合中的fault钩子函数,那么这种情况属于基于文件的内存映射,它调用do_linear_fault()进行分配物理页框。否则,内核将调用针对匿名映射分配物理页框的函数do_anonymous_page()。

2.如果检测出该页表项为非线性映射(pte_file(entry)),则调用do_nonlinear_fault()分配物理页。

3.如果页框事先被分配,但是此刻已经由主存换出到了外存,则调用do_swap_page()完成页框分配。

在以上三个函数中缺页异常处理函数通过alloc_zeroed_user_highpage_movable()来完成物理页的分配过程。alloc_zeroed_user_highpage_movable()函数最终调用了alloc_pages()。  经过这样一个复杂的过程,用户进程所访问的线性地址终于对应到了一块物理内存。

参考:

缺少linux内核,Linux内核缺页相关推荐

  1. Linux教程:内核怎样管理你的内存

    在分析了进程的虚拟地址布局,我们转向内核以及他管理用户内存的机制.下图是gonzo的例子: Linux进程在内核中是由task_struct进程描述符实现的,task_struct的mm字段指向内存描 ...

  2. 宋宝华:评Linux 5.13内核

    目录 Misc cgroup Landlock安全模块 系统调用的堆栈随机化 printk无锁ringbuffer的进一步优化 BPF可调用内核函数 公共的IO PAGE Fault支持 Linux ...

  3. linux怎样查看内核参数,Linux 实例如何查看和修改 Linux 实例内核参数?

    <操作系统>课程设计报告课程设计题目:操作系统课程设计 设计时间:2016/1/10一. 课程设计目的与要求需要完成的内容:(1) 安装虚拟机:Vmware.Vmware palyer ( ...

  4. Linux 操作系统原理 — 内核态与用户态

    目录 文章目录 目录 Linux 的内核态与用户态 系统调用(System Call) Shell 用户态和内核态的切换 进程的用户空间和内核空间的内存布局 内核空间 用户空间 Linux 的内核态与 ...

  5. 复制linux内核,linux内核写时复制机制源代码解读

    作者简介 写时复制技术(一下简称COW)是linux内核比较重要的一种机制,我们都知道:父进程fork子进程的时候,子进程会和父进程会以只读的方式共享所有私有的可写页,当有一方将要写的时候会发生COW ...

  6. linux撤销编译,linux重新编译内核

    一.linux内核 1.查看linux内核版本 uname -r 2.下载对应的linux内核 https://www.kernel.org/pub/linux/kernel/ 将内核文件夹解压到/u ...

  7. Linux 0.11内核分析04:多进程视图

    目录 1 进程概念的引入 1.1 使用CPU的直观想法 1.2 直观用法的缺点 1.3 直观用法的改进 1.4 进程的概念 1.4.1 保存程序执行状态 1.4.2 进程与PCB 1.5 Linux ...

  8. Linux 0.11内核分析02:系统启动

    目录 1. 内核镜像的构建 1.1 内核源码结构 1.1.1 boot 1.1.2 fs 1.1.3 include 1.1.4 init 1.1.5 kernel 1.1.6 lib 1.1.7 m ...

  9. Linux内核源码分析:基于最新的Linux 4.0内核(学习路线总结)

    今天给大家分享的是基于最新的Linux 4.0内核学习路线总结,本文由8个专题组成,文末附上学习路线思维导图. 一.进程管理专题 1.进程原理 1.1 进程生命周期 1.2 task_struct结构 ...

  10. 非常好!!!Linux源代码阅读——内核引导【转】

    Linux源代码阅读--内核引导 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 目录 Linux 引导过程综述 BI ...

最新文章

  1. python_函数相关的各种参数定义和传递
  2. java 网络编程 博客园_java网络编程
  3. python_魔法方法(六):迭代器和生成器
  4. ASP.NET Core Docker部署
  5. 机器学习笔记033 | 主成分分析法(PCA)
  6. 显示滚动条后,table 表头与内容不对齐,JS脚本控制
  7. 百度云存储教程---免费建立自己的静态网站
  8. 认识BLE 5协议栈 —— 直接测试模式
  9. html获取当前网页ip和端口,js获取当前访问者的IP地址和所属地市代码
  10. 【现已失效】【转载】QQ空间一键点赞方法
  11. 如何制定客户留存策略_14个成功的客户留存策略举例
  12. CVE-2020-1472: NetLogon特权提升漏洞通告
  13. textarea 手机端无法换行_在某一些手机的安卓浏览器上textarea标签的placeholder不自动换行的解决方法...
  14. 计算机邀请函制作教案,计算机邀请函制作要点
  15. 微信支付-通知验签始终不通过的问题
  16. AT91SAM9261开发板SBC6000X(转)
  17. 833C语言程序设计与数据结构,2017年北方民族大学计算机技术833C语言程序设计与数据结构之C程序设计考研导师圈点必考题汇编...
  18. Centos7 Cannot find a valid baseurl for repo: base/7/x86_64
  19. Struts2学习笔记(三)
  20. 网络安全学习资源分享

热门文章

  1. 从工作经历和实践理论看工业互联网的发展
  2. 使用 docker 构建分布式调用链跟踪框架skywalking
  3. 别“躺”着了,赶紧把「复盘」做起来
  4. 译 | 在 Azure SQL 上节约成本的八种方法
  5. 数据结构与算法专题——第九题 鸡尾酒排序
  6. Dotnet core使用JWT认证授权最佳实践(二)
  7. gRPC in ASP.NET Core 3.x -- Protocol Buffer, Go语言的例子(下)
  8. 远程办公从学习开始,潜伏在家,技术如何逆袭?
  9. ASP.NETCore编程实现基本认证
  10. 2019年9月中国编程语言排行榜,C#排第三