1.不同版本的 GIC 架构及其主要功能如下图所示:
2.GICv2m(Generic Interrupt Controller Virtualization Model)是针对ARM架构的GIC(通用中断控制器)的一种扩展, GICv2m扩展为虚拟化环境中的中断管理提供了更好的支持,通过支持消息中断,它能够提高多处理器系统中的中断效率和灵活性。消息中断是指一种中断传递方式,主要用于多处理器系统中的中断管理。在这种模式下,硬件设备发送的中断信号不是简单地通过中断线传递,而是通过消息机制来传递。这种机制通常依赖于总线或共享内存,以便将中断信息直接发送给特定的处理器或处理单元。
3.ICC_SRE_ELx是System Register Enable(SRE)寄存器,它控制了处理器能否使用系统寄存器与中断控制器(GIC)进行交互。这个寄存器的主要作用是启用或禁用通过系统寄存器来访问GIC的功能,从而影响如何处理中断。每个异常级别(EL)都有相应的ICC_SRE_ELx寄存器,其中x是异常级别号(1,2,3)。SRE=1:启用系统寄存器访问,这通常是GICv3模式下推荐的做法,表示可以通过系统寄存器(如ICC_SGI1R_EL1等)来进行中断控制操作。SRE=0:禁用系统寄存器访问,此时需要使用内存映射接口(MMIO)来访问GIC的分发器和CPU接口寄存器,适用于GICv2兼容模式或旧版硬件设计。
4.GICD_CTLR.ARE是中断控制器的亲和路由使能位。ARE=1时启用亲和路由,将中断发送到特定CPU核心;ARE=0时禁用亲和路由,使用传统方法处理中断。下图给出了ICC_SRE_ELx.SRE位和GICD_CTLR.ARE位的几种特定组合,及允许图中所示的特定组合来选择使用GICv3新特性还是使用GICv2遗留操作:
5.在GICv3架构中,中断分为四类:SPI(共享外设中断,Shared Peripheral Interrupt)、PPI(私有外设中断,Private Peripheral Interrupt)、SGI(软件生成中断,Software Generated Interrupt)和LPI(本地外设中断,Locality-specific Peripheral Interrupt)。SPI是外部设备引发的中断,是一个全局外设中断,可以路由到指定的PE,或一组PE。PPI是由处理器核心产生的中断,是针对单个特定PE的外设中断,因此称为“私有外设中断”,例如来自PE通用定时器的中断。SGI是处理器间的通信中断,由软件触发,通常用于核间的线程通信,通过写入GIC中的SGI寄存器来生成(GICD_SGIR寄存器)。LPI是GICv3中的新增功能,它们在很多方面与其他类型的中断不同。特别是,LPI始终是基于消息的中断,并且它们的配置保存在内存中的表中而不是寄存器中(仅当 GICD_CTLR.ARE_NS==1 时才支持 LPI)。
6.每个中断都有一个中断号INTID,根据中断号分类如下:
7.通常是使用专用硬件信号从外设像中断控制器发出中断信号,如下图:
在此基础上,GICv3还开始支持基于消息的中断,基于消息的中断是通过写入中断控制器中的寄存器来设置和清除的中断。在GICv3中,SPI可以是基于消息的中断,但LPI始终是基于消息的中断。
8.在 ARMv8 架构中,亲和性(Affinity)指的是处理器核心的层次结构,它用于描述系统中不同处理器核、集群和群组的关系,尤其是在多核和多集群处理器设计中。亲和性主要用于在中断控制器(如 GICv3)中定义如何将中断路由到不同的处理器核心,以及通过系统中的层次关系来标识不同的处理器和资源。
9.MPIDR_EL1是ARM架构中的一个系统寄存器,称为多功能处理器亲和性寄存器(Multiprocessor Affinity Register)。它用于标识处理器的亲和性域,这些域可以表示处理器的物理和逻辑层次结构,例如处理器、核心、线程等。每个核心都有独立的 MPIDR_EL1 寄存器,并且每个核心的该寄存器值是不同的。MPIDR_EL1中的亲和性的值必须满足GICR_TYPER寄存器中的要求(每个Redistributor与一个PE相连,该寄存器Redistributor Type Register是属于与PE相连的Redistributor的)。
10.CICv3支持Arm TrustZone技术,每个中断必须指定组和安全设置。GICv3支持3中组合,如下图:
Group0 中断作为FIQ类型中断;Group1 中断既可以是IRQ也可以是FIQ类型,这个取决于PE当前的异常级别和安全状态(即下图最左侧那栏所示),FIQ和IRQ是两种中断处理的方式,它们的确和具体的中断号(INTID)没有直接的对应关系。具体如下图:
LPI始终被视为非安全组1中断。