图解|什么是缺页错误Page Fault

本文详细介绍了Linux系统中缺页错误Page Fault的概念,探讨了内存的惰性分配机制,CPU通过MMU和TLB进行地址转换的过程。文章深入分析了缺页异常的分类及其处理,包括硬缺页错误、软缺页错误和无效缺页错误,以及这些错误出现的原因。最后,总结了Page Fault在内存管理和系统性能中的关键作用。

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

1. 术语约定

  • VA:Virtual Address 虚拟地址
  • PA:Physical Address 物理地址
  • MMU:Memory Manage Unit 内存管理单元
  • TLB:Translation Lookaside Buffer 旁路快表缓存/地址变换高速缓存
  • PTE:Page Table Entry 分页表项

2. 内存的惰性分配

以32位的Linux系统为例,每个进程独立拥有4GB的虚拟地址空间,根据局部性原理没有必要也不可能为每个进程分配4GB的物理地址空间。

64位系统也是一样的道理,只不过空间寻址范围大了很多很多倍,进程的虚拟地址空间会分为几个部分:

实际上只有程序运行时用到了才去内存中寻找虚拟地址对应的页帧,找不到才可能进行分配,这就是内存的惰性(延时)分配机制。

对于一个运行中的进程来说,不是所有的虚拟地址在物理内存中都有对应的页,如图展示了部分虚拟地址存在对应物理页的情况:

虚拟地址空间根据固定大小一般是4KB进行划分,物理内存可以设置不同的页面大小,通常物理页大小和虚拟页大小是一样的,本文按照物理页4KB大小展开。

经过前面的分析,我们将面临一个问题:如何将虚拟地址准确快速地映射到物理页呢?

>>>高能预警 敲黑板 本段小结<<<

  1. Linux的虚拟地址空间就是空头支票,看着很大但是实际对应的物理空间只有很少的一部分。
  2. 内存的惰性分配是个有效的机制,可以保证内存利用率和服务器利用率,是资源合理配置的方法。
  3. 大量的虚拟地址到物理地址的快速准确地查询转换是一个难题。

3. CPU如果获取内存中的数据

CPU并不直接和物理内存打交道,而是把地址转换的活外包给了MMU,MMU是一种硬件电路,其速度很快,主要工作是进行内存管理,地址转换只是它承接的业务之一。

一起看看MMU是如何搞定地址转换的。

3.1 MMU和Page Table

每个进程都会有自己的页表Page Table,页表存储了进程中虚拟地址到物理地址的映射关系,所以就相当于一张地图,MMU收到CPU的虚拟地址之后开始查询页表,确定是否存在映射以及读写权限是否正常,如图:

对于4GB的虚拟地址且大小为4KB页,一级页表将有2^20个表项,页表占有连续内存并且存储空间大,多级页表可以有效降低页表的存储空间以及内存连续性要求,但是多级页表同时也带来了查询效率问题。

我们以2级页表为例,MMU要先进行两次页表查询确定物理地址,在确认了权限等问题后,MMU再将这个物理地址发送到总线,内存收到之后开始读取对应地址的数据并返回。

MMU在2级页表的情况下进行了2次检索和1次读写,那么当页表变为N级时,就变成了N次检索+1次读写。

可见,页表级数越多查询的步骤越多,对于CPU来说等待时间越长,效率越低,这个问题还需要优化才行。

>>> 本段小结 敲黑板 划重点 <<<
1.页表存在于进程的内存之中,MMU收到虚拟地址之后查询Page Table来获取物理地址。
2.单级页表对连续内存要求高,于是引入了多级页表,但是多级页表也是一把双刃剑,在减少连续存储要求且减少存储空间的同时降低了查询效率。

4.2 MMU和TLB的故事

MMU和TLB的故事就这样开始了...

CPU觉得MMU干活虽然卖力气,但是效率有点低,不太想继续外包给它了,这一下子把MMU急坏了。

MMU于是找来了一些精通统计的朋友,经过一番研究之后发现CPU用的数据经常是一小搓,但是每次MMU都还要重复之前的步骤来检索,害,就知道埋头干活了,也得讲究方式方法呀!

找到瓶颈之后,MMU引入了新武器,江湖人称快表的TLB,别看TLB容量小,但是正式上岗之后干活还真是不含糊。

当CPU给MMU传新虚拟地址之后,MMU先去问TLB那边有没有,如果有就直接拿到物理地址发到总线给内存,齐活。

TLB容量比较小,难免发生Cache Miss,这时候MMU还有保底的老武器页表 Page Table,在页表中找到之后MMU除了把地址发到总线传给内存,还把这条映射关系给到TLB,让它记录一下刷新缓存。

TLB容量不满的时候就直接把新记录存储了,当满了的时候就开启了淘汰大法把旧记录清除掉,来保存新记录,彷佛完美解决了问题。

