ARM64 中断处理
CPU 核心中有一对管理中断的管脚:IRQ(普通中断)和 FIQ(快速中断)。
关于这两种中断,PSTATE状态寄存器中有 I 位和 F 位分别用于控制 IRQ 和 FIQ 中断的使能状态: - I = 1:IRQ 中断被禁用,CPU 将不会响应 IRQ 中断请求。 - F = 1:FIQ 中断被禁用,CPU 将不会响应 FIQ 中断请求。
实际上,当我们在内核进行异常处理的时候,会自动将 I 和 F 位设置为 1,也就是在处理异常的过程中会禁止其他中断的发生,以确保当前异常处理的完整性和安全性。
ARM 中,除了 CPU 外,还有一个重要的独立的芯片叫做 GIC(Generic Interrupt Controller,通用中断控制器),目前已经有gicv4、gicv4.1,gicv4.2了。
- gicv4.0:支持 LPI 直通
- gicv4.1:支持 LPI 直通和 IPI 直通
以树莓派4B为例,树莓派有两个中断控制器,一种是 legacy,这种是基于寄存器管理的中断控制器;另一种是 gic400 的中断控制器,同一时刻只能使用一种中断控制器(默认使用 gic400)。其中 GIC 负责管理和分发来自外设的中断请求到 CPU。GIC 与 CPU 之间通过 IRQ 和 FIQ 管脚进行通信的通用框图如下:

同样以树莓派为例,它支持以下 IRQ 中断源:

实验一:仿照出legacy完成时钟中断
legacy IRQ 中断路由
legacy
中断控制器分成两部分:ARM_LOCAL routing和ARMC routing。
以ARM Core IRQs 为例,它会被路由到Per-Core routing中,然后到达 Masked IRQn Status 寄存器中,最后通过 Pending 寄存器来判断是哪个中断源被触发了。

中断状态寄存器
包括pending0、pending1、pending2和SOURCEn四个寄存器。

结合上面树莓派legacy IRQ 状态寄存器的连接图,可以看到: 1. 比如当 source 寄存器的 bit[8] 被设置成 1 的时候,表示 GPIO0 这个中断源被触发了,那么需要读取 pending2 的寄存器 2. 读 pending2 的时候发现其中的 bit[24] 被置位了,那么我们接下去需要读取 pending0 寄存器,发现其中的 bit[0] 被置位了,那么就说明 GPIO0 这个中断源被触发了。(同理,如果 pending2 的 bit[25] 被置位了,那么需要读取 pending1 寄存器)
---------51、52已看完