滴水恩情 发表于 2024-9-7 06:58:03

ARM架构(四)——异常中断和中断控制器(GIC)②

1.GICV3详解

本末节来自ARM手册
1.1 gic in architecture

GIC一般不是一个PE有一个,也不是一个簇有一个,而是一个SOC有一个。
1.2 GIC架构简史

https://i-blog.csdnimg.cn/direct/ce44a8ad30f8407fa9362b5960c9ec24.png
特性GICv2手册GICv3手册GICv4手册支持的核心数8高达2 ^ 16高达2 ^ 16中断数量支持1020个中断ID高达24位的中断ID高达24位的中断ID假造化支持是是是MSI是,带GICv2m是是系统寄存器支持否是是

[*]GICv2:实用于较小规模的多核系统,支持根本的假造化和中断管理功能。gic400支持gicv2架构版本
[*]GICv3:大幅度提拔了中断处理惩罚能力和核心支持数量,实用于更大规模的多核系统,增强了假造化支持。gic500和gic600支持gicv3架构版本
[*]GICv4:在 GICv3 的基础上进一步提拔,支持假造中断的直接注入,优化了假造化性能,实用于高性能和高扩展性的假造化情况。gic700支持gicv4.1架构版本
2 中断基础

2.1 中断范例

GICv3界说了以下4种范例的中断:


[*]SPI(Shared Peripheral
Interrupt,共享外设中断),这是一个全局外设中断,可以路由到指定的PE,或一组PE中的一个。可通报给任何连接内核的外设中断。
[*]PPI(Private Peripheral Interrupt),私有外围中断)这是针对单个特定PE的外围中断。通用定时器的中断是
PPI的一个例子。
[*]SGI(Software Generated
Interrupt,软件天生中断)SGI通常用于处理惩罚器间通讯,并通过写入GIC中的SGI寄存器产生。
[*]LPI(Locality-specific Peripheral
Interrupt,本地特定外设中断)LPI在GICv3中是新的,其编程模型与其他三种中断范例截然差别。特别是,LPI总是基于消息的中断,它们的配置生存在内存中的表中,而不是寄存器中。
2.1.1 中断标识符——中断号

每个中断源由一个ID号标识,称为INTID。可用的intid被分成差别的组,每个组被分配给一个特定范例的中断。
https://i-blog.csdnimg.cn/direct/5b171adfea104e6fb4e6ed7b90f0bc6b.png
软件必须为每个 INTID 配置以下内容:优先级、安全模式、边沿触发或电平敏感、使能和不可屏蔽(Non-maskable)
2.1.2 中断是怎样向中断控制器发出信号的

传统上,中断是用专用硬件信号从外设发送到中断控制器的,如下图所示。
https://i-blog.csdnimg.cn/direct/f58bc287f077480198e186010267611d.png
GICv3 支持以上这种模式,别的还支持消息信号中断:消息信号中断(MSI)。如下图所示,MSI 基于消息的中断是通过写入中断控制器中的寄存器来设置和扫除的中断。
https://i-blog.csdnimg.cn/direct/1a8e44cf8f8841208d186e2a6dfd737b.png
在GICv3中,SPI可以是传统中断也可以是消息信号中断(MSI),但LPI始终是消息信号中断(MSI)。
差别的中断范例使用差别的寄存器,如表4所示。
表4
中断范例寄存器SPIGICD_SETSPI_NSR asserts an interrupt 、GICD_CLRSPI_NSR deasserts an interruptLPIGITS_TRANSLATER      MSI vs 传统
传统的引脚中断方式
1、专用信号线:
每个中断源(外设)需要一根专用的信号线连接到中断控制器。
当外设产生中断时,通过这根信号线发送一个电信号(如电平变化)到中断控制器。
中断控制器通过检测这些信号线的状态变化来辨认哪个中断源产生了中断。
2、硬件复杂性:
每增加一个中断源,需要额外的信号线。
对于具有大量中断源的系统,硬件设计变得非常复杂,由于需要大量的信号线和连接引脚。
消息通报方式(MSI)
1、基于消息的中断:
外设通过在主机内存中写入特定的数据来触发中断,这种写操纵是通过标准的总线(如 PCIe 总线)举行的。
每个中断源不需要专用的物理信号线,只需要能够通过总线访问内存即可。
2、总线共享:
多个中断源可以共享同一条总线,通过写入差别的内存地点来区分差别的中断源。
消息通报方式利用了内存映射和总线通讯,镌汰了对物理引脚的需求。
    2. 2 中断状态机