在TLB和Page Table加持之下,CPU感觉最近MMU比较给力了,就问MMU怎么做到的?MMU就一五一十告诉了CPU。

CPU说是个不错的路子,随后说出了自己的建议:TLB还是有点小,缓存不命中也是经常发生的,要不要搞个大的,这样存储更多访问更快?

MMU一脸苦笑说道大哥TLB很贵的,要不你给涨点外包费?话音未落,CPU就说涨工资是不可能了,这辈子都不可能了。

>>>高能预警 敲黑板 本段小结<<<

  1. CPU要根据用户进程提供的虚拟地址来获取真实数据,但是它并不自己做而是交给了MMU。
  2. MMU也是个聪明的家伙,集成了TLB来存储CPU最近常用的页表项来加速寻址,TLB找不到再去全量页表寻址,可以认为TLB是MMU的缓存。
  3. TLB的容量毕竟有限,为此必须依靠Page Table一起完成TLB Miss情况的查询,并且更新到TLB建立新映射关系。

4. 缺页异常Page Fault大揭秘

设想CPU给MMU的虚拟地址在TLB和Page Table都没有找到对应的物理页帧或者权限不对,该怎么办呢?

没错,这就是缺页异常Page Fault,它是一个由硬件中断触发的可以由软件逻辑纠正的错误

4.1 PageFault,它来了

假如目标内存页在物理内存中没有对应的页帧或者存在但无对应权限CPU 就无法获取数据,这种情况下CPU就会报告一个缺页错误

由于CPU没有数据就无法进行计算,CPU罢工了用户进程也就出现了缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的 Page Fault Handler 处理。

缺页异常并不可怕,只要CPU要的虚拟地址经过MMU的一番寻址之后没有找到或者找到后无权限,就会出现缺页异常,因此触发异常后的处理流程将是重点内容。

4.2 缺页错误的分类处理

缺页中断会交给PageFaultHandler处理,其根据缺页中断的不同类型会进行不同的处理:

  • Hard Page Fault
    也被称为Major Page Fault,翻译为硬缺页错误/主要缺页错误,这时物理内存中没有对应的页帧,需要CPU打开磁盘设备读取到物理内存中,再让MMU建立VA和PA的映射。
  • Soft Page Fault
    也被称为Minor Page Fault,翻译为软缺页错误/次要缺页错误,这时物理内存中是存在对应页帧的,只不过可能是其他进程调入的,发出缺页异常的进程不知道而已,此时MMU只需要建立映射即可,无需从磁盘读取写入内存,一般出现在多进程共享内存区域。
  • Invalid Page Fault
    翻译为无效缺页错误,比如进程访问的内存地址越界访问,又比如对空指针解引用内核就会报segment fault错误中断进程直接挂掉。


4.3 缺页错误出现的原因

不同类型的Page Fault出现的原因也不一样,常见的几种原因包括:

  • 非法操作访问越界
    这种情况产生的影响也是最大的,也是Coredump的重要来源,比如空指针解引用或者权限问题等都会出现缺页错误。
  • 使用malloc新申请内存
    malloc机制是延时分配内存,当使用malloc申请内存时并未真实分配物理内存,等到真正开始使用malloc申请的物理内存时发现没有才会启动申请,期间就会出现Page Fault。
  • 访问数据被swap换出
    物理内存是有限资源,当运行很多进程时并不是每个进程都活跃,对此OS会启动内存页面置换将长时间未使用的物理内存页帧放到swap分区来腾空资源给其他进程,当存在于swap分区的页面被访问时就会触发Page Fault从而再置换回物理内存。

>>> 敲黑板 划重点 本段小结:<<<
触发Page Fault的原因可能有很多,归根到底也只有几种大类:

  1. 如使用共享内存区域,没有存储VA->PA的映射但是存在物理页帧的软缺页错误,在Page Table/TLB中建立映射关系即可。
  2. 访问的地址在物理内存中确实不存在,需要从磁盘/swap分区读入才能使用,这种性能影响会比较大,因为磁盘太慢了,尽量使用高性能的SSD来降低延时。
  3. 访问的地址内存非法,缺页错误会升级触发SIGSEGV信号结束进程,这种属于可以导致进程挂掉的一种缺页错误。

5. 全文总结

本文粗浅地和大家一起学习了Page Fault的相关知识点,包括Linux虚拟地址和物理地址的关系、CPU获取内存数据的过程、MMU和TLB&页表的协同配合、缺页异常产生的原因和分类处理。

本文并没有对MMU的内部机制、内核态&用户态缺页异常、缺页异常处理函数等内容进行展开,主要是因为这部分内容相对晦涩,还得靠自己深入研究。

原文作者:JamFF

原文链接:https://www.jianshu.com/p/c7b4ea025d4c(版权归原文作者所有,侵权留言联系删除)

 

