使用GIC在SMP ARM系统上进行中断处理

时间:2014-04-16 11:17:53

标签: linux-kernel arm interrupt interrupt-handling cortex-a

我想知道中断处理是如何从任何设备被中断的那一点开始的。我知道中断处理的各个部分,并希望有明确的中断处理的端到端图片。让我知道我所知道的一点点关于中断处理。

假设FPGA器件通过电线中断并获取一些数据。该FPGA器件的器件驱动程序已经使用request_irq函数注册了代码(中断处理程序)。

所以现在FPGA器件有一个IRQ线,调用request_irq之后,使用这个IRQ线路器件向通用中断控制器发送数据,GIC将对IRQ线进行多对一转换,并将信号发送到CPU核心。然后调用以下最小代码

IRQ_handler
SUB       lr, lr, #4       ; modify LR
SRSFD     #0x12!           ; store SPSR and LR to IRQ mode stack
PUSH      {r0-r3, r12}     ; store AAPCS registers on to the IRQ mode stack
BL        IRQ_handler_to_specific_device
POP       {r0-r3, r12}     ; restore registers
RFEFD     sp!              ; and return from the exception using pre-modified LR 

IRQ_handler_to_specific_device是我们使用request_irq()调用在设备驱动程序中注册的内容。

我还不知道CPU核心如何了解中断源?(来自哪个设备中断)

do_irq和共享中断等调用的作用是什么?

需要一些帮助来理解关于如何在ARM体系结构上处理中断的端到端图片?

1 个答案:

答案 0 :(得分:4)

GIC 分为两个部分。第一个叫做经销商。这对系统来说是全球性的。它有几个物理路由到它的中断源;虽然它可能在SOC包中。第二部分按CPU复制,称为 cpu接口分销商具有如何分发共享外设中断或SPI的逻辑。这些是你的问题所要求的中断类型。它们是全局硬件中断

在Linux的上下文中,这是在irq-gic.c中实现的。 gic.txt中有一些文档。特别感兴趣,

  
      
  • reg:指定GIC寄存器的基本物理地址和大小。该   第一个区域是GIC 分销商注册基数和大小。第二个区域是   GIC cpu接口注册基数和大小。
  •   

必须全局访问分发,因此必须小心管理它的寄存器。 CPU接口对于每个CPU具有相同的物理地址,但每个CPU都有单独的实现。分配器可以设置为将中断路由到特定的CPU(包括多个)。例如,请参阅:gic_set_affinity()。任何CPU也可以处理中断。 ACK 寄存器将分配IRQ;第一个读取它的CPU,获得中断。如果多个IRQ挂起,并且有两个来自不同CPU的 ACK 读取,则每个都将获得不同的中断。第三个CPU读取将获得虚假 IRQ。

同样,每个CPU接口都有一些私有中断源,用于CPU到CPU的中断以及私有定时器等。但我相信问题的焦点是物理外设(系统特有)如何路由到SMP系统中的CPU。