中断与异常

中断/异常机制

中断/异常 对于操作系统的重要性就好比:汽车的发动机、飞机的引擎

可以说操作系统是由“中断驱动”或者 “事件驱动”的

概念

  • CPU对系统发生的某个事件作出的一种反应

  • CPU暂停正在执行的程序,保留现场后自动转去执行相应事件的处理程序,处理完成后返回断点,继续执行被打断的程序

主要作用

  • 及时处理设备发来的中断请求

  • 可使OS捕获用户程序提出的服务请求

  • 防止用户程序执行过程中的破坏性活动

  • …… 等等

历史背景——为什么引入中断与异常

中断的引入:为了支持CPU和设备之间的并行操作

  • 当CPU启动设备进行输入/输出后,设备便可以独立工作, CPU转去处理与此次输入/输出不相关的事情;当设备完成输入/输出后,通过向CPU发中断报告此次输入/输出的结 果,让CPU决定如何处理以后的事情

异常的引入:表示CPU执行指令时本身出现的问题

  • 如算术溢出、除零、取数时的奇偶错,访存地址时越界或执行了“陷入指令” 等,这时硬件改变了CPU当前的执行流程,转到相应的错误处理程序或异常处理程序或执行系统调用

类别

类别

原因

异步/同步

返回行为

中断(Interrupt)

来自I/O设备、其他硬件部件

异步

总是返回到下一条指令

异常 - 陷入(Trap)

有意识安排的

同步

返回到下一条指令

异常 - 故障(Fault)

可恢复的错误

同步

返回到当前指令

异常 - 终止(Abort)

不可恢复的错误

同步

不会返回

事件

  • 事件

    • 中断(外中断):外部事件,正在运行的 程序所不期望的

      • I/O中断

      • 时钟中断

      • 硬件故障

    • 异常(内中断):由正在执行的指令引发

      • 系统调用

      • 页故障/页错误

      • 保护性异常

      • 断点指令

      • 其他程序性异常 (如算术溢出等)

工作原理

中断/异常机制是现代计算机系统的核心机制之一;硬件和软件相互配合而使计算机系统得以充分发挥能力

硬件该做什么事? —— 中断/异常响应

捕获中断源发出的中断/异常请求,以一定方式响应,将处理器控制权交给特定的处理程序

软件要做什么事? —— 中断/异常处理程序

识别中断/异常类型并完成相应的处理

中断向量表

中断向量

一个内存单元,存放中断处理程序入口地址和程序运行时所需的处理机状态字。

Linux 中的中断向量表

中断响应

  1. 设备发出中断信号

  2. 硬件保存原程序现场并暂停原程序的执行

  3. 根据中断码查询中断向量表

  4. 把中断处理程序入口地址等推送到相应的寄存器

  5. 执行中断处理程序

  6. 恢复现场,返回被事件打断的程序

实例:X86处理器对中断/异常的支持

  • 中断

    • 由硬件信号引发的,分为可屏蔽和不可屏蔽中断

  • 异常

    • 由指令执行引发的,比如除零异常

    • 80x86处理器发布了大约20种不同的异常

    • 对于某些异常,CPU会在执行异常处理程序之前产生硬件出错码,并压入内核态堆栈

  • 系统调用

    • 异常的一种,用户态到内核态的唯一入口

中断向量表/中断描述符表

实模式:中断向量表 (Interrupt Vector)

  • 存放中断服务程序的入口地址

    • 入口地址=段地址左移4位+偏移地址

    • 不支持CPU运行状态切换

    • 中断处理与一般的过程调用相似

保护模式:中断描述符表 (Interrupt Descriptor Table)

  • 采用门(gate) 描述符数据结构表示中断向量

在保护模式下,中断描述符表(IDT)中的每个表项由8个字节组成,其中的每个表项叫做一个门描述符(Gate Descriptor), “门”的含义是指当中断发生时必须先访问这些“门”,能够“开门”(即将要进行的处理需通过特权检查,符合设定的权限等约束)后,然后才能进入相应的处理程序。而门描述符则描述了“门”的属性(如特权级、段内偏移量等)。

四种类型门描述符

  • 任务门(Task Gate)

  • 中断门(Interrupt Gate)

    • 给出段选择符 (Segment Selector)、中断/异常程序的段内偏移量 (Offset)

    • 通过中断门后系统会自动禁止中断

  • 陷阱门(Trap Gate)

    • 与中断门类似,但通过陷阱门后系统不会自动 禁止中断

  • 调用门(Call Gate)

中断控制器(PIC或APIC)

负责将硬件的中断信号转换为中断向量,并引发 CPU 中断

最后更新于