页错误 Page Fault /缺页异常 详解
目录
1. 第一部分:如果你看得懂
1.1 页错误定义
1.2 页错误的处理
2. 第二部分:如果你看不懂上面的,请看这里
2.1. 举例子(背景)
2.1.1 进程及页映射
2.1.2 映射关系和数据结构
2.2 结合图说明什么是页错误
2.2.1 页错误产生
2.2.2 页错误处理
读书-程序员的自我修养-链接、封装与库(14: 第六章:可执行文件的装载与进程(2)从操作系统角度看可执行文件的装载:进程建立的3个步骤,虚拟地址空间,页错误)
1. 从操作系统角度看可执行文件的装载
1.1 进程建立的三个步骤
1.1.1 创建一个独立的虚拟地址空间
1.1.2 建立虚拟空间和可执行文件的映射关系
1.1.3 将cpu的指令寄存器设置为可执行文件的入口地址,执行它
1.2 为什么需要虚拟地址空间?
1.3 页错误
1.3.1 页错误定义
1.3.2 页错误的处理
1. 第一部分:如果你看得懂
1.1 页错误定义
- 当cpu执行进程的某个页面时,发现他要访问的页(虚拟地址的页)没有在物理内存中,而导致的中断(页错误)。
(一个可执行文件可能很大,放在磁盘上,由局部性原理一次只将其中一部分读进内存) - 百度定义:指的是当软件试图访问已映射在虚拟地址空间中,但是目前并未被加载在物理内存中的一个分页时,由中央处理器的内存管理单元所发出的中断。
1.2 页错误的处理
页错误发生后,操作系统去查询保存可执行文件和其进程虚拟空间映射关系的数据结构
找到空页面所在的VMA虚拟内存区域。然后通过它VMA计算出空页面在可执行文件中偏移
然后再物理内存中分配一个物理页面,并将该物理页和虚拟空间中虚拟页建立映射关系。
最后将cpu控制权返还给进程,从刚才页错误的地方继续执行。
虚拟内存区域(VMA: Virtual Memory Area):
linux将进程虚拟空间中的一个段叫做虚拟内存区域。windows叫做虚拟段。
如果你能看懂上面的定义和解释就不用往下看了……
2. 第二部分:如果你看不懂上面的,请看这里
如果你看不懂,没关系,我给出了一个简单的例子,通过这个例子,我想你应该能明白个八九不离十了。
2.1. 举例子(背景)
我想将页错误讲清楚明白,这里举个纯粹的例子。
看图
2.1.1 进程及页映射
假设我这个进程ADD是计算 1+1 1+2 1+3 ……到 1+100000的值。
由图可知,现在由于可执行文件到虚拟空间中只映射了VP0~VP7这8个页,并且其中的计算都在这些页中标识。
并且VP0 VP1 VP7都已经映射到物理内存页的PP0 PP2 PP3处。
2.1.2 映射关系和数据结构
图中从左到右依次是:进程的可执行文件(存储在磁盘中) – 进程虚拟地址空间 – 物理内存地址空间
映射关系1(绿色):指的是可执行文件到虚拟地址空间的映射,其映射关系保持在操作系统数据结构1中。
映射关系2(紫色):指的是虚拟地址空间到物理内存页直接的映射,其映射关系保持在操作系统数据结构2中。
2.2 结合图说明什么是页错误
2.2.1 页错误产生
简单点说就是:
进程ADD执行1+1时,从操作系统保存的数据结构2中可以查到映射关系2,
由于其进程虚拟空间页VP0已经映射到物理内存页PP0处,所以CPU执行,OK,结果是2。完成!
进程ADD执行1+2时,从操作系统保存的数据结构2中可以查到映射关系2,
由于其进程虚拟空间页VP1已经映射到物理内存页PP2处,所以CPU执行,OK,结果是3。完成!
进程ADD执行1+3时,从操作系统保存的数据结构2中可以查到映射关系2,
由于其进程虚拟空间页VP7已经映射到物理内存页PP3处,所以CPU执行,OK,结果是4。完成!
进程ADD执行1+4时,从操作系统保存的数据结构2中查不到VP2与物理内存对于的映射关系。
怎么办?
怎么办?
2.2.2 页错误处理
此时,CPU控制权由进程ADD交给操作系统,操作系统去查询保存的数据结构1(保存的是可执行文件到虚拟地址空间的映射)
通过该DP0页面所在的VMA虚拟内存区域,然后在VMA计算出页面在ELF(可执行文件)中的偏移,最后从物理内存中分配一个物理页面,并将该物理页面和进行虚拟地址建立映射关系。
最后将CPU控制权交给ADD进程,从刚才页错误的地方继续执行,OK,结果是5,完成!
虚拟内存区域(VMA: Virtual Memory Area):
linux将进程虚拟空间中的一个段叫做虚拟内存区域。windows叫做虚拟段。
参考:
读书-程序员的自我修养-链接、封装与库(14: 第六章:可执行文件的装载与进程(2)从操作系统角度看可执行文件的装载:进程建立的3个步骤,虚拟地址空间,页错误_哈尼的博客-CSDN博客
完成!
读书-程序员的自我修养-链接、封装与库(14: 第六章:可执行文件的装载与进程(2)从操作系统角度看可执行文件的装载:进程建立的3个步骤,虚拟地址空间,页错误)
- 1. 从操作系统角度看可执行文件的装载
- 1.1 进程建立的三个步骤
- 1.1.1 创建一个独立的虚拟地址空间
- 1.1.2 建立虚拟空间和可执行文件的映射关系
- 1.1.3 将cpu的指令寄存器设置为可执行文件的入口地址,执行它
- 1.2 为什么需要虚拟地址空间?
- 1.3 页错误
- 1.3.1 页错误定义
- 1.3.2 页错误的处理
1. 从操作系统角度看可执行文件的装载
1.1 进程建立的三个步骤
从操作系统角度看,一个进程最关键的特征就是它拥有独立的虚拟地址空间。这使得它有别于其他进程。
但是一个进程的建立需要三个步骤
1.1.1 创建一个独立的虚拟地址空间
虚拟地址空间由一组页映射函数将虚拟空间的各个页映射到相应的物理地址。
创建虚拟地址空间的本质是:创建映射函数需要的数据结构。
1.1.2 建立虚拟空间和可执行文件的映射关系
其实这个关系就是:发生页错误时,OS应该知道程序当前需要的页在可执行文件中的哪一个位置。
映像文件(Image):
因为可执行文件在被装载时是被映射到虚拟地址空间的,所以很多时候可执行文件又被叫做映像文件。
这种映射关系也是保存在OS中的一个数据结构中的。
虚拟内存区域(VMA: Virtual Memory Area):
linux将进程虚拟空间中的一个段叫做虚拟内存区域。windows叫做虚拟段。
1.1.3 将cpu的指令寄存器设置为可执行文件的入口地址,执行它
可执行文件的入口地址就是elf的入口地址
Entry point address就是入口地址
root@ubuntu-admin-a1:/home# readelf -h simple.o
ELF Header:
……
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 1056 (bytes into file)
……
1.2 为什么需要虚拟地址空间?
因为早期的计算机运行方式是直接将程序运行在物理内存上。这就存在三个问题:
问题1. 地址空间不隔离
所有进程都直接访问物理地址,程序使用的物理空间不是隔离的;
问题2. 运行效率低
监控程序直接将整个程序装入内存进行执行
问题3. 运行地址不确定
因为每次执行装入的物理地址是不确定的。
为了解决以上三个问题,增加了一个中间层,用来解决上面的问题。
那就是给出一个虚拟地址,然后通过一种映射关系,将其与物理地址进行映射,将虚拟地址转换成物理地址。
这样就能解决存在的问题1和问题3,问题2需要页映射来解决。
这个可以看之前的博客介绍。
https://blog.csdn.net/lqy971966/article/details/99533610
更详细的:虚拟地址空间
https://blog.csdn.net/lqy971966/article/details/119378416
1.3 页错误
1.3.1 页错误定义
当cpu执行进程的某个页面时,发现这个虚拟空间中的页没有映射到内存中,而导致的中断。
1.3.2 页错误的处理
- 页错误发生后,操作系统去查询保存可执行文件和其进程虚拟空间映射关系的数据结构
- 找到空页面所在的VMA虚拟内存区域。然后通过它VMA计算出空页面在可执行文件中偏移
- 然后再物理内存中分配一个物理页面,并将该物理页和虚拟空间中虚拟页建立映射关系。
- 最后将cpu控制权返还给进程,从刚才页错误的地方继续执行。
如果这个页错误看不懂,没关系,请看我的页错误专门的一篇。相信可以帮助你。
页错误 Page Fault /缺页异常 详解_哈尼的博客-CSDN博客_页错误
页错误 Page Fault /缺页异常 详解相关推荐
- Java异常详解及如何处理
来源:Java异常详解及如何处理 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言 ...
- php7自定义异常处理,基于PHP7错误处理与异常处理方法(详解)
PHP7错误处理 PHP 7 改变了大多数错误的报告方式.不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出. 这种 Error 异常可以像 Exception 异常一 ...
- 暗黑3服务器维护能登录,暗黑3登陆错误原因及解决办法详解
暗黑3登陆错误原因及解决办法详解 2012-10-15 09:06:03来源:游戏下载编辑:评论(0) 暗黑3报错ERROR解决方法,全部暗黑3报错汇总,全部报错汇总解答.小编将玩家遇到的各种暗黑3安 ...
- Flink/Blink 原理漫谈(六)容错机制(fault tolerance)详解
系列文章目录 Flink/Blink 原理漫谈(零)运行时的组件 Flink/Blink 原理漫谈(一)时间,watermark详解 Flink/Blink 原理漫谈(二)流表对偶性和distinct ...
- 【疑难杂症04】EOFException异常详解
[疑难杂症04]EOFException异常详解 参考文章: (1)[疑难杂症04]EOFException异常详解 (2)https://www.cnblogs.com/yiwangzhibujia ...
- python网上批量下载表格_python爬虫智能翻页批量下载文件的实例详解
python爬虫遇到爬取文件内容时,需要一页页的翻页爬取,这样很是麻烦,其实可以获取每个列表信息下的文件名和文件链接,让文件名和文件链接处理为列表,保存后下载,实现智能翻页批量下载文件,本文以以京客隆 ...
- 图解|什么是缺页错误Page Fault
1.号外号外 各位老铁,大家好! 上周大白有事停更1次,最近在想如何让大家在10分钟中有所收获,于是准备搞一个"什么是xxx"系列,写一些精悍的知识点. 先抛一道阿里面试题给大家热 ...
- 趣味图解 | 什么是缺页错误 Page Fault?
来源 | 后端技术指南针 号外号外 各位老铁,大家好! 最近在想如何让大家在10分钟中有所收获,写一些精悍的知识点. 先抛一道阿里面试题给大家热热身,引出今天的主角-缺页异常Page Fault. 谈 ...
- 什么是缺页错误 Page Fault?
谈谈对缺页异常Page Fault的理解. 话不多说,集合上车. 术语约定 VA:Virtual Address 虚拟地址 PA:Physical Address 物理地址 MMU:Memory Ma ...
最新文章
- [SDOI2009]Elaxia的路线
- windows文件名非法字符过滤检测-正则表达式
- python3.7安装numpy模块-Python3.7模块numpy
- k8s API编程:kubebuilder实战案例sidecarset
- python写excel标记文字颜色_python3使用xlwt时写入文档字体颜色和边框样式
- 笔记本超频会烧吗_如何判断电脑是否支持DIY 超频?这篇文章告诉你
- python自己重启自己程序_python 自动重启本程序
- python环境配置教程
- 华为手机字体改简体_华为手机字体怎么更换简体
- 【学习笔记】Creo如何创建钣金件(利用骨架)
- STM32 DFU下载与 DFU生成工具
- 【前端框架】Element UI Dialog 组件中执行 DOM 操作异常问题的分析与处理
- 机器学习之期望最大化算法(Expectation Maximization, EM)
- 吕鑫MFC学习系列一
- 《有限与无限的游戏》第二章 没人能独自玩游戏:经典摘抄(1)
- 程序员不能错过的28份技术知识图谱,你的进阶路上必备
- 最新彩虹易支付六合一支付插件
- cvte2021秋招 嵌入式 offer 面经
- 让运营人员相见恨晚的抖音自动化数据分析方案
- mysql获取时间部分_mysql中取日期的一部分