异常与中断

🔥 高优先级

本节属于 408 选择题高频考点,重点掌握:

  • 中断与异常的区别
  • 中断处理过程(哪些由硬件完成,哪些由软件完成)
  • 断点与现场的区别
  • 单重中断、多重中断、中断屏蔽
  • 异常、自陷、系统调用之间的关系

本节可以和 程序中断 I/O 方式 共同学习。

中断

中断(interrupt)是指 CPU 在正常执行程序过程中,由 外部设备软件指令 触发的事件,促使 CPU 暂停当前执行,转而响应处理这些事件的一种机制。中断机制使得 CPU 能够及时响应外部输入、计时器、网络等事件,是现代操作系统和硬件协同工作的核心技术之一。

InterruptConcept中断的基本思想p1程序正常执行p2暂停当前程序p1->p2p3执行中断服务程序(ISR)p2->p3p4返回断点p3->p4p5继续执行原程序p4->p5

分类

中断是一个比较大的概念,我们可以按照不同的维度对其进行分类:

按照来源

根据中断来源区分:

  1. 外部中断
    • 触发来源:外部设备或外部事件触发,如输入设备、时钟、外部信号等。
    • 响应:CPU 响应外部事件,执行相应的中断处理程序。
  2. 内部中断(也叫 异常):
    • 触发来源:程序或 CPU 内部状态触发,如异常、错误等。
    • 响应:CPU 根据内部条件触发中断,执行特定的中断处理程序。

内部 和 外部 中断触发时间有何差异?

外部中断是在 “当前指令执行完成后” 才响应;内部异常是在 “当前指令执行过程中” 检测到异常而触发,其返回位置由异常类型决定。

InterruptVsExceptioncluster_irq外部中断(Interrupt)cluster_exc内部异常(Exception)i1CPU 执行当前指令i2当前指令执行完成i1->i2i3检查是否有中断请求i2->i3d1IRQ?i3->d1i4保存 PC(下一条指令)保存 PSWd1->i4i7继续执行下一条指令d1->i7i5进入中断服务程序i4->i5i6中断返回i5->i6i6->i7e1CPU 执行当前指令e2执行过程中检测异常e1->e2e3终止当前指令(不提交执行结果)e2->e3e4保存现场PC / PSW / 异常信息e3->e4e5进入异常处理程序e4->e5d2异常类型e5->d2f1Fault修复后重新执行当前指令d2->f1t1Trap继续执行下一条指令d2->t1a1Abort终止程序d2->a1
按照可嵌套性

执行中断的过程中是否允许 处理其他中断

  • 单级中断:CPU在执行中断服务程序时 不响应 任何新中断请求(即使优先级更高),所有中断按顺序依次串行处理。
  • 多重中断(中断嵌套):CPU在执行中断服务程序时 允许响应 优先级更高的新中断请求,从而暂停当前任务去处理更紧急的事件。
按照可屏蔽性

中断是否可以被 CPU 屏蔽

  1. 可屏蔽中断(Maskable Interrupt)
    • 可以通过设置中断屏蔽位(如 CPU 的中断允许标志)来暂时禁止的中断。
    • 通常为普通外设中断,如键盘、鼠标、网卡等。
  2. 不可屏蔽中断(Non-Maskable Interrupt, NMI)
    • 无法被屏蔽的紧急中断,常用于处理系统级错误,如电源故障、内存校验错误等。
