ARM64体系的异常与中断(2)
一、GICv3简介[1]
中断是外设给处理器传递信息的一种方式,外设中断相对于处理器通常是异步的。ARM64 体系中外设中断是通过通用中断控制器转发给处理器的。通用中断控制器是支持和管理中断的硬件部件,它提供了用于管理中断源、中断行为和将中断路由至一个或多个处理器的寄存器。GICv3(General Interrupt Controller Version 3)支持 ARMv8-A 架构,其硬件架构定义了:
处理中断的硬件规范,这些中断发生在连接到 GIC 的处理器上;
中断控制器的用户编程接口,该接口既适应单处理器又适应多处理器;
对于每一个处理器,GIC 描述了系统内的不同中断是如何产生外部中断请求(IRQ)和快速中断请求(FIQ)的,而ARMv8-A异常模型(ExceptionModel)则描述了处理器是如何处理这些 IRQ 和 FIQ 中断请求的。
GIC 用于处理外设中断,外设中断表现为发送给GIC的信号。GIC 定义了四种外设中断:
Locality-specific Peripheral Interrupt (LPI):一种基于消息的边沿中断[2](硬件中有边沿触发和电平触发的概念,电平触发是在高或低电平保持的时间内触发,而边沿触发是由高到低或由低到高这一瞬间触发。[3]由中断信号边沿触发的中断称为边沿中断)。其特别之处在于,该中断不需要通过中断线发送中断信号,而通过总线写 GIC 中的寄存器来发送中断信息。基于消息的中断流程如下图所示:
Private Peripheral Interrupt (PPI):发送给特定处理器的外设中断,不同的处理器对于不同事件可以用相同的中断号(一个中断可以用一个 ID 号表示,称为中断 ID 号)。
Shared Peripheral Interrupt (SPI):GIC将该种类型的中断路由给能处理该中断的处理器,不限于特定的处理器。
Software Generated Interrupt (SGI):该种类型的中断用于处理器间通信,通过写 GIC 中的 SGI 寄存器产生。
GICv3 的硬件架构图如下图所示[1]:
可以看出 GICv3 由 Distributor、Redistributor、CPU Interface 和 ITS 四个部分组成,它们的功能是:
Distributor:为 SPI 提供路由配置并保存相关的路由信息和优先级信息;
Redistributor:为 PPI 提供配置,将处于 pending 状态的最高优先级的中断在有限时间内发送给 CPU 接口;
CPU Interface:CPU Interface 提供一个连接处理器(Processing Element, PE)与 GIC 的接口;
ITS(InterruptTranslation Service):将事件转化为 LPI(可选的)。
GIC 处理物理中断的流程如下图所示[1]:
各个阶段的含义为:
Generate: 外设或软件产生中断;
Distribute: 设定中断的分组和优先级,并路由至 CPU 接口(CPU 接口提供了处理器和 GIC 连接的接口);
Deliver:CPU 接口将中断传给其对应的处理器;
Activate:当处理器得知中断的存在时,GIC 将被激活的中断设置为最高优先级,从而对 SPI、PPI 和 SGI 来说中断变成激活态;
Priority Drop:处理器上运行的软件向 GIC 发送信号表明最高优先级的中断已经可以降级为被处理前的优先级状态了;
Deactivation:清除中断的激活状态,可以被配置为和 Priority Drop 同时发生。
二、结语
本期我们考察了 ARMv8-A 架构中 GIC(General Interrupt Controller)的中断处理流程,下一期我们将介绍 Linux 内核中的中断处理流程。
[1]ARM®Generic Interrupt Controller Architecture Specification GIC architectureversion 3.0 and version 4.0 Beta
[2]http://www.lujun.org.cn/?p=3921
[3]https://blog.csdn.net/Gdadiao123/article/details/80958165
- 点赞
- 收藏
- 关注作者
评论(0)