request_irq()内部执行了哪些操作?

9
据我了解,“allocate an interrupt line”的意思是“分配一个中断线路”,但是...
> what is happening after request_irq()?
> How a particular handler is getting called on receiving interrupt?

有人能用代码片段来解释吗?
1个回答

11

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 芯片向 CPU 发送中断号(00h 到 FFh 或 0 至 255 十进制),该中断号用作中断向量表的索引。

处理器通常将每种中断类型映射到低内存中的相应指针。所有中断类型的指针集合是一个中断向量表。向量表中的每个指针都指向对应中断类型(IRQ 线)的 ISR。

一个中断向量只是一个中断处理程序的单个内存地址。中断向量表是几个内存地址的组合。

如需了解更多,请参阅http://wiki.osdev.org/Interrupts


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接