interrupt_classificationcluster_source按来源分类cluster_maskable按是否可屏蔽分类cluster_external_details外部中断具体类型cluster_internal_details内部中断/异常具体类型cluster_maskable_details可屏蔽中断示例cluster_nmi_details不可屏蔽中断示例interrupt中断(Interrupt)external_int外部中断(External Interrupt)interrupt->external_int按来源internal_int内部中断/异常(Internal Interrupt/Exception)interrupt->internal_int按来源maskable可屏蔽中断(Maskable Interrupt)interrupt->maskable按屏蔽性non_maskable不可屏蔽中断(NMI)interrupt->non_maskable按屏蔽性io_intI/O设备中断• 键盘• 鼠标• 网卡• 硬盘external_int->io_inttimer_int时钟中断• 定时器• 系统时钟external_int->timer_intpower_int电源中断• 电源故障• 电压异常external_int->power_intprogram_exception程序异常• 除零错误• 非法指令• 访问违规internal_int->program_exceptionsystem_call系统调用• 软件中断• 陷阱指令internal_int->system_callmemory_exception存储器异常• 页面错误• 内存保护违规internal_int->memory_exceptionnormal_devices普通外设• 键盘中断• 鼠标中断• 网络中断• 串口中断maskable->normal_devicescritical_events紧急事件• 电源故障• 内存校验错误• 硬件故障• 看门狗超时non_maskable->critical_eventsio_int->normal_devices通常可屏蔽timer_int->normal_devices通常可屏蔽power_int->critical_events通常不可屏蔽note1注意:• 异常是内部中断的一种• 有些书将中断和异常区分• 分类方法可能因教材而异

基础概念

  • 系统中断向量 :系统中断向量是一个指向中断处理程序入口地址的指针。
  • 中断向量表 (Interrupt Vector Table, IVT):
    • IVT 是一个数据结构,它将中断号映射到中断处理程序的地址。
    • 每个中断向量都包含中断处理程序的入口地址。
  • 中断服务程序 (Interrupt Service Routine, ISR):中断处理程序是一段特殊的代码,用于响应特定的中断事件。
    • 保存被中断程序的上下文(寄存器状态等)。
    • 处理中断事件,例如读取硬件设备的数据、响应软件错误等。
    • 恢复被中断程序的上下文,使程序能够从中断点继续执行。
ISR 0 vector
ISR 1 vector
ISR 129 vector
ISR 255 vector
ISR 0
ISR 1
ISR 129
ISR 255
中断向量
中断
向量表
中断处理程序
CPU
根据中断向量找到中断处理程序
INT <中断号>
根据中断号
找到中断向量

CPU 可以通过 INT <中断号> 指令来执行特定的中断。当中断发生时,CPU 会根据 中断向量表基址寄存器(IVTBR)查找中断向量表的起始地址,再使用 中断号(中断类型)作为表下标找到相应的中断向量。然后,CPU 会使用中断向量中的地址,跳转到对应的中断处理程序执行。

中断处理流程

FR ⇔  stacked FR
CS ⇔  stacked CS
IP ⇔  stacked IP
x86 CPU
系统总线
PIC
寄存器
寄存器
寄存器
寄存器
IRQ0
IRQ1
IRQ2
IRQ3
IRQ4
IRQ5
IRQ6
IRQ7
Port 0x20:

中断命令
寄存器
Port 0x21:

中断数据
寄存器
0x0000: ISR 0 vector
0x0004: ISR 1 vector
0x0008: NMI vector   
· · · · ·
0x0204: ISR 129 vector
· · · · ·
0x03FC: ISR 255 vector
ISR 0
ISR 129
while (1) {                     
instructoin 1     
        ........                           instruction j        
      
instruction j+1  
........                
instruction n     
}                                  
Frame: saved registers
· · · · ·
Frame: saved registers
1
程序计数器
(CS:IP)
标志寄存器 (FR)
通用寄存器
INTR
        
INTA
NMI
ISR n
9.1
9.2
9.3
系统
中断
向量
2
6
4
5
3
8
9
7
10
中断
服务
程序
程序
进程
栈帧
主存
外设1
外设2
外设3
外设4
INT# = 0x81