中断控制器为每个SPI、PPI和SGI中断源维护一个状态机。这个状态机由四种状态构成:


[*]Inactive:当前中断源没有被断言
[*]Pending:中断源已被断言,但中断尚未被PE确认。
[*]Active:中断源已被断言,而且中断已被PE确认。
[*]Active and Pending :中断的一个实例已被确认,另一个实例正在挂起。
tips:LPI没有活动状态或活动和挂起状态。
状态转换图如下所示(不实用于LPI):
https://i-blog.csdnimg.cn/direct/688c37c02083415e8c56727eb044a515.png
中断的生命周期取决于它是配置为电平触发照旧边沿触发。
对于电平触发的中断(Level-sensitive interrupts),一个上升沿输入,将中断变成pending,中断信号线保持高电平直到PE断言该中断信号。
对于边沿触发的中断(Edge-sensitive interrupts),一个上升沿输入,将中断变成pending,中断信号线不会保持高电平。
2.2.1 电平触发

https://i-blog.csdnimg.cn/direct/b6291e3dcdb346d0ac488e96ae028fbe.png
1、非活动到挂起(Inactive to Pending)
当中断源被断言时,中断从非活动状态转换到挂起状态。
此时,GIC向PE断言中断信号(如果中断被启用而且具有充足的优先级)。
2、Pending到Active & Pending
当PE通过读取CPU接口中的一个IARs(Interrupt Acknowledge Registers,中断确认寄存器)来确认中断时,中断从挂起转换为活动和挂起。该读取通常是中断处理惩罚例程的一部门,该例程在发生中断异常后执行。软件也可以轮询IAR。
此时,GIC将中断信号开释给PE。
3、Active & Pending到Pending
当外设解除中断信号时,中断从活动和挂起转换为活动。这通常是在相应中断处理惩罚软件时发生的,该软件正在对写入外设状态寄存器的PE执行操纵。
4、活动转为非活动(Active to Inactive)
当PE写入CPU接口中的EIR(End of Interrupt Registers,中断结束寄存器)时,中断从活动变为非活动。这表明PE已经完成了对中断的处理惩罚。
2.2.2 边沿触发

https://i-blog.csdnimg.cn/direct/d3005d9096e84b0e9b4ca81d89d774fc.png
1、非活动到挂起(Inactive to Pending)
当中断源被断言时,中断从非活动状态转换到挂起状态。
此时,GIC向PE断言中断信号(如果中断被启用而且具有充足的优先级)。
2、挂起到活动(Pending to Active)
当PE通过读取CPU接口中的一个IARs来确认中断时,中断从挂起变化为活动。该读取通常是中断处理惩罚例程的一部门,该例程在发生中断异常后执行。软件也可以轮询IAR。
此时,GIC将中断信号开释给PE。
3、Active到Active&Pending
如果外设重新确认中断信号,中断将从活动状态变为活动状态和挂起状态。
4、Active&Pending到Pending
当PE写入CPU接口中的EIRs之一时,中断从活动&挂起变为挂起。这表明PE已经完成了对中断的第一个实例的处理惩罚。
此时,GIC重新断言中断信号给PE。
2.3 亲和路由 Affinity routing

