本章中中断一般指硬中断
中断
- 中断是异步的,
异常
- 非法指令或其他原因导致当前指令执行失败
- 异常是同步的,产生和当前执行的指令相关
系统调用
- 也被称为一种软中断
- 应用主动发起中断
- 背后的本质实现是中断
| 通用概念 | 产生原因 | |
|---|---|---|
| 中断 | 硬件异步 | |
| 异常 | 软件同步 |
为什么需要中断、异常、系统调用
- OS内核是被信任的第三方
- OS内核可以执行特权指令、管理硬件
- OS内核提供了各种Service
基本概念
- 源头
- 中断:外设
- 异常:应用程序意想不到的行为
- 系统调用:应用程序请求OS服务
- 响应方式
- 中断:同步
- 异常:异步
- 系统调用:异步或同步
- 处理机制
- 中断:持续,对应用程序透明
- 异常:杀死或重新执行
- 系统调用:等待和持续
中断向量表
- 中断向量表用于建立”中断类型 → 中断处理程序入口地址”的映射
- 当 CPU 检测到中断或异常后,会根据中断号/异常号查询中断向量表,从而跳转到对应的中断服务程序(ISR)
- 表中每个表项称为一个中断向量,本质上记录了对应处理程序的入口信息
- 不同的中断源、异常类型通常对应不同的向量号,因此可以快速定位处理逻辑
- 中断向量表一般由操作系统在初始化时设置,内核负责注册和管理各类中断处理程序
- 处理完中断后,CPU 再根据先前保存的现场信息返回到被打断的程序继续执行
中断处理的基本过程
- 保存断点和程序运行现场(如程序计数器、程序状态字、部分寄存器)
- 根据中断号查中断向量表,找到对应的中断服务程序入口
- 转入内核态执行中断服务程序,完成设备响应、异常处理或系统调用服务
- 恢复现场,执行中断返回指令,回到原程序断点处继续运行
- 建立中断服务例程→让CPU能响应中断→响应并处理中断→保存/恢复现场
补充理解
- 中断向量表解决的核心问题是:发生中断后,CPU 应该去执行哪一段处理代码
- 若没有中断向量表,CPU 就无法快速区分键盘中断、时钟中断、缺页异常等不同事件
- 系统调用、异常、硬中断虽然来源不同,但底层都需要借助类似的向量定位机制进入内核处理
Linux系统中的中断
- 可屏蔽:摄别产生的信号,通过中断控制器与处理器相连、可被暂时屏蔽
- 不可屏蔽:一些关键硬件的崩溃(内存校验错误)
- Top half:做最少的工作后返回
- 最小的、公共行为:保存寄存器、屏蔽其他中断,恢复寄存器、返回原来场景
- 最重要:调用合适的由硬件驱动提供的中断处理handler
- 使用将请求放入队列,或者设置标志位将其他处理推迟到bottom half
- Bottom half:推迟处理
- 提供一些推迟完成任务的机制
- softirqs
- tasklets
- 工作队列
- 内核线程
- 提供一些推迟完成任务的机制
- 中断处理没有进程上下文
- 中断(和异常相比)和具体的某条指令无关
- 也和中断时正在跑的进程、用户程序无关
- 中断处理handler不能睡眠
- 一些约束条件
- 不能睡眠
- 不能调用
schdule()调度 - 不能释放信号或调用可能睡眠的操作
- 不能和用户地址空间交换数据
中断向量表
- 每个处理器都有一份,在内核空间中而不是用户空间
- 每个进程/线程都有两个栈:用户栈and内核栈