request_irq()在内部做什么?

Som*_*One 7 kernel interrupt linux-device-driver linux-kernel interrupt-handling

我知道它"分配一个中断线",但是

> what is happening after request_irq()?
> How a particular handler is getting called on receiving interrupt?
Run Code Online (Sandbox Code Playgroud)

任何人都可以用代码snipet解释它吗?

Sum*_*ini 9

request_irq()之后发生了什么?

设备驱动程序通过调用request_irq()来注册中断处理程序并启用给定的中断行进行处理.

呼叫流程是: -

  1. request_irq() - > setup_irq()来注册struct irqaction.
  2. setup_irq() - > start_irq_thread()创建一个内核线程来服务中断线.

线程的工作在do_irqd()中实现.每个中断行只能创建一个线程,共享中断仍由单个线程处理.

通过request_irq()使用ISR(中断处理程序)传递给start_irq_thread().start_irq_thread()创建一个调用ISR的内核线程.

如何在接收中断时调用特定的处理程序?

当发生中断时,PIC控制器向cpu提供中断信息.

器件向PIC芯片发送中断,PIC向CPU发出中断(直接或间接).当CPU确认"发生中断"信号时,PIC芯片将中断号(00h和FFh之间,或0和255十进制)发送到CPU.该中断号用作中断向量表的索引.

处理器通常将每个中断类型映射到低内存中的相应指针.所有中断类型的指针集合是一个中断向量.向量中的每个指针指向相应中断类型(IRQ行)的ISR." 中断向量只是一个中断处理程序的一个存储器地址.中断向量表是一组多个存储器地址."

进一步阅读http://wiki.osdev.org/Interrupts