中断发送给哪个CPU,是由affinity值定的,对于SPIs中断,在Distributer中就仲裁了发送给哪个CPU,而对于PPI/SGl中断,由Redestributter寄存器决定。对应的,ARM Core端,也有一个寄存器标志着CPU的编号,内核的affinity值由四个 8 位字段表示:< affinity level 3 >.< affinity level 2 >.< affinity level 1 >.< affinity level 0 >。
eg:
0.0.0. Cores 0 to 3 of a Cortex-A53 processor
0.0.1. Cores 0 to 1 of a Cortex-A57 processo
https://i-blog.csdnimg.cn/direct/1e17592a828343cd8cad4bf9b913c0bf.png
GIC-700 最多可支持 16 个 3 级节点,每个节点可容纳 256 个 2 级子节点。同样,每个 2 级节点也可托管 256 个 1 级节点。不过,1 级节点只能托管 16 个子 0 级节点。
https://i-blog.csdnimg.cn/direct/5d02b5acf3db40a1a17d87073c4f0417.png
这样设计的原因:
中断处理惩罚优化:镌汰中断处理惩罚的延迟,进步系统相应速率。
负载平衡:将中断信号匀称分配到多个处理惩罚单元,避免单点过载。
缓存局部性:利用缓存局部性,镌汰内存访问延迟,进步中断处理惩罚服从。
2.4 安全模型(Security model)

GICv3 架构支持 Arm TrustZone 技术。必须通过软件为每个 INTID 分配一个组和安全设置。GICv3 支持三种组,如下表所示。
Interrupt TypeExample useSecure Group 0Interrupts for EL3 (Secure Firmware)Secure Group 1Interrupts for Secure EL1 (Trusted OS)Non-secure Group 1Interrupts for the Non-secure state (OS and/or Hypervisor) 0 组中断总是作为 FIQ 发出信号。第 1 组中断则根据 PE 当前的安全状态和异常级别,以 IRQ(Interrupt Request) 或 FIQ (Fast Interrupt Request)发出信号。
EL3使用AArch64时,安全设置与异常范例的映射关系如下表所示:
EL and Security state of PEGroup 0Group 1Group 1SecureNon-secureSecure EL0/1FIQIRQFIQNon-secure EL0/1/2FIQFIQIRQEL3FIQFIQFIQ 2.5 编程模型 Programmers’ model

GICv3中断控制器的寄存器接口分为三组:


[*]分配器接口(Distributor interface.)
[*]再分配接口(Redistributor interface.)
[*]CPU接口(CPU interface.)
https://i-blog.csdnimg.cn/direct/b89c6ce03fd343d0a1b6840bcce44add.png
一般来说,分配器和再分配器用于配置中断,CPU 接口用于处理惩罚中断。

[*] 分配器Distributor (GICD_*):分发器寄存器是内存映射的,而且包罗影响连接到中断控制器的所有pe的全局设置。分配器提供了一个编程接口,用于:
(1)SPIs启用和禁用
(2)设置每个 SPI 的优先级
(3)每个 SPI 的路由信息(发送给哪个CPU)
(4)每个 SPI 设置为电平敏感型或边沿触发型
(5)产生message-signales SPI中断
(6)控制 SPI 的状态(active活动、pending待定)
(7)在每个Securitu state下,配置路由模型(affinity routing or legacy)
(8)配置每一个SPIs的中断分组
[*] 在分发器Redistributors (GICR_*):对于每个连接的PE,都有一个再分发器。Redistributors提供编程接口,用于:
(1)启用和禁用SGI和PPI。
(2)设置SGI和PPI的优先级。
(3)设置每个PPI为电平敏感型或边沿触发型。
(4)将每个SGI和PPI分配到一个中断组。
(5)控制SGI和PPI的状态。
(6)控制内存中支持相关中断属性和 LPI 待处理惩罚状态的数据结构的基地点
(7)为连接的PE提供电源管理支持。
[*] CPU interfaces (ICC_*_ELn):每个内核都包罗一个 CPU 接口,即在处理惩罚中断时使用的系统寄存器。CPU接口提供编程接口,用于:
(1)提供通用控制和配置,以启用中断处理惩罚。
(2)确认中断(Acknowledge an interrupt)
(3)执行优先级降落和中断停用(de-active)
(4)为 PE 设置中断优先级掩码(即最低优先级)
(5) 界说PE的抢占策略
(6)确定 PE 的最高的 优先级待处理惩罚中断(ptiority pending interrupt)
在GICv3中,CPU接口寄存器被访问为系统寄存器(ICC_ * _ ELn)。软件在使用这些寄存器之前必须启用系统寄存器接口。这是由ICC_SRE_ELn寄存器中的SRE位控制的,其中“n”指定异常级别( EL1 EL3 )。
留意 : 在GICv1和GICv2中,CPU接口寄存器是内存映射的(GICC_ * )。
留意:软件可以通过读取PE的ID_AA64PFR0_EL1来检查GIC系统寄存器支持
3 中断配置GIC Configuring

