计算机体系结构中的中断服务程序ISR是什么?
计算机体系结构中的中断服务程序ISR是什么?
在计算机体系结构中,中断服务程序(Interrupt Service Routine, ISR) 是操作系统或硬件直接调用的关键代码模块,用于响应来自硬件设备、软件异常或系统事件的中断信号。其核心任务是快速处理中断事件,确保系统实时性和设备交互的可靠性。
1. ISR 的本质
- 中断的“处理者”:当CPU收到中断请求(如键盘输入、定时器到期、磁盘I/O完成),会暂停当前任务,转去执行对应的ISR。
- 硬件与软件的桥梁:ISR直接与硬件设备交互(如读取寄存器、清除中断标志),并将数据传递给上层软件(如驱动程序或操作系统)。
2. 触发ISR的中断类型
中断类型 | 来源 | 示例 |
---|---|---|
硬件中断 | 外部设备(通过中断控制器) | 键盘按键、网卡收到数据、定时器到期 |
软件中断 | CPU指令或异常 | 系统调用(如int 0x80 )、除零错误 |
内部异常 | CPU内部事件 | 缺页异常、非法指令 |
3. ISR的执行流程
- 中断触发
- 设备(如键盘)通过中断控制器(如APIC)向CPU发送中断信号。
- 上下文保存
- CPU自动保存当前任务的寄存器状态(如程序计数器、标志寄存器)。
- 跳转至ISR
- 根据中断向量号查询中断描述符表(IDT),定位ISR入口地址。
- ISR核心操作
- 关键动作:读取设备数据、清除中断标志、发送EOI(End of Interrupt)信号。
- 限制:必须短小高效,避免阻塞其他中断。
- 中断返回
- 恢复保存的上下文,CPU继续执行原任务。
4. ISR的设计原则
- 原子性:执行期间通常关闭同级中断(防止嵌套导致竞态条件)。
- 无阻塞:禁止调用可能休眠的函数(如
malloc()
、sleep()
)。 - 数据传递:将耗时操作交给“下半部”(如Linux的
tasklet
或workqueue
)。
5. 实例:x86键盘ISR(简化版)
// 键盘中断号通常为IRQ1(对应向量号0x21)
void keyboard_isr() {uint8_t scancode = inb(0x60); // 从键盘控制器读取扫描码handle_keypress(scancode); // 将按键存入缓冲区(非阻塞操作)outb(0x20, 0x20); // 向PIC发送EOI信号(x86传统模式)
}
6. 关键问题与优化
- 中断风暴:若设备频繁中断(如故障网卡),会导致系统瘫痪。
解决方案:采用轮询+中断混合模式,或限制中断频率。 - 延迟敏感场景:实时系统需优化ISR响应时间(如嵌套中断、优先级抢占)。
- 多核处理:SMP系统中需考虑中断亲和性(将中断绑定到特定CPU核心)。
7. 相关概念扩展
- 中断向量表(IVT):实模式下存储ISR地址的数组(256项,每项4字节)。
- 中断描述符表(IDT):保护模式下定义中断门、陷阱门的结构(含权限位)。
- 中断屏蔽:通过
cli
(关中断)或操作中断控制器屏蔽特定中断源。
总结
ISR是计算机响应异步事件的核心机制,其高效性直接影响系统性能和实时性。理解ISR对开发操作系统内核、设备驱动或嵌入式系统至关重要,尤其在需要低延迟和高可靠性的场景(如工业控制、实时数据处理)。