在Linux内核中,异常(Exception)指由CPU在执行指令过程中检测到的非预期事件。这些事件通常与硬件或指令执行直接相关(如除零错误、无效内存访问),会强制CPU暂停当前任务并跳转到预设的异常处理程序,由内核介入处理以决定进程的后续行为(终止、恢复或发送信号)。

异常与中断(Interrupt)的核心区别在于触发源:
- 异常由CPU内部事件(指令错误、硬件故障)触发,是同步的;
- 中断由外部设备触发(如键盘输入、时钟信号),是异步的。
| 异常类型(x86架构) | 向量号 | 触发原因 | Linux处理方式 |
|---|---|---|---|
| Divide Error | 0 (0x0) | 除数为零或商溢出 | 向进程发送SIGFPE信号 |
| Page Fault | 14 (0x0E) | 无效内存访问(缺页/权限错误) | 触发缺页中断处理程序(可能OOM Kill进程) |
| General Protection Fault | 13 (0x0D) | 非法操作(如用户态访问内核内存) | 发送SIGSEGV信号终止进程 |
| Double Fault | 8 (0x8) | 异常处理过程中再次发生异常 | 触发内核panic(严重系统错误) |
| Invalid Opcode | 6 (0x6) | 执行未定义指令 | 发送SIGILL信号 |
Linux异常处理流程:
1. 硬件检测:CPU执行指令时识别异常条件
2. 上下文保存:将寄存器状态压入内核栈
3. 查表跳转:通过中断描述符表(IDT)定位处理函数
4. 内核处理:调用对应的处理例程(如do_page_fault)
5. 结果反馈:恢复执行、终止进程或发送信号(通过signal机制)
扩展相关内容:
- 信号(Signal)机制:内核常将异常转换为信号(SIGSEGV/SIGFPE)通知进程
- Oops与Panic:内核态异常可能触发Oops(打印诊断信息)或Kernel Panic(系统崩溃)
- 调试支持:使用perf或trace-cmd可监控异常事件,crash工具分析内核转储(vmcore)
- ARM架构差异:ARM中使用异常级别(EL0-EL3)和异步异常概念替代传统中断/异常分类
注:异常处理性能直接影响系统稳定性,Linux实现了异常嵌套控制、IST(Interrupt Stack Table)等机制确保关键异常不被中断。

查看详情

查看详情