1171 字
6 分钟
中断

(X86指令集的)分类#

类型异步同步断点
中断异步外部设备发送的中断请求下一条指令
异常故障同步除0故障,页故障重新执行发生故障的指令
异常陷阱同步系统调用,单步追踪,断点调试下一条指令
异常终止同步硬件故障程序终止

中断向量#

操作系统注册的一张中断处理程序的程序入口表,发生中断时,硬件自动分发到对应的处理程序。不使用中断向量时则使用软件手动分发到具体的处理函数

中断屏蔽#

(外部)中断分为可屏蔽中断与不可屏蔽中断,通过控制总线INTR线发出的中断可以被中断屏蔽字寄存器中断使能寄存器屏蔽(仅当中断被使能且该中断没有被屏蔽字寄存器屏蔽才会响应请求),通过控制总线的NMI线发出的中断请求是不可被屏蔽的。

中断判优#

有多个中断请求时,优先处理那个中断请求,决定了中断的响应优先级 从上到下优先级依次降低

  • DMA申请访问内存请求 不是中断,但是优先级高于一切中断
  • 不可屏蔽的外部中断
  • 内部异常
    • 故障
    • 陷阱
  • 可屏蔽中断
    • dma中断请求
    • io传送类的请求
      • 高速 > 低速
      • 输入 > 输出
      • 实时 > 普通

中断嵌套#

允许在中断处理程序中响应新的中断

中断处理优先级#

允许每一个中断源有自己的屏蔽字,当执行对应的中断处理程序时把屏蔽字设置为自己的屏蔽字,对于处理优先级比自己高的不屏蔽,优先级比自己低(对本中断源也一般是屏蔽的)的屏蔽(一般1表示屏蔽、0表示允许中断)。那么优先级高的就会抢占优先级低的执行权,在处理完毕后才把执行权返回给低优先级中断。就能灵活地调整中断处理程序的处理优先级。

(典型的外部)中断处理流程#

flowchart TB A[执行指令] --> B[指令结束] --> C{有中断请求?} C -- N --> A subgraph zhongduan [中断响应] direction TB subgraph yingjianyinzhilin [硬件隐指令] direction TB D[关中断] --> E[保存断点] --> F[中断程序寻址] end subgraph zhongduanchengxu [中断程序] direction TB G["保存上下文(屏蔽字)"] --> X[开中断] --> H[运行中断服务] --> Y[关中断]--> I[恢复上下文] --> Z[开中断] --> J["中断返回(reti)"] end yingjianyinzhilin --> zhongduanchengxu end C -- Y --> zhongduan zhongduan --> A
  • cpu在每一条指令的结束后检查是否有无不被屏蔽的中断请求(不可屏蔽或者是可屏蔽但是允许中断)
  • 如果有多个可响应的中断则根据中断判优顺序按顺序处理
  • 中断隐指令 硬件实现,不需要在程序中显式给出,逻辑上表现的像一条指令一样
    • 中断触发器对应位置0
    • 关中断 置中断使能寄存器为0
    • 保存断点 把返回后要执行的指令的地址(如果是内部故障则是当前发生故障的指令的地址从而重新执行)与PSW压入堆栈或者是保存到一个寄存器中
    • 中断寻址 根据中断向量表跳转到对应中断处理函数的入口地址,或者在软件查询中跳转到总的处理程序入口地址,处理程序再根据中断类型号分发到具体的处理函数
  • 中断程序
    • 准备阶段
      • 保存上下文和中断屏蔽字
      • 打开中断使能寄存器从而支持中断嵌套
    • 正式执行处理程序
    • 收尾
      • 关中断
      • 恢复上下文
      • 开中断
      • 返回 可以用reti指令同时完成开中断与返回
  • 类比普通的函数调用

其他#

中断相关寄存器#

  • 中断使能寄存器
  • 中断屏蔽字
  • 中断请求标志寄存器 中断源对应位为1表示该中断源发起中断请求

总线#

  • 中断请求与响应是在控制总线上传递的
  • 中断类型号在数据总线上传递的

系统调用#

系统调用过程