1. 中断机制与request_irq概述
在Linux内核开发中,中断处理是驱动工程师最常打交道的核心机制之一。想象一下你正在厨房做饭——炉灶上的水烧开时,水壶会发出蜂鸣声提醒你关火,这个声音就是硬件发出的"中断信号"。类似地,当网卡收到数据包、磁盘完成读写或键盘被按下时,这些硬件设备都需要通过中断来通知CPU处理紧急事件。
request_irq()就是Linux内核提供给驱动开发者的"中断注册接口",它的作用相当于告诉内核:"当XX号中断触发时,请调用我写的这个处理函数"。这个看似简单的API背后,隐藏着许多值得深究的设计哲学和实现细节。作为从业十余年的内核开发者,我见过太多因为错误使用request_irq导致的系统崩溃、性能下降甚至硬件锁死案例。本文将带你深入理解这个基础但至关重要的接口。
2. request_irq函数原型与参数解析
2.1 函数定义与基本参数
在include/linux/interrupt.h中,request_irq的实际定义如下:
c复制static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev)
{
return request_threaded_irq(irq, handler, NULL, flags, name, dev);
}
五个关键参数各有深意:
-
irq(中断号):如同电话号码,每个硬件中断都有唯一编号。在x86体系下,键盘通常是IRQ1,而系统定时器是IRQ0。现代系统更多使用APIC中断控制器,中断号可能动态分配。
-
handler(处理函数):中断发生时执行的回调,其原型为:
c复制typedef irqreturn_t (*irq_handler_t)(int, void*);第一个参数是中断号,第二个是注册时传入的dev指针。处理函数必须快速执行完毕,长时间阻塞会导致系统响应迟缓。
-
flags(标志位):这个参数的控制位决定了中断的行为特性:
- IRQF_SHA
