我想知道中断处理是如何从任何设备被中断的那一点开始的。我知道中断处理的各个部分,并希望有明确的中断处理的端到端图片。让我知道我所知道的一点点关于中断处理。
假设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体系结构上处理中断的端到端图片?
答案 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。