1. 中断基础概念
中断(Interrupt)是硬件或软件向处理器发送的一种异步信号,用于通知处理器发生了需要立即处理的事件。中断机制是现代操作系统中实现多任务、实时响应和外设交互的核心基础。理解中断的基本概念是掌握共享中断与IRQ亲和性配置的前提。
1.1 什么是中断
中断是一种让处理器暂停当前正在执行的程序,转而执行一个特殊服务例程(中断处理程序)的机制。中断的来源可以是硬件设备(如网卡、磁盘控制器、键盘),也可以是软件指令(如系统调用)。中断的主要目的是避免处理器轮询等待设备状态,从而提高系统整体效率。
关键特性:中断是异步事件,处理器无法预知其发生的确切时间;中断处理程序运行在中断上下文中,不能睡眠或执行阻塞操作。
1.2 中断向量
中断向量(Interrupt Vector)是一个数字标识符,用于唯一标识一个中断源。在x86架构中,中断向量号范围为0~255。每个中断向量对应一个中断处理程序的入口地址,这些地址存储在中断描述符表(IDT)中。当处理器收到中断信号时,通过中断向量号在IDT中查找对应的处理程序地址并跳转执行。
| 向量范围 | 类型 | 说明 |
|---|---|---|
| 0~31 | 异常与陷阱 | 由CPU内部条件触发,如除零错误(#0)、页错误(#14) |
| 32~47 | 硬件中断(IRQ) | 由外部设备通过中断控制器(如APIC)触发 |
| 48~255 | 软件中断与自定义 | 用于系统调用(如int 0x80)或操作系统自定义用途 |
1.3 中断请求(IRQ)
中断请求(Interrupt Request,IRQ)是硬件设备向中断控制器发送的电信号,用于请求处理器为其提供服务。每个IRQ线通常关联一个或多个设备。在传统PIC(可编程中断控制器)架构中,IRQ线数量有限(通常16条);在现代APIC(高级可编程中断控制器)架构中,IRQ数量大幅扩展,并支持多处理器分发。
IRQ与中断向量的关系:IRQ号经过中断控制器映射后转换为中断向量号。例如,在x86上,IRQ 0(定时器)通常映射为向量32,IRQ 1(键盘)映射为向量33,以此类推。
1.4 中断处理流程概述
一次完整的中断处理流程涉及硬件、中断控制器、操作系统内核和设备驱动程序的协同工作。以下流程图展示了从设备触发中断到处理程序返回的完整路径:
中断处理流程的详细步骤如下:
- 设备触发中断:硬件设备(如网卡接收数据包)通过中断请求线向中断控制器发送电信号。
- 中断控制器接收并仲裁:中断控制器(如I/O APIC)接收多个设备的IRQ信号,根据优先级仲裁后向处理器发送中断消息。
- 处理器保存上下文:处理器完成当前指令后,自动将EFLAGS、CS、EIP(或RIP)等寄存器压栈,保存被中断程序的执行状态。
- 查找中断处理程序:处理器根据中断向量号在IDT中查找对应的门描述符,获取中断处理程序的段选择子和偏移地址。
- 执行中断处理程序(ISR):处理器跳转到中断服务例程执行。ISR首先保存更多寄存器,然后调用具体设备驱动注册的处理函数,最后发送EOI(中断结束)命令并恢复寄存器。
- 中断返回:执行iret指令,从栈中恢复EFLAGS、CS、EIP,继续执行被中断的程序。
1.5 中断处理的关键数据结构
| 数据结构 | 所在位置 | 作用 |
|---|---|---|
| 中断描述符表(IDT) | 内存(由操作系统初始化) | 存储256个中断向量的门描述符,包含处理程序地址和权限信息 |
| 中断请求描述符(irq_desc) | 内核内存 | 每个IRQ对应一个描述符,记录中断处理程序链表、状态、亲和性掩码等 |
| 中断控制器描述符(irq_chip) | 内核内存 | 封装中断控制器的硬件操作函数(如mask/unmask/ack/eoi) |
| 中断处理程序(irqaction) | 内核内存 | 设备驱动注册的处理函数,包含handler指针、设备名称、flags等 |
注意:在共享中断场景下,多个设备可以共享同一个IRQ线。此时,同一个irq_desc下会挂载多个irqaction结构体。中断处理程序执行时,需要遍历链表逐一调用各设备的handler,并通过检查设备状态寄存器判断是否由本设备触发。
1.6 中断上下文与进程上下文的区别
中断处理程序运行在中断上下文中,与普通进程上下文有显著区别。理解这些区别对于编写正确的中断处理代码至关重要:
| 特性 | 中断上下文 | 进程上下文 |
|---|---|---|
| 可睡眠 | 否(不能调用可能导致睡眠的函数) | 是 |
| 可被抢占 | 否(中断处理期间禁止中断嵌套或有限嵌套) | 是 |
| 拥有进程控制块 | 否(current指向被中断进程,但不代表中断自身) | 是 |
| 访问用户空间 | 否(不依赖特定进程地址空间) | 是 |
| 执行时间限制 | 极短(通常微秒级,否则影响系统实时性) | 较长(时间片轮转) |
最佳实践:中断处理程序应只执行最紧急的操作(如清除设备中断标志、拷贝数据到缓冲区),耗时任务应推迟到软中断(softirq)或工作队列(workqueue)中执行。这种机制称为"中断底半部"(Bottom Half)。