跳转至

CPU 中断处理

概述

在计算机系统中,中断是一种机制,用于打破 CPU 的正常执行流程,以响应特定事件或条件。中断是操作系统与硬件之间进行通信的重要手段。它允许外部设备或系统事件通知 CPU 有关状态的变化。通过中断,操作系统能够实时响应外部事件,例如设备的输入输出、时钟中断等。在 x86-64 架构下,中断主要分为硬件中断和软件中断两类:

  1. 硬件中断

    硬件中断是由外部设备或硬件引发的中断。这包括了各种设备,如键盘、鼠标、网络接口卡等。硬件中断通常通过中断控制器向 CPU 发送中断信号。

  2. 软件中断

    软件中断是由程序执行中的特殊指令触发的中断。在 x86-64 架构中,软件中断通过 int 及其相关指令实现。软件中断通常用于系统调用,允许用户空间程序请求内核提供的服务。

中断(Interrupt)和异常(Exception)在 x86-64 架构下的区别

  • 中断是一种通常由 I/O 设备触发的异步事件,它会终止 CPU 的指令执行流程,通知 CPU 有关状态的变化。

  • 异常是在处理器在执行指令时,检测到的一个或多个预定义条件生成的同步事件。IA-32 体系结构规定了三类异常:故障(faults)、陷阱(traps)和中止(aborts)。

尽管有以上区别,但是在 x86-64 架构的软件侧,它们的处理过程是相同的。

总的来说,中断的作用可以总结为以下几点:

  1. 异常处理

    中断还用于处理系统中的异常情况,例如除零错误、非法内存访问等。

    通过中断,操作系统可以捕获这些异常并采取适当的措施,确保系统的稳定性。

  2. 节省 CPU 资源

    使用中断可以避免 CPU 不断轮询外部设备的状态。

    当设备有数据准备好时,它会触发中断,使得 CPU 可以专注于其他任务,提高系统效率。

    当你有了智能手环,就不需要频繁查阅手机通知了!

  3. 实时响应事件

    中断允许计算机系统实时响应外部设备或事件的状态变化

    例如,当用户按下键盘上的某个键时,键盘控制器可以发出一个中断信号,通知 CPU 有输入事件发生。

中断服务例程

中断服务例程(Interrupt Service Routine,ISR)是中断处理过程的核心部分,负责实际处理中断事件。由前介绍,不同的中断处理程序对应不同的中断表项,处理不同的中断情况。基于中断响应过程提供的系统上下文,中断服务例程包含了具体的处理逻辑,可能涉及与硬件设备的通信、数据处理、状态更新等操作。

值得注意的是,中断服务例程可能包含一些临界区(Critical Section),即一段在执行期间不能被其他中断打断的指令或程序。

为了确保系统的正确性和稳定性,中断服务例程通常需要使用进行同步,如禁用中断(即所谓关中断)或使用互斥锁来保护临界区。

中断的处理过程

基于以上介绍,我们可以总结出中断的处理过程:

  1. 触发中断

    中断可以由硬件(硬件中断)或软件(软件中断)引发。除了我们主动调用中断或硬件产生中断外,CPU 每执行完一条指令后,CPU 还会检查中断控制器,看看是否有中断请求。

  2. 保存当前状态(上下文)

    在处理中断之前,CPU 会保存当前的执行状态,包括寄存器内容、标志寄存器等。

    在处理 trap 时,有可能会改变系统的状态。所以在真正处理 trap 之前,我们有必要对系统的当前状态进行保存,在处理完成之后,我们再将系统恢复至原先的状态,就可以确保之前的程序继续正常运行。

    这里的系统状态通常是指寄存器,这些寄存器也叫做 CPU 的上下文(Context),现代操作系统常常将 CPU 的上下文保存在内核栈中。

    在中断触发前使用的栈和中断上下文保存的栈是同一个吗?

    如果不是,那么中断上下文保存的栈是如何分配、切换的呢?

    请查阅 x64 数据结构概述 中关于 TSS 的介绍,思考一下这个问题。

  3. 查找中断描述符

    CPU 根据中断向量号在 IDT 中查找对应的中断门描述符(Interrupt Gate Descriptor)。

    与 IDT 有关的细节可以查阅 x64 数据结构概述中的介绍。

  4. 执行中断处理程序

    CPU 跳转到中断门描述符指定的中断处理程序的入口地址,开始执行中断处理代码。

  5. 中断处理程序执行

    中断处理程序负责处理特定中断类型。它可能包括设备输入输出、异常处理、系统调用等。

  6. 恢复状态

    中断处理程序执行完毕后,CPU 从内核栈恢复之前保存的状态,继续执行被中断的程序。

    这一过程中有一系列特殊指令和调用约束(Calling Convention)如在 x86_64 下需要通过 iretq 指令来恢复状态。

常见的中断

以下是一些常见的中断类型:

  1. 时钟中断(Clock Interrupt)

    由系统定时器触发,常作为任务调度和时间片轮转的依据。由系统定时器触发,常作为任务调度和时间片轮转的依据,是抢占式操作系统进行任务调度的核心中断。

    从实现的角度来说,时钟中断是一个周期性的硬件中断,由可编程中断控制器(PIC)的计时器通过 IRQ 线触发。

  2. 硬件设备中断(Hardware Interrupt)

    由硬件设备触发,例如键盘、鼠标、磁盘等设备产生的中断,通知系统有新的数据或事件需要处理。

  3. 软件异常中断(Software Exception Interrupt)

    一些软件生成的异常,如调试中断、断点中断等,用于调试和程序跟踪。

  4. NMI 中断(Non-Maskable Interrupt)

    一种高优先级的中断,通常用于处理严重系统错误,无法被屏蔽。

  5. IRQ 中断(Interrupt Request)

    用于连接外部硬件设备的中断,包括可编程中断控制器(PIC)的 IRQ 线。

结论

在抢占式架构中,中断是抢占式操作系统与硬件之间进行通信的关键机制,通过合理设计和配置中断描述表(IDT)系统能够高效地响应各类中断事件。

了解中断的作用、中断的分类以及中断的处理过程,有助于理解计算机系统中的事件处理机制,为系统设计和调试提供基础支持。