中断机制
字数: 0
Interrupt, INTR,I/O 设备的输入和输出操作通常通过中断来实现

中断类型

  • 硬件中断
    • Hardware Interrupts
      由外部电信号引发,应用到处理器的 INTR (Interrupt) 引脚或 NMI (Non-Maskable Interrupt,不可屏蔽中断) 引脚,从而将中断信号传递给 CPU。
  • 软件中断
    • Software Interrupts
      由执行汇编语言的 INT 指令引发的中断,对操作系统中函数的间接调用。
  • 异常中断
    • Exception Interrupts
      由内部错误引发的,如除零错误或内存奇偶校验错误,它们会中断程序的正常流程。

中断请求器

Interrupt Requester, IRQ
作用是向 CPU 发出中断请求,通知 CPU 某个设备需要处理。
通常与可编程中断控制器(Programmable Interrupt Controller, PIC)一起使用。
  • PIC 负责接收来自多个 IRQ 的中断请求,并将它们按优先级转发给 CPU。
  • 通过 IRQ 和 PIC 的协作,系统能够响应并处理多个设备的中断请求,并在适当的时候将 CPU 的执行流转移到中断服务例程上。

中断服务例程

Interrupt Service Routine, ISR
一段与硬件交互的机器码,都以 IRET 指令结束。
用于处理特定事件的子程序,它们用来控制鼠标、键盘、屏幕等设备。
当发生相应的中断时,CPU 会跳转到 ISR 的地址处执行相应的代码。
  • 像 “Hello World” 的普通程序会加载到内存中,执行完后从内存中移除,然而,服务例程需要保留在内存中,以便在硬件事件发生时运行。
属于内存驻留程序 (Terminate and Stay Resident, TSR) 的一种

中断优先级

ISR 可以嵌套 (nest) 执行,具有较低编号的 ISR 具有较高的优先级。

中断号

Interrupt Number
不同的中断号对应着不同的中断事件或中断服务程序
在 x86 架构中
notion image
Intel 8259 是一种 PIC
Intel 8259 是一种 PIC
  • 当主PIC上的 IRQ0 线被激活时,放置在数据总线上的中断号为 8,而不是 0
    • 中断号 0 到 7 被系统保留用于系统中断,例如除零错误、溢出和单步中断。因此,从主PIC 第一个外部中断是中断号 8。

中断向量表

Interrupt Vector Table,用于存储 ISR 的起始位置
当发生中断时,CPU 通过中断号在表中查找对应的中断服务例程的地址。
中断号 (1-15) * 4 = 偏移量,然后加上中断向量表的起始地址,即可得到一个中断向量,对应中断的处理程序的入口地址。
每个中断向量由 4 个字节描述
  • 前两个字节存储 ISR 的 IP
  • 后两个字节存储 CS
notion image

中断描述符表

Interrupt Descriptor Table, IDT
  • 在 INTEL 后续的 32位 CPU 中,使用中断描述符表来代替中断向量表。
  • 每个中断描述符包含了中断处理程序的地址和的特权级别 (Privilege Level) 等信息。

中断流程

  • 硬件通过特定的引脚发送中断请求
  • 当中断控制器(如 8259A)接收 INTR 后,将 INTA (Interrupt Acknowledge signal) 线置为高电平来确认接收到中断请求,然后将中断号放在总数总线上,传输给 CPU。
  • CPU 收到 INTR 后,暂停当前的执行任务,将相关的寄存器及其数值,保存到堆栈中。
    • 通过中断号在向量表中查找跳转地址
    • 执行中断服务程序,直到遇到 IRET 指令
  • IRET 恢复寄存器到原来的值,主程序继续执行。
    • A TSR program is a type of software that remains resident in memory even after its initial execution
    • TSR, Terminate and Stay Resident.
notion image
2023 - 2026