上图给出了一个详细的计算机中断处理过程的图例。不同计算机的中断处理过程不同,考察该知识点的题目也经常没有统一的标准。这里说明一个比较详细全面的过程,可以帮助大家应付绝大多数相关考题:

  1. 中断触发
    • 外设向计算机发送一个 IRQ(中断处理请求)。
  2. 中断识别
    • 处理器完成当前指令的执行,并开始中断处理过程。
    • 处理器检查确定哪个中断被触发。如果中断使能,处理器会响应这个中断信号。
  3. 处理嵌套和屏蔽
    • 在执行中断服务程序之前,处理器会禁止或优先级屏蔽进一步的中断,以防止中断处理程序被其他中断打断。
      • 如果是 单级中断:直接关中断
      • 如果是 多重中断:设置中断屏蔽字,要屏蔽比当前中断优先级更低的中断
  4. 保存断点
    • 硬件 会保存当前任务的位置和状态,通常包括程序计数器(PC)、程序状态字(PSW)和其他必要的寄存器,以便中断处理完成后能够恢复。
  5. 中断服务寻址
    • 根据中断号在 中断向量表 中找到中断向量。
  6. 执行中断服务程序
    • 处理器根据中断向量跳转到相应的中断服务程序(ISR),中断服务程序包含以下内容:
      • 保存现场:程序使用的通用寄存器。
      • 处理中断事件(核心业务逻辑)
      • 恢复现场:恢复之前保存的现场来恢复中断之前执行的任务。
      • 中断返回(开中断、恢复断点):执行一条专门的中断返回指令(比如 IRET 指令),该指令将程序计数器(PC)和程序状态字(PSW)等恢复到中断前的值,然后继续执行中断之前的程序。

对于中断处理过程,大家需要注意两点:

  • 断点 和 现场 的区别。
  • 哪些步骤是硬件完成的,哪些步骤是软件完成的。

下图给出了软硬件在中断处理过程中的职责,与上述过程相对应:

中断触发
中断识别
关中断
保存断点
中断服务寻址
保存现场
处理中断事件
恢复现场
中断返回
(恢复断点、开中断)
硬件完成
软件(中断服务程序)完成
外设
注意

保护断点和保护现场的区别

首先是 断点 和 现场 两个词的语义差别,一般来讲,断点 就是进程在中断之前执行的位置和状态,这包含程序计数器(PC)、程序状态字(PSW / FLAGS),可能还有堆栈指针(SP)等信息。

现场 大多数情况下与 上下文(context)具有相同的含义,不过现场是更加口语化的词。一般来讲,现场这一概念是包含断点的(即断点是 现场或上下文 的子集)。但是在很多考察中断的题目中,倾向于把 现场 和 断点 这个词区分开来,也就是说 现场 仅代表通用寄存器的内容。

所以大家要灵活应变,还是理解中断的核心机制,才能应付出题人的模棱两可。

中断发生瞬间的 CPU 状态寄存器PC / IP0x0040_1A2CPSW / FLAGS0b1000_0010SP0xFFFF_E000AX / EAX0x0000_0005BX / EBX0x0000_0003CX / ECX0x0000_0007DX / EDX0x0000_000ASI / DI …断点(硬件保存)现场(软件保存)虚线 = 视情况保存保护断点执行者硬件(中断隐指令)时机中断响应时自动内容PC、PSW(SP)目的中断后回到正确地址↩ 恢复:IRET 指令(硬件执行)保护现场执行者软件(ISR 开头)时机进入 ISR 后手动 PUSH内容通用寄存器(AX…)目的ISR 结束后还原寄存器↩ 恢复:ISR 末尾 POP(软件执行)集合关系(广义)现场 / 上下文通用寄存器 + 断点信息断点PC / PSW⚠ 考题常将"现场"仅指通用寄存器,断点单独区分
注意

