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 中断处理流程概述

一次完整的中断处理流程涉及硬件、中断控制器、操作系统内核和设备驱动程序的协同工作。以下流程图展示了从设备触发中断到处理程序返回的完整路径:

中断处理流程概述 中断处理流程概述 ① 设备触发中断信号 ② 中断控制器接收并仲裁 ③ 处理器保存当前上下文 ④ 查找IDT获取处理程序地址 ⑤ 执行中断处理程序(ISR) 处理完成后执行中断返回指令(iret),恢复被中断程序的执行

中断处理流程的详细步骤如下:

  1. 设备触发中断:硬件设备(如网卡接收数据包)通过中断请求线向中断控制器发送电信号。
  2. 中断控制器接收并仲裁:中断控制器(如I/O APIC)接收多个设备的IRQ信号,根据优先级仲裁后向处理器发送中断消息。
  3. 处理器保存上下文:处理器完成当前指令后,自动将EFLAGS、CS、EIP(或RIP)等寄存器压栈,保存被中断程序的执行状态。
  4. 查找中断处理程序:处理器根据中断向量号在IDT中查找对应的门描述符,获取中断处理程序的段选择子和偏移地址。
  5. 执行中断处理程序(ISR):处理器跳转到中断服务例程执行。ISR首先保存更多寄存器,然后调用具体设备驱动注册的处理函数,最后发送EOI(中断结束)命令并恢复寄存器。
  6. 中断返回:执行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)。