本末节先容怎样在裸机情况下启用和配置符合GICv3的中断控制器。大多数使用GICv3中断控制器的系统都是多核系统,也可能是多处理惩罚器系统。有些设置是全局的,也就是说,它们影响所有连接的PE。其他设置是特定于单个PE的。本章将起首先容全局设置,然后是每个PE的设置。
3.1 全局设置Global settings

分发器控制寄存器( Distributor control register ,GICD_CTLR)必须配置以启用中断组并设置路由模式。
Enable Affinity routing (ARE bits) GICD_CTLR中的ARE bits控制是否使能Affinity routing。可以分别对安全状态和非安全状态控制是否启用关联路由。
GICD_CTLR:Enable Affinity routing (ARE bits),
bit位寄义1使用GICv3 mode0使用legacy mode(GICv2 mode) GICD_CTLR包罗组0、安全组1和非安全组1的单独使能位:
bit位寄义GICD_CTLR.EnableGrp1S使能分配安全组1中断GICD_CTLR.EnableGrp1NS使能非安全组1中断的分发GICD_CTLR.EnableGrp0使能组0中断的分发 tips:在GlC-600 does not support legacy operation(GIVCv2)
3.2 Individual PE settings

3.2.1再分布器配置 Redistributor configuration。

https://i-blog.csdnimg.cn/direct/1765e83128e24459b836eea085cf19db.png
如上图所示,Redistributor中包罗了一个GICR WAKER寄存器,用于记录connected,标识PE的状态是onLine照旧offline。
如果让PE变成online,软件则必需这样做:
https://i-blog.csdnimg.cn/direct/90c5b84650554d9aa7e972dc7ca8f894.png
如果PE is offline (GICR WAKER.ProcessorSleep==1)时来了一个中断target到该PE上,将产生一个wakerequest信号,这个信号连接PE的power controller,该controller将会打开PE。然后PE clear the ProcessorSleep bit
3.2.2 CPU接口配置

CPU接口负责向它所连接的PE发送中断。要开启CPU接口,软件必须举行如下配置:
CPU interfaces (lCC_*_ELn)


[*]1、SRE bit—enable cpu interface
软件必须通过在ICC_SRE_ELN寄存器中设置SRE位来启用对CPU接口寄存器的访问。
注:有些处理惩罚器可能不支持legacy operation(GICv2),SRE比特位也是固定为1,那么软件就不需要处理惩罚该比特了


[*]2、Set Priority Mask and Binary Point registers
设置优先级掩码和二进制点寄存器。CPU接口包罗优先级掩码寄存器(ICC_PMR_EL1)和二进制点寄存器(ICC_BPRn_EL1)。优先级掩码设置中断必须具有的最低优先级,以便转发到PE。二进制点寄存器用于优先级分组和抢占。


