本章中中断一般指硬中断

中断

  • 中断是异步的,

异常

  • 非法指令或其他原因导致当前指令执行失败
  • 异常是同步的,产生和当前执行的指令相关

系统调用

  • 也被称为一种软中断
  • 应用主动发起中断
  • 背后的本质实现是中断
通用概念产生原因
中断硬件异步
异常软件同步

为什么需要中断、异常、系统调用

  • OS内核是被信任的第三方
  • OS内核可以执行特权指令、管理硬件
  • OS内核提供了各种Service

基本概念

  • 源头
    • 中断:外设
    • 异常:应用程序意想不到的行为
    • 系统调用:应用程序请求OS服务
  • 响应方式
    • 中断:同步
    • 异常:异步
    • 系统调用:异步或同步
  • 处理机制
    • 中断:持续,对应用程序透明
    • 异常:杀死或重新执行
    • 系统调用:等待和持续

中断向量表

  • 中断向量表用于建立”中断类型 中断处理程序入口地址”的映射
  • 当 CPU 检测到中断或异常后,会根据中断号/异常号查询中断向量表,从而跳转到对应的中断服务程序(ISR)
  • 表中每个表项称为一个中断向量,本质上记录了对应处理程序的入口信息
  • 不同的中断源、异常类型通常对应不同的向量号,因此可以快速定位处理逻辑
  • 中断向量表一般由操作系统在初始化时设置,内核负责注册和管理各类中断处理程序
  • 处理完中断后,CPU 再根据先前保存的现场信息返回到被打断的程序继续执行

中断处理的基本过程

  • 保存断点和程序运行现场(如程序计数器、程序状态字、部分寄存器)
  • 根据中断号查中断向量表,找到对应的中断服务程序入口
  • 转入内核态执行中断服务程序,完成设备响应、异常处理或系统调用服务
  • 恢复现场,执行中断返回指令,回到原程序断点处继续运行
  • 建立中断服务例程让CPU能响应中断响应并处理中断保存/恢复现场

补充理解

  • 中断向量表解决的核心问题是:发生中断后,CPU 应该去执行哪一段处理代码
  • 若没有中断向量表,CPU 就无法快速区分键盘中断、时钟中断、缺页异常等不同事件
  • 系统调用、异常、硬中断虽然来源不同,但底层都需要借助类似的向量定位机制进入内核处理

Linux系统中的中断

  • 可屏蔽:摄别产生的信号,通过中断控制器与处理器相连、可被暂时屏蔽
  • 不可屏蔽:一些关键硬件的崩溃(内存校验错误)
  • Top half:做最少的工作后返回
    • 最小的、公共行为:保存寄存器、屏蔽其他中断,恢复寄存器、返回原来场景
    • 最重要:调用合适的由硬件驱动提供的中断处理handler
    • 使用将请求放入队列,或者设置标志位将其他处理推迟到bottom half
  • Bottom half:推迟处理
    • 提供一些推迟完成任务的机制
      • softirqs
      • tasklets
      • 工作队列
      • 内核线程
  • 中断处理没有进程上下文
    • 中断(和异常相比)和具体的某条指令无关
    • 也和中断时正在跑的进程、用户程序无关
    • 中断处理handler不能睡眠
  • 一些约束条件
    • 不能睡眠
    • 不能调用schdule()调度
    • 不能释放信号或调用可能睡眠的操作
    • 不能和用户地址空间交换数据

中断向量表

  • 每个处理器都有一份,在内核空间中而不是用户空间
  • 每个进程/线程都有两个栈:用户栈and内核栈