<think>好的,我现在需要解释什么是缺页中断。首先,我应该回忆一下操作系统和内存管理的相关知识。缺页中断应该和虚拟内存有关,对吧? 用户可能已经了解一些基础概念,比如分页机制,但需要明确缺页中断的具体定义。我得从虚拟内存系统说起。虚拟内存允许程序使用比物理内存更大的地址空间,通过分页技术管理内存页的调入调出。 当程序访问一个虚拟地址时,如果对应的页不在物理内存中,就会触发缺页中断。这时候操作系统需要处理这个中断,把需要的页从磁盘调入内存。这个过程可能涉及到页面置换算法,比如LRU或者FIFO,来替换掉不常用的页。 接下来,我需要分步骤详细说明缺页中断的处理流程。首先,CPU访问虚拟地址,MMU检查页表,发现页表项标记为不存在或无效。然后,CPU触发缺页中断,操作系统接管,确定该虚拟地址是否有效。如果是无效的,可能终止进程;如果有效,则找到磁盘上的页,选择一个物理页帧,可能需要先换出其他页,然后调入所需页,更新页表,最后重新执行导致中断的指令。 还要注意缺页中断的类型,比如硬缺页和软缺页。硬缺页需要从磁盘读取,速度慢;软缺页可能只需重新映射已有的页,比如共享内存的情况。 另外,缺页中断对系统性能的影响也很重要。频繁的缺页中断会导致系统抖动,降低性能。因此,合理的内存管理和页面置换算法是关键。 最后,需要确保使用正确的中文术语,比如“页表项”、“物理页帧”、“页面置换算法”等,并且结构清晰,分点说明,让用户容易理解。同时,检查是否有遗漏的关键点,比如缺页中断的触发条件、处理步骤、不同类型以及性能影响等。</think>### 什么是缺页中断? **缺页中断(Page Fault)** 是操作系统内存管理中的一种关键机制,与虚拟内存系统密切相关。当程序试图访问的虚拟内存页未加载到物理内存时,由硬件(如MMU)触发该中断,通知操作系统处理内存页的调入或映射。以下是逐步解释: --- #### 1. **触发条件** - 程序访问虚拟地址时,若对应的**页表项(Page Table Entry)**标记为“不存在”(即物理内存中无此页),或访问权限不符(如试图写入只读页),则触发缺页中断。 - 示例:程序访问地址 `0x1234`,但该地址对应的页未载入物理内存。 --- #### 2. **处理流程** 缺页中断的处理分为以下步骤: **步骤1:中断捕获** CPU检测到缺页后暂停当前进程,切换到内核态,执行操作系统预设的中断处理程序。 **步骤2:地址有效性检查** 操作系统检查触发缺页的虚拟地址是否合法: - **无效地址**(如未分配的内存):向进程发送**SIGSEGV**信号(如段错误)。 - **有效地址**:继续处理。 **步骤3:调入或映射页面** 根据页表信息执行以下操作之一: - **硬缺页(Hard Page Fault)**:若页在磁盘交换区(Swap Space),需从磁盘读取到物理内存。 - **软缺页(Soft Page Fault)**:若页已在内存但未映射(如共享内存页),只需更新页表映射。 - **零页(Zero Page)**:若为未初始化的页,直接分配清零的物理页。 **步骤4:页面置换(可选)** 若物理内存已满,需通过**页面置换算法**(如LRU、FIFO)选择一个页换出到磁盘。 **步骤5:更新页表** 将调入的页映射到物理内存,更新页表项的“存在位”和物理地址。 **步骤6:恢复执行** 重新执行触发缺页的指令,此时所需页已载入内存,访问正常。 --- #### 3. **缺页类型** - **主缺页(Major Fault)**:需从磁盘读取据,耗时长。 $$ \text{主缺页时间} ≈ \text{磁盘访问时间(毫秒级)} $$ - **次缺页(Minor Fault)**:无需磁盘I/O,如共享内存重映射或零页分配,耗时短。 $$ \text{次缺页时间} ≈ \text{内存访问时间(纳秒级)} $$ --- #### 4. **性能影响** - **系统抖动(Thrashing)**:频繁缺页导致大量时间用于页面置换而非执行任务,需优化内存分配或增加物理内存。 - **监控工具**:可通过 `vmstat` 或 `perf` 观察缺页(`pgfault/s`)。 --- #### 5. **应用场景** - **按需分页(Demand Paging)**:程序启动时仅加载必要页,减少内存占用。 - **写时复制(Copy-on-Write)**:进程复制时共享父进程页,仅在写入时触发缺页中断分配新页。 --- ### 总结 缺页中断是虚拟内存实现的核心机制,通过按需加载和置换页面,使得程序可使用超出物理内存的虚拟地址空间。理解其原理有助于优化程序内存使用,避免性能瓶颈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值