操作系统 中断是什么
中断是硬件或软件发出的信号,当一个进程或事件需要立即处理时。它通知处理器需要中断当前正在执行的工作进程,处理一个高优先级的进程。在I/O设备中,一个总线控制线被专门用于此目的,被称为 中断服务例程 (ISR)。
当设备在进程中发出中断信号时,处理器首先完成当前指令的执行。然后它把 程序计数器 (PC)加载到ISR的第一条指令的地址上。在加载程序计数器之前,被中断指令的地址被移动到临时位置。因此,在处理完中断后,处理器可以继续执行进程。
在处理中断时,处理器必须通知设备其请求已被识别并停止发送中断请求信号。此外,保存寄存器以便将来可以恢复中断的进程会增加中断接收和ISR执行开始之间的延迟。这被称为 中断延迟 。
一台计算机一次只能执行一个计算机指令。但是,由于它可以被中断,它可以管理程序或一组指令的执行方式。这被称为多任务处理。它允许用户同时进行许多不同的操作,计算机负责管理用户启动的程序。当然,计算机的运行速度使得所有用户任务似乎在同时进行。
操作系统通常有一些代码被称为中断处理程序。中断处理程序为中断设置优先级,并且如果有多个中断等待处理,则将其保存在队列中。操作系统还有一个被称为调度程序的小程序,它决定下一个要控制的程序。
中断的类型
中断信号可能是响应硬件或软件事件发出的。分别被分类为硬件中断或软件中断。
1. 硬件中断
硬件中断是与硬件状态相关的一种条件,可以由外部硬件设备发出信号,例如PC上的中断请求(IRQ)线,或者由嵌入在处理器逻辑中的设备检测到,以通知操作系统该设备需要注意。例如,按下键盘键或移动鼠标会触发硬件中断,使处理器读取按键或鼠标位置。
硬件中断可以异步到达处理器时钟,并且可以在指令执行过程中的任何时间到达。因此,所有硬件中断信号都会通过将它们与处理器时钟同步,并仅在指令执行边界处发挥作用。
在许多系统中,每个设备都与特定的IRQ信号相关联。这使得可以快速确定哪个硬件设备正在请求服务,并加快对该设备的服务。
在一些旧系统上,所有中断都发送到同一个位置,操作系统使用专门的指令确定最高优先级的未屏蔽中断。在现代系统中,通常为每种类型的中断或每个中断源实现一个或多个中断向量表,从而产生了一个独特的中断例程。硬件中断进一步分为两种类型,如下:
- 可屏蔽中断: 处理器通常具有内部中断屏蔽寄存器,允许选择性地启用和禁用硬件中断。每个中断信号与屏蔽寄存器中的一个位相关联;在某些系统上,当位被设置时,中断被启用,当位被清除时,中断被禁用,而在其他系统上,设置的位会禁用中断。当中断被禁用时,处理器将忽略相关联的中断信号。受屏蔽影响的信号被称为 可屏蔽中断 。 屏蔽寄存器不会影响某些中断信号,因此不能被禁用;这些被称为 非可屏蔽中断 (NMI)。非可屏蔽中断表示需要立即处理并且在任何情况下都不能忽略的高优先级事件,例如来自看门狗定时器的超时信号。 屏蔽中断即为禁用中断,解屏蔽中断即为启用中断。
- 虚假中断: 虚假中断是一种找不到源的硬件中断。也可以使用幽灵中断或幻影中断来描述这种现象。当一个系统运行不正常时,虚假中断往往是与连接到电平敏感处理器输入的有线“或”中断电路有关的问题。当系统运行不正常时,这些中断可能很难识别。 在有线“或”电路中,由于中断线的偏置电阻通过寄生电容充放电,导致处理器在识别中断源已被清除之前会有一小段延迟。如果在中断服务例程(ISR)的当前实例终止之前,中断设备的清除太晚,那么中断电路将没有足够的时间返回到静态状态。结果是处理器会认为另一个中断是待处理状态,因为其中断请求输入的电压不够高或低以建立明确的内部逻辑1或逻辑0。这种明显的中断没有可识别的来源,因此被称为虚假中断。 如果ISR没有考虑到可能发生这种中断,虚假中断可能导致系统死锁或其他未定义的操作。由于虚假中断主要是有线“或”中断电路的问题,在此类系统中的良好编程实践是让ISR检查所有中断源的活动情况,如果没有中断源则不采取任何操作。
2. 软件中断
处理器在执行特定指令或满足特定条件时请求软件中断。每个软件中断信号都与特定的中断处理程序相关联。
可以通过执行触发中断的特殊指令来有意地引发软件中断。此类指令类似于子程序调用,并用于各种目的,例如请求操作系统服务和与设备驱动程序交互。
软件中断也可能由程序执行错误意外触发。这些中断通常被称为 陷阱 或 异常 。
处理多个设备
当多个设备引发中断请求信号时,需要额外的信息来决定选择哪个设备优先考虑。以下方法用于决定首选设备:
- 轮询 在轮询中,首先遇到设置了IRQ位的设备将被优先服务,并调用相应的ISR来服务该设备。这种方法易于实现,但通过查询所有设备的IRQ位会浪费大量时间。
- 向量中断 在向量中断中,请求中断的设备通过总线直接向处理器发送特殊代码来标识自己。这使得处理器可以识别生成中断的设备。特殊代码可以是ISR的起始地址,或者ISR所在内存的位置,被称为 中断向量 。
- 中断嵌套 在这种方法中,I/O设备按优先级结构组织。因此,只有来自较高优先级设备的中断请求才会被识别,低优先级设备则不会。处理器仅接受优先级大于自身的设备/进程的中断。处理器的优先级被编码在PS(进程状态寄存器)的几个位中,且可以通过编写PS的程序指令进行更改。处理器只在执行操作系统例程时处于监控模式,并在执行应用程序之前切换到用户模式。
中断处理
我们知道指令周期包括取指、译码、执行和读/写功能。每个指令周期结束后,处理器会检查是否有待处理的中断。如果系统中没有中断,处理器将进行下一个指令周期,由指令寄存器给出。如果存在中断,则会触发中断处理程序。处理程序将停止当前正在进行的指令,并将其配置保存在寄存器中,然后从由中断向量表给出的位置加载中断的程序计数器。
处理器处理完中断后,中断处理程序将从保存的寄存器中加载指令及其配置。进程将从中断被中断的地方开始执行。这样可以保存旧的指令处理配置,并且加载新的中断配置也被称为 上下文切换 。存在不同类型的中断处理程序。
- 一级中断处理程序 (FLIH)是硬中断处理程序或快速中断处理程序。这些中断处理程序在进程执行时具有更多的抖动,并且它们主要是可屏蔽中断。
- 二级中断处理程序 (SLIH)是软中断处理程序和较慢的中断处理程序。这些中断处理程序的抖动较小。
中断处理程序也称为中断服务例程(ISR)。ISR的主要特点是
- 中断可以随时发生,并且它们是异步的,ISR可以调用异步中断。
- 中断服务机制可以从多个来源调用ISR。
- ISR可以处理可屏蔽和不可屏蔽中断。程序中的一条指令可以禁用或启用中断处理程序调用。
- 在执行开始时,ISR将禁用其他设备的中断服务。在完成ISR执行后,它将重新初始化中断服务。
- 在ISR中允许嵌套中断以转向其他ISR。
中断延迟
当中断发生时,执行ISR服务的上下文切换可能不会立即开始。中断发生和ISR执行开始之间的时间间隔被称为中断延迟。
- Tswitch = 上下文切换所需的时间
- ΣTexec = 执行ISR所需时间间隔的总和
- 中断延迟 = Tswitch + ΣTexec
计算机如何响应中断
了解操作系统工作原理的关键是了解中断发生时CPU的操作。CPU硬件对每个中断都执行相同的操作,使操作系统可以从当前正在运行的用户进程中取得控制权。将正在运行的进程切换到执行来自操作系统内核的代码被称为上下文切换。
CPU依靠几个寄存器中的数据来正确处理中断。一个寄存器保存了指向当前运行进程的进程控制块的指针,每次将进程加载到内存时,该寄存器都会被设置。另一个寄存器保存了指向包含中断处理程序和系统调用的OS内核指令的指针表的指针。该寄存器的值和表中的内容是在操作系统启动时进行初始化的。CPU对中断的响应执行以下操作:
- 使用指向当前进程控制块的指针,保存状态和所有寄存器的值,以便在稍后重新启动进程时使用。
- 将CPU模式位切换为超级用户模式。
- 使用中断处理程序表指针和中断向量,确定要执行的内核代码的位置。中断向量是硬件中断的IRQ和软件中断的中断汇编语言指令的参数。
- 切换处理到内核的相应部分。
CPU使用表格和中断向量来查找操作系统在响应中断时要执行的代码。下图中显示了一个软件中断。
计算机运行时,处理过程在硬件和软件中断接收到的时候在用户进程和操作系统之间进行切换。
触发方法
每个中断信号输入被设计为由逻辑信号电平或特定信号边沿(电平转换)触发。电平敏感输入在将特定(高或低)逻辑电平应用于输入时持续请求处理器服务。边沿敏感输入对信号边沿做出反应:特定(上升或下降)边沿将导致触发服务请求。当中断处理程序执行时,处理器将复位触发器。
1. 水平触发
水平触发中断是通过保持中断信号在特定的活动逻辑电平上请求的。设备通过将信号驱动到并保持在活动电平上来调用水平触发中断。通常在设备得到服务后,处理器会在命令后否定该信号。
处理器在每个指令周期中采样中断输入信号。如果在采样发生时信号被断言,则处理器将认可该中断请求。
水平触发的输入允许多个设备通过有线或连接共享一个公共中断信号。处理器轮询以确定哪些设备正在请求服务。在为一个设备提供服务之后,处理器可能再次轮询,并在退出中断服务程序之前为其他设备提供服务(如果有必要)。
2. 边沿触发
边沿触发中断是一种由中断线上的电平转换(下降沿或上升沿)发出的中断信号。希望发出中断信号的设备将脉冲驱动到线上并将其释放到非活动状态。如果脉冲太短以致无法被轮询I/O检测到,则可能需要特殊的硬件来检测它。