中断中硬件和软件的功能

  • 保存断点:由 中断隐指令 自动保存(硬件 完成),保存 CPU 在中断时即将执行的指令地址,即通过寄存器 CS:IP 指向的内存地址,完成中断后可通过保存的 CS:IP 内容恢复下一条指令的执行。
  • 保存和恢复现场:在 中断服务程序 内保存(软件 完成),中断服务程序可能会使用到 CPU 中的某些寄存器,通过保存这些寄存器的内容,确保在中断程序执行完后,CPU 可以恢复到执行中断服务程序前的状态。
  • 恢复断点:一般是在中断服务程序中触发(RET 指令),但是由硬件执行。

中断优先级

为了及时响应重要事件,系统会为每个中断源分配一个 中断优先级(Interrupt Priority)。当多个中断请求同时到达,或在执行一个中断服务程序期间又出现新的中断请求时,CPU 会根据中断优先级决定响应顺序。

中断优先级主要有两个作用:

  • 多个中断同时到达时,决定 CPU 首先响应哪个中断。
  • 发生中断嵌套时,决定新的中断是否可以打断当前正在执行的中断服务程序。
优先级(高 → 低)高优先级中优先级低优先级中断源中断 ANMI · 硬件故障P = 1中断 B时钟定时器P = 2中断 C磁盘 I/OP = 3中断 D键盘 / 鼠标P = 4中断嵌套示例时间轴 →t主程序D 的中断服务程序C 的中断服务程序B 的 ISR说明:高优先级中断打断低优先级 ISRISR 执行完后返回被中断处优先级规则① 同时请求:优先响应高优先级② 执行 ISR 时(IF = 0 时):高优先级可抢占低优先级不可抢占③ 屏蔽字:决定哪些中断可响应④ NMI:不受屏蔽字控制,始终具有最高优先级P 值越小 → 优先级越高;嵌套层数取决于系统设计

例如,若中断源 A 的优先级高于 B、C,则:

  • 当 A、B 同时发出中断请求时,CPU 会优先响应 A;
  • 当 CPU 正在执行 B 的中断服务程序时,若 A 发出中断请求,则 A 可以优先获得处理。

中断嵌套

中断嵌套 是指当 CPU 正在执行一个中断服务程序(ISR)时,如果出现了一个 优先级更高 的中断请求,CPU 会 暂停 当前正在执行的中断服务程序,转而响应新的中断请求。待高优先级中断处理完成后,再返回继续执行原先被暂停的中断服务程序。

这种“中断中再响应中断”的机制,就称为 中断嵌套

单级中断

若 CPU 在执行中断服务程序期间,即使出现新的 更高优先级 中断请求,也 不予响应,则称为 单重中断

上文介绍的 中断处理过程 就属于单重中断。其实现方式十分简单:CPU 在进入中断服务程序后关闭中断,直到中断处理结束再重新开启中断。

对于 x86 来说,可通过 FLAGS 寄存器 中的 IF 标志位控制:

  • IF = 1(中断使能):允许 CPU 响应可屏蔽中断请求。
  • IF = 0(中断禁止):CPU 不响应任何可屏蔽中断请求。
多重中断

多重中断(中断嵌套)是指 CPU 在执行中断服务程序期间,允许 更高优先级 的中断打断当前中断服务程序,从而提高系统对关键事件的响应速度。

ISR
主程序
单级中断
ISR3
ISR1
ISR1
ISR2
ISR2
主程序
多级中断

要实现多重中断,CPU 必须满足两个条件:

  • 重新开中断:进入中断服务程序后,需要重新开启中断(IF = 1),否则新的中断请求无法得到响应。
  • 优先级控制:必须保证只有 优先级更高 的中断才能打断当前中断服务程序,而较低优先级的中断应继续等待。

第二个条件正是通过 中断屏蔽技术 实现的。

提示

如果将 中断嵌套 和 优先级调度 类比的话:

  • 单级中断类似 非抢占式优先级调度:ISR 的执行不能被其他中断打断,每次执行中断时选择优先级最高的中断执行
  • 多重中断类似 抢占式优先级调度:ISR 的执行可以被更高优先级的中断打断(同级或低级不能打断)

