中断控制器介绍-硬件篇(arm)
GICv3 架构
中断类型
中断号划分
LPI:本地特殊外设中断
比如platform MSI中断之类的,外面写寄存器触发中断
SGI:软件产生中断
通过写系统寄存器触发,用于IPI核间通信,resched IPI等
PPI:私有外设中断
percore私有的外设,比如arch timer、pmu性能管理单元中断
SPI:共享外设中断
所有core共享外设中断,比如dma,usb,gpio中断等
核心组件
Distributor
Redistributor
CPU interface
中断处理与中断虚拟化支持
寄存器接口
Memory map寄存器
Sysreg 寄存器
中断 lifecycle
中断产生:中断由外设或软件产生。
分发:中断路由器(IRI)执行中断分组、中断优先级排序,并控制中断向 CPU 接口的转发。
投递:物理 CPU 接口将中断投递给对应的处理元素(PE)。
激活:当运行在 PE 上的软件响应(acknowledge)一个中断时,GIC 会将“最高活动优先级”设置为该中断的优先级;对于 SPI、SGI 和 PPI 类型的中断,该中断状态会变为 active(活动状态)。
优先级下降:当运行在 PE 上的软件向 GIC 表示,最高优先级中断已经被处理到足以降低运行优先级的程度时,运行优先级会恢复为中断响应前的值。这时,中断处理程序会发出中断结束(EOI)信号。中断结束操作可以配置为同时执行中断的去激活。
去激活:去激活会清除中断的活动状态,从而允许该中断在处于挂起状态时能够再次被处理。对于 LPI(本地中断),不需要去激活。去激活可以配置为与优先级下降同时发生,也可以配置为通过显式的中断去激活操作在稍后发生。后一种方式支持某些软件架构,可以将中断处理分为“初始处理”和“延后调度的处理”。
中断状态
中断状态
pending和active是两个独立事件
状态判断 | Active: cpu 是否 ack(读IAR寄存器)且未EOI(写EOI寄存器) | ||
N | Y | ||
Pending: 外设或者软件是否assert to GIC | N | inactive | active |
Y | pending | Active and pending |
中断状态机转换
转换 A1 或 A2:添加挂起状态 当中断进入挂起状态时发生该转换,可能是由于外设产生了中断,或者软件触发了中断。
转换 B1 或 B2:移除挂起状态 当中断被外设撤销(如果该中断是电平敏感型中断),或软件修改了挂起状态时发生该转换。 对于 LPI,中断在被处理器确认(acknowledge)时,也会发生该转换。
转换 C:挂起 → 活动 当处理元素(PE)对边沿触发的 SPI、SGI 和 PPI 中断进行确认时发生该转换。 对于 SPI、SGI 和 PPI,当软件从 ICC_IAR0_EL1 或 ICC_IAR1_EL1 读取 INTID 值时,也会发生该转换。
转换 D:挂起 → 活动并挂起 当处理元素(PE)对电平敏感的 SPI、SGI 和 PPI 中断进行确认时发生该转换。
转换 E1 或 E2:移除活动状态 当软件对 SPI、SGI 和 PPI 中断执行去激活操作时发生该转换。
Level sensitive 中断
Edge sensitive 中断
中断分组
中断 group
中断 group 触发信号