页错误 Page Fault /缺页异常 详解

本文详细阐述了页错误的概念,包括页错误的定义、处理流程。解释了当CPU尝试访问未加载到物理内存的虚拟页时触发中断的情况。内容涉及进程虚拟地址空间的创建、映射关系以及页错误时的操作系统响应,旨在帮助读者理解页错误的产生和处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​​​​​目录

​​​​​​

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 页错误定义

  1. 当cpu执行进程的某个页面时,发现他要访问的页(虚拟地址的页)没有在物理内存中,而导致的中断(页错误)。
    (一个可执行文件可能很大,放在磁盘上,由局部性原理一次只将其中一部分读进内存)
  2. 百度定义:指的是当软件试图访问已映射在虚拟地址空间中,但是目前并未被加载在物理内存中的一个分页时,由中央处理器的内存管理单元所发出的中断

1.2 页错误的处理

  1. 页错误发生后,操作系统去查询保存可执行文件和其进程虚拟空间映射关系的数据结构

  2. 找到空页面所在的VMA虚拟内存区域。然后通过它VMA计算出空页面在可执行文件中偏移

  3. 然后再物理内存中分配一个物理页面,并将该物理页和虚拟空间中虚拟页建立映射关系。

  4. 最后将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 建立虚拟空间和可执行文件的映射关系

其实这个关系就是:发生页错误时,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博客_页错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值