[*]3、Set EOl mode (EOl:End of interrupt)
设置EOI模式。CPU接口中ICC_CTLR_EL1和ICC_CTLR_EL3中的EOImode位控制怎样处理惩罚中断的完成。


[*]4、Enable signaling of each interrupt group
使能每个中断组的信号。
每个中断组的中断必须在 该组的中断 由CPU接口转发到PE 之前 使能。为了使能中断组的中断,必须将组1中断写入ICC_IGRPEN1_EL1寄存器,将组0中断写入ICC_IGRPEN0_EL1寄存器。
ICC_IGRPEN1_EL1按安全状态存储。即ICC_GRPEN1_EL1控制当前安全状态的组1。在EL3,软件可以使用ICC_IGRPEN1_EL3访问安全组1中断使能和非安全组1中断使能。
3.3 SPI, PPI and SGI configuration

SPI是通过分发器Distributor配置的,使用GICD_*寄存器<所以是GICD(Distributor)_>。PPI和SGI通过的单个Redistributors举行配置,使用GICR_*寄存器<所以是GICD(Redistributor_)>。
对每一个中断,软件必须配置的:


[*]Priority (GICD_IPRIORITYn, GICR_IPRIORITYn):每个INTID都有一个相关的优先级,表示为一个8位无符号值。0x00是可能的最高优先级,0xFF是可能的最低优先级。
[*]Group (GICD_IGROUPn, GICD_IGRPMODn, GICR_IGROUP0, GICR_IGRPMOD0):一个中断可以被配置为属于三个差别的中断组之一。这些中断组是Group 0, Secure Group 1 和Non- Secure Group 1 。在本章的4.4中也有先容
[*]触发方式Edge-triggered/level-sensitive (GICD_ICFGRn, GICR_ICFGRn):如果中断作为物理信号发送,则必须将其配置为边沿触发或电平触发。SGI总是被视为边沿触发,因此GICR_ICFGR0表现为这些中断的RAO/WI。
[*]Enable (GICD_ISENABLERn, GICD_ICENABLER, GICR_ISENABLER0,
GICR_ICENABLER0):每个INTID都有一个启用位。Set-enable寄存器和Clear-enable寄存器消除了执行读-修改-写例程的要求。ARM建议在启用INTID之前配置本节中概述的设置。
https://i-blog.csdnimg.cn/direct/3051b786e3864932b43209fe2b472673.png
对于裸机情况,通常不需要在初始配置后更改设置。
但是,如果必须重新配置中断,例如更改Group设置,建议起首禁用特定的INTID。
大多数配置寄存器的重置值是 IMPLEMENTATION DEFINED. 的。这意味着中断控制器的设计者本身决定这些值是什么,这些值可能在差别的系统有差别的值。
3.3.1 Setting the target PE for SPIs

对于SPI,必须别的配置中断的目的PE。这由GICD_IROUTERn控制。每个SPI有一个GICD_IROUTERn寄存器,Interrupt_Routing_Mode位控制路由策略。选项有:
bit位寄义GICD_IROUTERn.Interrupt_Routing_Mode == 0路由到指定的PEGICD_IROUTERn.Interrupt_Routing_Mode == 1在分发器Distributor硬件会自动选择一个PE,可以是0-n 这种范例的路由称为1-of-N PE可以选择不吸取1-of-N中断。这由GICR_CTLR寄存器中的DPG1S、DPG1NS和DPG0位控制。
GICD_IROUTER, Interrupt Routing Registers, n = 32 - 1019
GICD_IROUTER的特性如下:
目的:使能亲和路由时,为带有INTID n的SPI提供路由信息。
配置:这些寄存器在GIC的所有配置中都可用。如果GIC实现支持两种安全状态,则这些寄存器为Common。 n的最大值为(32*(gicd_type . itlinesnumber +1) - 1)。 GICD_IROUTER寄存器为预留寄存器,其中n=0 ~ 31。
属性:GICD_IROUTER是64位寄存器。
https://i-blog.csdnimg.cn/direct/c4dbd796417b4d12a243987cf57e80fd.png
   eg:一个挂起中断怎样分配给PE(Routing a pending interrupt to a PE)
