浅谈中断控制器:从 IRQ 到 IRR、IMR、In-Service Register
在计算机体系结构中,中断是 CPU 感知外设事件的核心机制。无论是键盘输入、网卡收包,还是定时器触发,CPU 都是通过中断来获知这些事件。然而,中断并不是设备直接告诉 CPU,而是要经过一个“前台接待”——可编程中断控制器 (PIC)。本文将带领大家逐步理解 IRQ 线、INTR 信号,以及 PIC 的三大核心寄存器:IRR、IMR、In-Service Register (ISR),并区分清楚与 中断服务程序 (Interrupt Service Routine, ISR) 的不同。
1. IRQ 线与 INTR 信号
-
IRQ (Interrupt Request) 线
每个外设通过 IRQ 线向 PIC 发出中断请求。例如:- IRQ0:定时器
- IRQ1:键盘
- IRQ14:IDE 硬盘
-
INTR (Interrupt Request to CPU)
PIC 收集各 IRQ 请求,判断优先级,然后通过 INTR 总线把最终的请求送给 CPU。
类比:
- IRQ 线 = 客户打电话给前台。
- INTR 信号 = 前台按总机灯提醒经理(CPU)。
2. PIC 的三大寄存器
2.1 IRR (Interrupt Request Register)
-
作用:记录哪些 IRQ 线已经触发。
-
形式:位图寄存器,每一位对应一条 IRQ 线。
- IRQn 触发 →
IRR[n] = 1
- IRQn 触发 →
-
理解:相当于“待办清单”。
2.2 IMR (Interrupt Mask Register)
-
作用:屏蔽某些中断线。
IMR[n] = 1
→ 屏蔽 IRQn(不让进入 CPU)IMR[n] = 0
→ 允许 IRQn
-
理解:相当于“黑名单/静音名单”。
2.3 In-Service Register (ISR,寄存器)
- 作用:记录哪些中断正在被 CPU 服务中。
- 当 PIC 把某个请求从 IRR 交给 CPU 时,就会把该位从 IRR 移到 ISR。
- CPU 处理完并发送 EOI (End Of Interrupt) 之后,PIC 才会清除对应的 ISR 位。
- 理解:相当于“正在经理办公室里的访客名单”。
3. 中断服务程序 (Interrupt Service Routine, ISR)
需要特别注意:中断服务程序(Interrupt Service Routine) 与 In-Service Register 只是缩写相同,完全是两个概念。
- In-Service Register:PIC 的硬件寄存器,用来标记“哪个中断正在处理中”。
- Interrupt Service Routine:软件层面的中断处理函数,CPU 响应中断后跳转执行的代码。
当 CPU 收到中断:
- 保存当前现场(寄存器、EFLAGS、CS:EIP 等)。
- 根据中断向量号,从 IDT (Interrupt Descriptor Table) 找到对应入口地址。
- 跳转执行该中断服务程序(ISR routine)。
例如:键盘中断会触发 CPU 执行 keyboard_interrupt_handler()
例程。
4. 一次中断的生命周期
串起来看整个流程:
-
设备发请求:
- 外设触发 IRQn →
IRR[n] = 1
- 外设触发 IRQn →
-
PIC 检查屏蔽:
- 若
IMR[n] = 1
→ 屏蔽,不会送到 CPU - 若
IMR[n] = 0
→ 有资格继续
- 若
-
PIC 选中请求:
- 将
IRR[n]
移到In-Service Register[n]
- 拉高 INTR → 通知 CPU
- 将
-
CPU 响应:
- 保存上下文
- 跳转执行中断服务程序 (ISR routine)
-
中断结束:
- 中断服务程序执行完毕 → CPU 向 PIC 发送 EOI
- PIC 清除
In-Service Register[n]
- 流程结束
5. 示例:键盘中断
- 用户敲键 → IRQ1 →
IRR[1] = 1
- PIC 检查 →
IMR[1] = 0
→ 合格 - PIC 把
IRR[1] → In-Service Register[1]
,并拉高 INTR - CPU 响应 → 执行
keyboard_interrupt_handler()
中断服务程序 - 程序执行完 → CPU 发 EOI → PIC 清除
In-Service Register[1]
6. 总结对比
缩写 | 全称 | 所属层 | 含义 | 类比 |
---|---|---|---|---|
IRR | Interrupt Request Register | 硬件 (PIC) | 记录“谁来敲门了” | 待办清单 |
IMR | Interrupt Mask Register | 硬件 (PIC) | 屏蔽“谁不许进来” | 黑名单 |
In-Service Register | In-Service Register | 硬件 (PIC) | 标记“谁正在被处理” | 办公室访客 |
ISR routine | Interrupt Service Routine | 软件 (OS/驱动) | CPU 响应中断后执行的函数 | 会谈过程 |
7. 总结
通过区分 寄存器 (IRR/IMR/In-Service Register) 与 中断服务程序 (ISR routine),我们可以完整理解中断的生命周期。
PIC 就像是一个严格的前台调度员:
- IRR 记录来访,
- IMR 过滤名单,
- In-Service Register 跟踪正在服务的客户,
- 而 CPU 最终会跳转到相应的中断服务程序来完成处理。
笔者如果在某些地方理解的不正确,还望大家批评指正!