Linux kernel 为什么内核在接收到中断时调用其他处理程序?

Linux kernel 为什么内核在接收到中断时调用其他处理程序?,linux-kernel,Linux Kernel,在linux内核开发中,我读到了关于中断的内容,即当内核接收到中断时,它会按顺序调用行中每个已注册的处理程序。 我的问题是为什么内核调用其他处理程序?这是因为几个设备共享同一条中断线。内核检测要调用哪个处理程序的唯一方法是将设备的dev\u id传递给所有需要调用该处理程序的处理程序。使用传递的dev_id注册的处理程序获得匹配项并继续运行 请记住,处理程序已注册为: static irqreturn_t intr_handler(int irq, void *dev_id, struct pt

在linux内核开发中,我读到了关于中断的内容,即当内核接收到中断时,它会按顺序调用行中每个已注册的处理程序。

我的问题是为什么内核调用其他处理程序?

这是因为几个设备共享同一条中断线。内核检测要调用哪个处理程序的唯一方法是将设备的
dev\u id
传递给所有需要调用该处理程序的处理程序。使用传递的
dev_id
注册的处理程序获得匹配项并继续运行

请记住,处理程序已注册为:

static irqreturn_t intr_handler(int irq, void *dev_id, struct pt_regs *regs)

处理程序是通过传递
开发id
注册的。因此,这是区分同一IRQ线上设备的唯一方法。

在定义良好的中断处理程序中,具体共享IRQ线,它将通过读取一些寄存器来检查特定设备是否引发了中断,如果是,则处理中断并返回
IRQ\u HANDLED
,或者返回
IRQ\u NONE
以指示该设备不是处理程序所服务的设备。
因此,它顺序调用该行上每个注册的处理程序,直到处理程序返回
IRQ\u HANDLED
表示处理正确。因为如果某件事情应该作为对中断的反应而发生,那么必须执行一些代码来“处理该中断”和2。将要发生的事情是动态的,所以可以注册发生的事情。您不能以静态的方式实现它,因为您事先不知道需要什么。这不是计算机系统的工作方式,这毫无意义。