第10章:中断处理: Quick Reference
中断管理相关符号速查表
| 头文件 | 符号 / 函数 | 描述 |
|---|---|---|
<linux/interrupt.h> | request_irq(unsigned int irq, irqreturn_t (*handler)(...), unsigned long flags, const char *dev_name, void *dev_id) | 注册中断处理程序,返回 0 表示成功,负值表示错误(如 -EBUSY) |
free_irq(unsigned int irq, void *dev_id) | 注销中断处理程序,dev_id 需与注册时一致(共享中断必填) | |
<linux/irq.h> | can_request_irq(unsigned int irq, unsigned long flags) | 仅 i386 和 x86_64 架构可用,判断中断线是否可分配(返回非零表示可能成功,结果非绝对可靠) |
<asm/signal.h> | SA_INTERRUPT | request_irq 的标志位,请求安装快速处理程序(当前 CPU 上禁用其他中断) |
SA_SHIRQ | 标志位,允许中断线共享(需配合 dev_id 使用) | |
SA_SAMPLE_RANDOM | 标志位,表明中断时间戳可用于生成系统熵(增强随机数安全性) | |
| - | /proc/interrupts | 伪文件,显示各 IRQ 的中断计数、处理 CPU、控制器类型及关联设备名 |
/proc/stat | 伪文件,记录系统启动以来的总中断数及各 IRQ 的累计计数(包括已释放的中断) | |
| - | probe_irq_on(void) | 中断探测函数,返回未分配中断的位掩码,需保存并传递给 probe_irq_off |
probe_irq_off(unsigned long mask) | 结束中断探测,返回触发的 IRQ 号(0 表示无中断,负值表示多中断冲突) | |
| - | IRQ_NONE | 中断处理程序返回值,表示未处理该中断(非本设备触发) |
IRQ_HANDLED | 处理程序返回值,表示已成功处理本设备中断 | |
IRQ_RETVAL(int x) | 宏,将布尔值转换为标准返回值(x 为真时返回 IRQ_HANDLED,否则返回 IRQ_NONE) | |
| - | disable_irq(int irq) | 禁用指定 IRQ 线(等待当前处理完成后生效),非共享中断专用 |
disable_irq_nosync(int irq) | 立即禁用指定 IRQ 线(不等待当前处理完成),非共享中断专用 | |
enable_irq(int irq) | 启用指定 IRQ 线,非共享中断专用 | |
| - | local_irq_save(unsigned long flags) | 禁用当前 CPU 的所有中断,并保存中断状态到 flags |
local_irq_restore(unsigned long flags) | 根据 flags 恢复当前 CPU 的中断状态 | |
local_irq_disable(void) | 无条件禁用当前 CPU 的所有中断(不保存状态) | |
local_irq_enable(void) | 无条件启用当前 CPU 的所有中断 |
关键说明
共享中断注意事项
使用
SA_SHIRQ时,dev_id不可为NULL(用于区分共享设备),且处理程序需通过硬件状态判断中断是否由本设备触发(返回IRQ_NONE表示非本设备中断)。中断开关函数的适用场景
disable_irq/enable_irq作用于全局 IRQ 线,影响所有使用该 IRQ 的设备,共享中断禁止使用;local_irq_*系列函数仅影响当前 CPU 的中断状态,常用于保护中断上下文与进程上下文的共享数据(配合自旋锁使用)。
中断处理程序返回值
必须返回
IRQ_NONE或IRQ_HANDLED(或通过IRQ_RETVAL转换),内核据此判断是否需要进一步处理(如唤醒等待进程)。