中断屏蔽

中断屏蔽(Interrupt Masking) 用于控制 当前允许响应哪些中断请求,从而实现中断优先级管理。

每个中断源对应一个 屏蔽触发器

  • 1:屏蔽该中断源;
  • 0:允许该中断源。

所有屏蔽触发器组成一个 中断屏蔽字(Mask),存储在屏蔽字寄存器中,用于控制各个中断请求是否能够被 CPU 响应。

中断源
A
B
屏蔽字
C
D
A
B
C
D
1
1
1
1
0
1
1
1
0
0
1
1
0
0
0
1
优先级 A > B > C > D

屏蔽字中的每一位对应一个中断源。当 CPU 正在执行某个中断服务程序时,可以根据当前中断的优先级修改屏蔽字,从而决定哪些新的中断请求可以继续响应。

例如,设四个中断源的优先级为:

A > B > C > D

若 CPU 正在执行 B 的中断服务程序,则通常会设置屏蔽字,使:

  • A:允许(优先级更高)
  • B:屏蔽(防止重复进入)
  • C:屏蔽
  • D:屏蔽

这样,当新的中断请求到来时:

  • A 可以打断当前 B 的中断服务程序;
  • C、D 只能等待 B 处理结束后再响应。

因此,中断屏蔽的作用并不是改变中断优先级,而是 保证只有优先级更高的中断才能发生中断嵌套

注意

注意:中断屏蔽字主要用于多重中断。

对于单重中断来说,CPU 在进入中断服务程序后直接关闭中断(IF = 0),所有可屏蔽中断都会被禁止,因此无需使用中断屏蔽字。

根据是否可以被屏蔽,中断又可分为 可屏蔽中断(Maskable Interrupt)不可屏蔽中断(Non-Maskable Interrupt,NMI)

可屏蔽中断 (Maskable)通过 INTR 引脚 · 可被屏蔽字关闭键盘 / 鼠标定时器串口 / USB(常规外设事件)屏蔽字IMR / IF可打开/关闭INTRCPU 引脚IF=1 允许IF=0 屏蔽特点• 优先级较低,用于非紧急事件• CPU 可通过CLI / STI关/开中断• 屏蔽字(IMR)可动态调整优先级• 一般由中断控制器 8259A管理• 举例:串口、USB、时钟中断→ 可延迟响应,允许系统调度不可屏蔽中断 (NMI)通过 NMI 引脚 · 无法被屏蔽字关闭电源失效内存校验错误硬件严重故障(关键 / 紧急事件)无屏蔽开关直连NMICPU 引脚CPU 必须立即响应特点最高优先级,用于紧急/致命事件• 不受 IF 标志和屏蔽字控制• 可打断其他中断服务程序• 强制打断当前任务,无法延迟• 举例:断电、奇偶校验错、看门狗超时→ 保障系统可靠性与安全性
可屏蔽中断

可屏蔽中断(IRQ) 是指可以通过设置屏蔽字暂时禁止响应的中断。这类中断通常对应普通外设事件,例如键盘输入、串口通信、USB 设备或定时器中断等。

CPU 可以根据当前正在执行的中断服务程序,动态修改屏蔽字,从而决定哪些可屏蔽中断能够参与中断嵌套。

不可屏蔽中断

不可屏蔽中断(NMI) 是指不能通过屏蔽字或 IF 标志位禁止响应的中断。这类中断通常用于处理系统中的严重错误,例如内存校验错误、电源故障等。

由于 NMI 具有最高优先级,因此即使 CPU 正在执行其他中断服务程序,也会立即响应 NMI,以保证系统的可靠性。

在硬件设计中,可屏蔽中断和不可屏蔽中断通过不同的信号线连接到 CPU。以 x86 为例:

