关于Fault,Trap,Abort异常的区分和执行到什么阶段以及断点保存的差异
一句话结论:
Fault 和 Trap 都是在指令“边界”被处理的(保证原子性),但触发时机不同;Abort 则是无法保证原子性的,可能在指令执行中途就让系统直接挂掉。
三类异常的严格区分
1. Fault(故障型异常)
-
检测时机:在指令执行过程中检测到问题。
-
处理时机:CPU 保证这条指令逻辑上没有完成(对状态无副作用),然后在指令边界触发异常。
-
效果:异常返回时,这条指令会被 重新执行。
-
例子:缺页异常、段不存在、除零错误。
-
关键点:虽然检测到问题可能在执行中,但 CPU 会在“指令完成前”打断,恢复后能再跑一次。
2. Trap(陷阱型异常)
-
检测时机:在指令执行过程中正常执行完,最后一步“顺带”触发。
-
处理时机:指令执行 完成后 立即引发。
-
效果:异常返回时,下一条指令继续执行。
-
例子:系统调用、调试断点。
-
关键点:Trap 不代表错误,它就是一种“执行完就转向异常”的设计。
3. Abort(终止型异常)
-
检测时机:可能在指令执行任意时刻(通常是执行中)。
-
处理时机:无法保证落在指令边界。
-
效果:CPU 无法保证程序状态一致,通常直接终止程序甚至系统崩溃。
-
例子:硬件错误、校验错误(如内存位反转、总线错误)。
-
关键点:Abort 不可恢复,没有“重新执行”或“继续下一条”的说法。
Fault 和 Trap 都是在指令执行完才进行处理?Abort 呢?
-
Fault:不对。Fault 是在执行过程中发现,CPU 会在指令边界“假装这条指令没执行”,处理完再重新执行。严格说,它的处理发生在“指令完成之前”,但对外表现像是在边界。
-
Trap:是的,Trap 确实是在指令执行完以后才引发。
-
Abort:不是,Abort 不保证落在指令边界。可能在指令中途就终止了,现场无法恢复。
对比总结表
类型 | 检测点 | 处理点 | 返回后执行哪条指令 | 可恢复性 | 典型例子 |
---|---|---|---|---|---|
Fault | 指令执行中 | 指令边界(假装未完成) | 当前指令重试 | 可恢复 | 缺页、除零、段不存在 |
Trap | 指令执行完成后主动触发 | 指令完成后 | 下一条继续 | 本来就正常 | 系统调用、调试断点 |
Abort | 执行任意时刻(严重错误) | 不保证边界,直接停机 | 无法保证 | 不可恢复 | 总线错误、硬件损坏 |
-
Fault:检测在执行中,处理在边界,看起来像“执行完才处理”,但其实是“没执行成功就被打断”;
-
Trap:确实是执行完再处理;
-
Abort:不保证边界,没得商量,直接终止。