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 架构中
- 当主PIC上的 IRQ0 线被激活时,放置在数据总线上的中断号为 8,而不是 0
中断号 0 到 7 被系统保留用于系统中断,例如除零错误、溢出和单步中断。因此,从主PIC 第一个外部中断是中断号 8。
中断向量表
Interrupt Vector Table,用于存储 ISR 的起始位置
当发生中断时,CPU 通过中断号在表中查找对应的中断服务例程的地址。
中断号 (1-15) * 4 = 偏移量,然后加上中断向量表的起始地址,即可得到一个中断向量,对应中断的处理程序的入口地址。
每个中断向量由 4 个字节描述
- 前两个字节存储 ISR 的 IP
- 后两个字节存储 CS
中断描述符表
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.