IR0
IR1
IR2
IR3
IR4
IR5
IR6
IR7 
8259
主片
INT
IR0
IR1
IR2
IR3
IR4
IR5
IR6
IR7 
8259
从片
INT
实时时钟
(RTC)
CMOS
RAM
INTR
NMI
处理器
  • INTR :接收 可屏蔽中断,主要处理普通外设中断,其响应受 IF 标志位和中断屏蔽字共同控制。
  • NMI :接收 不可屏蔽中断,用于处理系统严重错误,不受 IF 标志位和中断屏蔽字影响。

嵌套和屏蔽的关联

两者讨论的是 两个不同层次的问题

  • 中断嵌套(Interrupt Nesting):描述的是 CPU 是否允许 ISR 被另一个 ISR 打断。
  • 中断屏蔽(Interrupt Masking):描述的是哪些中断请求有资格打断当前 ISR。

当然,当我们讨论中断嵌套中的 单级中断多重中断,默认都是 可屏蔽中断

不可屏蔽中断 是一种特殊情况,它始终可以抢占当前执行流,因此通常不纳入单重/多重中断机制来讨论。

InterruptDecisionFlowstart中断请求到来is_nmi是否为不可屏蔽中断(NMI)?start->is_nmirespond_nmi立即响应 NMI进入 NMI 服务程序is_nmi->respond_nmiif_enabled是否允许可屏蔽中断?(IF = 1)is_nmi->if_enabled否(IRQ)wait_if暂不响应等待 IF 恢复为 1if_enabled->wait_ifcheck_mask该中断源是否被屏蔽字屏蔽?if_enabled->check_maskwait_mask暂不响应等待解除屏蔽check_mask->wait_maskcheck_priority优先级是否高于当前正在处理的中断?check_mask->check_prioritywait_priority暂不响应等待当前 ISR 结束check_priority->wait_prioritynested_interrupt暂停当前 ISR响应新中断形成中断嵌套check_priority->nested_interrupt

异常

在 CPU 中,异常 是指在程序执行过程中出现的非正常或意外情况,CPU 需要暂停当前执行,转而调用操作系统提供的异常处理程序。异常机制确保系统能够安全、有效地处理错误或特殊事件,并对程序执行做出相应调整。

注意

中断和异常的区别:

异常 发生在 CPU 内部,在一般的分类方法中可以被看为中断类型的一种(内中断),但是在有的书上将中断和异常这两个概念区分了开来:

  • 异常代表 CPU 执行指令时的意外事件
  • 中断代表来自 CPU 外部、与 CPU 执行指令无关的事件引起的中断
异常 (Exception)
内部中断
外部中断
中断
(Interrupt)

在这里注意一下即可,面对题目可以灵活分辨即可。

类型

CPUExceptionscluster_legend图例legend_concept概念legend_exception异常legend_handling处理CPUCPU异常处理DivisionError除法错误CPU->DivisionErrorFloatingPointError浮点异常CPU->FloatingPointErrorPageFault缺页异常CPU->PageFaultProtectionError保护错误CPU->ProtectionErrorHardwareError硬件错误CPU->HardwareErrorDiv_Example除以零→ 终止程序DivisionError->Div_ExampleFloat_Example非法运算→ 返回NaNFloatingPointError->Float_ExamplePage_Example访问未加载页→ 加载页面PageFault->Page_ExampleProtect_Example非法访问→ 段错误ProtectionError->Protect_ExampleHardware_Example硬件故障→ 系统处理HardwareError->Hardware_Example