1.检查与中断关联的组是否已启用
2.检查中断是否已启用
3.检查路由控制以决定哪些PE可以吸取中断。
由GICD_IROUTERn寄存器控制路由,SPI可以针对一个特定PE或任何一个连接的PE
4.检查中断优先级和优先掩码,以决定哪些PE得当处理惩罚中断。
每个PE在其CPU接口中都有一个优先级掩码寄存器ICC_PMR_EL1
5.检查运行优先级,以决定哪些PE可用来处理惩罚中断。
只有优先级高于运行优先级的中断才华优先于当前中断
3.3 PE configuration

PE需要配置三个:(1)Routing controls,发送到哪儿个PE;(2)中断掩码,表征中断状态;(3)中断向量表


[*]Routing controls -SCR EL3、HCR EL2。
https://i-blog.csdnimg.cn/direct/c5e0946036774555b2ecd62e83ac7246.png


[*]Interrupt masks -PSTATE。
https://i-blog.csdnimg.cn/direct/1bb65e927835434baf061aad66b606d1.png


[*]Vector table -VBAR ELn
https://i-blog.csdnimg.cn/direct/9d52a242a8184b9fba5319247b1d35a8.png
4 其他


[*]Running priority and preemption
https://i-blog.csdnimg.cn/direct/227e467658114f4b99cdbe08cae8dbca.png
[*]Taking an interrupt
https://i-blog.csdnimg.cn/direct/ecc73a0417e442f1b08c70b28f8fccb4.png
[*]End of interrupt


[*]Prioritydrop-将中断优先级降到中断产生之前的值
[*]Deactivation-将中断从active变成inactive
在gicv3中,drop和deactivation通常是一起打开的。
ICC_CTLR_ELn.EOlmode=1通过写ICC_EOIR0_EL1、ICC_EOIRl_ELl让drop and deactivation同时生效ICC_CTLR_ELn.EOImode=0通过写ICC_EOIR0_EL1、ICC_EOIR1_ELl让drop生效,写ICC_DIR_ ELl让deactivation生效,这在假造化中会用到 大多数的软件系统中EOIMode ==0;
在hypervisor的系统中EOIMode == 1。

[*]State of individual INTIDs
https://i-blog.csdnimg.cn/direct/3109922c07ec49848c15dfccbef0ab04.png
[*]Legacy operation
When ARE= = 0, affinity routing is disabled (legacy operation)
When ARE= = 1, affinity routing is enabled (GICv3 operation)
这个legacy operation指的就是GICv2 一个传统中断控制器

[*]SGI的产生
软件天生中断(SGI)是软件通过写入中断控制器中的寄存器来触发的中断。向 CPU 接口中的SGI 寄存器写入数据即可天生 SGI
https://i-blog.csdnimg.cn/direct/8a1029c4d5ea4e8ca3516b546d1767d6.png
SGI ID 字段控制 INTID 的天生。如中断范例所述,INTID 0-15 用于 SGI。
IRM(Interrupt Routing Mode,中断路由模式)字段控制向哪个 PE 或哪些 PE 发送 SGI。
|比特值|寄义|
|–|–|
|0|中断被发送到Affinity指定的PE|
|1|该中断会发送给所有连接的 PE,但发起中断的 PE(自身)除外。|
使用场景:使命调度、负载平衡、中断处理惩罚分发、系统同步等
5. 小结

中断范例触发方式配置组件处理惩罚组件SGI通过写入内部寄存器触发RedistributorCPU接口PPI由每个CPU私有设备天生DistributorCPU接口SPI由外部设备天生DistributorCPU接口
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: ARM架构(四)——异常中断和中断控制器(GIC)②