前言

异常控制流(Exceptional Control Flow, ECF) 是指程序执行过程中,因硬件或软件事件触发的、偏离正常顺序 / 分支 / 循环逻辑的控制流跳转机制。它区别于由指令直接定义的 “正常控制流”,是操作系统实现硬件交互、错误处理、多任务并发的核心基础,贯穿硬件层软件层两个维度。

异常处理

类别

原因

异步/同步

返回行为

中断 Interrupt

来自I/O设备的信号

异步

总是返回到下一条指令

陷阱 Trap

有意的异常

同步

总是返回到下一条指令

故障 Fault

潜在可恢复的错误

同步

可能返回到当前指令

终止 Abort

不可恢复的错误

同步

不会返回

注:

  • 陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用

    • 例如,执行 syscall 指令会导致一个到异常处理程序的陷阱

  • 故障可能能够被故障处理程序修正,否则则会返回到内核中的 abort 例程

  • 终止通常是一些硬件错误

Linux 中的异常

异常号

描述

异常类别

0

除法错误

故障

13

一般保护故障

故障

14

缺页

故障

18

机器检查

终止

32~255

操作系统定义的异常

中断或陷阱

故障和终止:

  • 除法错误:Unix 不会从除法错误中恢复,而是选择终止程序

  • 一般保护故障:通常是因为一个程序引用了一个未定义的虚拟内存区域,或者因为程序试图写一个只读的文本段。

  • 缺页:处理程序将适当的磁盘上虚拟内存的一个页面映射到物理内存的一个页面,然后重新执行故障指令。

  • 机器检查:检测到致命的硬件错误时发生,不返回。

系统调用:

  • 比如,C 语言可以用 syscall 函数调用任何的系统调用,通过一条称为 syscall 的陷阱指令来提供的。注意,不是通过栈传递参数:%rax 包含系统调用号,%rdi%rsi%rdx%r10%r8%r9 最多 6 个参数;在返回时,会破坏 %rcx%r11 这两个寄存器,%rax 包含返回值。


参考资料:

  1. 《深入理解计算机系统》P501~507