CPU 中断处理¶
概述¶
在计算机系统中,中断是一种机制,用于打破 CPU 的正常执行流程,以响应特定事件或条件。中断是操作系统与硬件之间进行通信的重要手段。它允许外部设备或系统事件通知 CPU 有关状态的变化。通过中断,操作系统能够实时响应外部事件,例如设备的输入输出、时钟中断等。在 x86-64 架构下,中断主要分为硬件中断和软件中断两类:
-
硬件中断
硬件中断是由外部设备或硬件引发的中断。这包括了各种设备,如键盘、鼠标、网络接口卡等。硬件中断通常通过中断控制器向 CPU 发送中断信号。
-
软件中断
软件中断是由程序执行中的特殊指令触发的中断。在 x86-64 架构中,软件中断通过
int
及其相关指令实现。软件中断通常用于系统调用,允许用户空间程序请求内核提供的服务。
中断(Interrupt)和异常(Exception)在 x86-64 架构下的区别
-
中断是一种通常由 I/O 设备触发的异步事件,它会终止 CPU 的指令执行流程,通知 CPU 有关状态的变化。
-
异常是在处理器在执行指令时,检测到的一个或多个预定义条件生成的同步事件。IA-32 体系结构规定了三类异常:故障(faults)、陷阱(traps)和中止(aborts)。
尽管有以上区别,但是在 x86-64 架构的软件侧,它们的处理过程是相同的。
总的来说,中断的作用可以总结为以下几点:
-
异常处理
中断还用于处理系统中的异常情况,例如除零错误、非法内存访问等。
通过中断,操作系统可以捕获这些异常并采取适当的措施,确保系统的稳定性。
-
节省 CPU 资源
使用中断可以避免 CPU 不断轮询外部设备的状态。
当设备有数据准备好时,它会触发中断,使得 CPU 可以专注于其他任务,提高系统效率。
当你有了智能手环,就不需要频繁查阅手机通知了!
-
实时响应事件
中断允许计算机系统实时响应外部设备或事件的状态变化。
例如,当用户按下键盘上的某个键时,键盘控制器可以发出一个中断信号,通知 CPU 有输入事件发生。
中断服务例程¶
中断服务例程(Interrupt Service Routine,ISR)是中断处理过程的核心部分,负责实际处理中断事件。由前介绍,不同的中断处理程序对应不同的中断表项,处理不同的中断情况。基于中断响应过程提供的系统上下文,中断服务例程包含了具体的处理逻辑,可能涉及与硬件设备的通信、数据处理、状态更新等操作。
值得注意的是,中断服务例程可能包含一些临界区(Critical Section),即一段在执行期间不能被其他中断打断的指令或程序。
为了确保系统的正确性和稳定性,中断服务例程通常需要使用进行同步,如禁用中断(即所谓关中断)或使用互斥锁来保护临界区。
中断的处理过程¶
基于以上介绍,我们可以总结出中断的处理过程:
-
触发中断
中断可以由硬件(硬件中断)或软件(软件中断)引发。除了我们主动调用中断或硬件产生中断外,CPU 每执行完一条指令后,CPU 还会检查中断控制器,看看是否有中断请求。
-
保存当前状态(上下文)
在处理中断之前,CPU 会保存当前的执行状态,包括寄存器内容、标志寄存器等。
在处理 trap 时,有可能会改变系统的状态。所以在真正处理 trap 之前,我们有必要对系统的当前状态进行保存,在处理完成之后,我们再将系统恢复至原先的状态,就可以确保之前的程序继续正常运行。
这里的系统状态通常是指寄存器,这些寄存器也叫做 CPU 的上下文(Context),现代操作系统常常将 CPU 的上下文保存在内核栈中。
-
查找中断描述符
CPU 根据中断向量号在 IDT 中查找对应的中断门描述符(Interrupt Gate Descriptor)。
与 IDT 有关的细节可以查阅 x64 数据结构概述中的介绍。
-
执行中断处理程序
CPU 跳转到中断门描述符指定的中断处理程序的入口地址,开始执行中断处理代码。
-
中断处理程序执行
中断处理程序负责处理特定中断类型。它可能包括设备输入输出、异常处理、系统调用等。
-
恢复状态
中断处理程序执行完毕后,CPU 从内核栈恢复之前保存的状态,继续执行被中断的程序。
这一过程中有一系列特殊指令和调用约束(Calling Convention)如在 x86_64 下需要通过
iretq
指令来恢复状态。
常见的中断¶
以下是一些常见的中断类型:
-
时钟中断(Clock Interrupt)
由系统定时器触发,常作为任务调度和时间片轮转的依据。由系统定时器触发,常作为任务调度和时间片轮转的依据,是抢占式操作系统进行任务调度的核心中断。
从实现的角度来说,时钟中断是一个周期性的硬件中断,由可编程中断控制器(PIC)的计时器通过 IRQ 线触发。
-
硬件设备中断(Hardware Interrupt)
由硬件设备触发,例如键盘、鼠标、磁盘等设备产生的中断,通知系统有新的数据或事件需要处理。
-
软件异常中断(Software Exception Interrupt)
一些软件生成的异常,如调试中断、断点中断等,用于调试和程序跟踪。
-
NMI 中断(Non-Maskable Interrupt)
一种高优先级的中断,通常用于处理严重系统错误,无法被屏蔽。
-
IRQ 中断(Interrupt Request)
用于连接外部硬件设备的中断,包括可编程中断控制器(PIC)的 IRQ 线。
结论¶
在抢占式架构中,中断是抢占式操作系统与硬件之间进行通信的关键机制,通过合理设计和配置中断描述表(IDT)系统能够高效地响应各类中断事件。
了解中断的作用、中断的分类以及中断的处理过程,有助于理解计算机系统中的事件处理机制,为系统设计和调试提供基础支持。