在执行指令的过程,可能发生如下五类异常:

  1. 除法错误
    • 触发条件:程序尝试除以零或执行非法除法操作。
    • 处理方式:通常由操作系统捕获并中断程序执行,可能显示错误信息或终止程序。
  2. 浮点异常
    • 触发条件:浮点运算出现错误,例如溢出、下溢、除以零或非法操作(如对负数开平方)。
    • 处理方式:操作系统可能中断程序、设置异常标志,或产生 NaN(非数)结果。
  3. 缺页异常
    • 触发条件:程序访问的内存页尚未加载到物理内存中。
    • 处理方式:操作系统会将所需页从磁盘调入内存,更新页表后恢复程序执行。
  4. 保护错误
    • 触发条件:程序试图进行非法操作,如写入只读内存、访问内核空间或执行特权指令。
    • 处理方式:操作系统中断程序执行,防止非法访问。
  5. 硬件错误
    • 触发条件:由硬件错误引起,如内存故障、总线错误、电源故障等。
    • 处理方式:可能导致系统记录错误、尝试修复或直接宕机,具体行为依赖硬件和系统配置。

下表给出了每种类型的一个具体实例,帮助各位理解什么叫做异常:

int a = 10;
int b = 0;
int c = a / b;  // 除以零,触发除法错误
float x = 0.0;
float y = sqrt(-1.0);  // 无效操作,结果为 NaN(非数) 
char* ptr = mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0);
char c = ptr[0];  // 当访问 ptr[0] 时,触发缺页异常
                  // 内核通过页调度机制将数据从磁盘加载进内存,随后程序继续执行。
int* ptr = (int*)0xFFFF0000;  // 指向只读或内核地址
*ptr = 42;  // 写操作触发保护错误(Segmentation Fault)
// 机器检查异常通常由硬件引发,难以模拟。
// 示例:某些平台可使用特殊指令测试内存校验错误。
// 实际触发依赖硬件环境,下面为伪代码:
char* bad_addr = (char*)0xDEADBEEF;
char c = *bad_addr;  // 假设该地址引发硬件错误

自陷

自陷(Trap)是 CPU 主动触发的一类异常。当程序执行过程中出现某些需要操作系统介入处理的情况时,CPU 会暂停当前程序,保存现场,并将控制权交给操作系统的异常处理程序。

外部中断 不同,自陷是由 当前正在执行的指令程序运行状态 引起的,而不是由外部设备发出的中断请求。

自陷的典型应用:

  1. 异常处理 当程序执行过程中发生错误,如除零、非法内存访问、无效指令等,CPU 会触发自陷,进入相应的异常处理程序。
  2. 系统调用 用户程序需要请求操作系统提供服务(如打开文件、创建进程、分配内存等)时,会执行专门的 陷阱指令(如 x86 的 syscall),主动触发自陷,进入内核态执行系统调用处理程序。
  3. 调试断点 调试程序时,在断点位置插入断点指令(如 x86 的 int3)。程序执行到该指令时,会触发自陷,暂停运行,等待调试器接管。
CPU自陷机制流程用户态 (User Mode)内核态 (Kernel Mode)用户程序执行正常指令流自陷触发条件异常 (除零、越界)系统调用 (syscall)调试断点触发CPU检测保存状态:• PC (程序计数器)• 寄存器状态切换到内核态操作系统处理• 异常处理程序• 系统调用服务• 调试器介入不可恢复终止程序可恢复恢复执行恢复用户态继续执行陷阱指令程序主动发起的指令如: x86的syscall指令用于系统调用和调试12345a5b

自陷处理过程(简化版)如下:

  • CPU 检测到自陷条件(异常、系统调用或断点);
  • 保存当前程序的执行现场(如 PC、寄存器等);
  • CPU 切换到内核态,转入操作系统预设的自陷处理程序;
  • 操作系统根据自陷原因完成异常处理或系统服务;
  • 若程序可以继续执行,则恢复现场并返回;否则终止程序。

陷阱指令 是一种由程序 显式执行 的特殊指令,其作用是主动触发自陷。系统调用通常就是通过陷阱指令实现的,因此它是用户程序进入内核态、请求操作系统服务的重要机制。

通过自陷机制,CPU 能够在程序运行过程中及时将控制权交给操作系统,既能处理各种异常,又能安全、高效地完成系统调用等内核服务。