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

1.GICV3详解

本小节来自ARM手册

1.1 gic in architecture

GIC一般不是一个PE有一个,也不是一个簇有一个,而是一个SOC有一个。

1.2 GIC架构简史

在这里插入图片描述

特性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被分成不同的组,每个组被分配给一个特定类型的中断。
在这里插入图片描述
软件必须为每个 INTID 配置以下内容:优先级、安全模式、边缘触发或电平敏感、使能和不可屏蔽(Non-maskable)

2.1.2 中断是如何向中断控制器发出信号的

传统上,中断是用专用硬件信号从外设发送到中断控制器的,如下图所示。

在这里插入图片描述
GICv3 支持以上这种模式,另外还支持消息信号中断:消息信号中断(MSI)。如下图所示,MSI 基于消息的中断是通过写入中断控制器中的寄存器来设置和清除的中断。
在这里插入图片描述
在GICv3中,SPI可以是传统中断也可以是消息信号中断(MSI),但LPI始终是消息信号中断(MSI)。

不同的中断类型使用不同的寄存器,如表4所示。
表4

中断类型寄存器
SPIGICD_SETSPI_NSR asserts an interrupt 、GICD_CLRSPI_NSR deasserts an interrupt
LPIGITS_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):
在这里插入图片描述

中断的生命周期取决于它是配置为电平触发还是边缘触发。
对于电平触发的中断(Level-sensitive interrupts),一个上升沿输入,将中断变成pending,中断信号线保持高电平直到PE断言该中断信号。
对于边沿触发的中断(Edge-sensitive interrupts),一个上升沿输入,将中断变成pending,中断信号线不会保持高电平。

2.2.1 电平触发

在这里插入图片描述
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 边缘触发

在这里插入图片描述

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.[0:3] Cores 0 to 3 of a Cortex-A53 processor
0.0.1.[0:1] Cores 0 to 1 of a Cortex-A57 processo
在这里插入图片描述

GIC-700 最多可支持 16 个 3 级节点,每个节点可容纳 256 个 2 级子节点。同样,每个 2 级节点也可托管 256 个 1 级节点。不过,1 级节点只能托管 16 个子 0 级节点。
在这里插入图片描述

这样设计的原因:
中断处理优化:减少中断处理的延迟,提高系统响应速度。
负载均衡:将中断信号均匀分配到多个处理单元,避免单点过载。
缓存局部性:利用缓存局部性,减少内存访问延迟,提高中断处理效率。

2.4 安全模型(Security model)

GICv3 架构支持 Arm TrustZone 技术。必须通过软件为每个 INTID 分配一个组和安全设置。GICv3 支持三种组,如下表所示。

Interrupt TypeExample use
Secure 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 1
SecureNon-secure
Secure EL0/1FIQIRQFIQ
Non-secure EL0/1/2FIQFIQIRQ
EL3FIQFIQFIQ

2.5 编程模型 Programmers’ model

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

  • 分配器接口(Distributor interface.)
  • 再分配接口(Redistributor interface.)
  • CPU接口(CPU interface.)
    在这里插入图片描述

一般来说,分配器和再分配器用于配置中断,CPU 接口用于处理中断。

  1. 分配器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的中断分组

  2. 在分发器Redistributors (GICR_*):对于每个连接的PE,都有一个再分发器。Redistributors提供编程接口,用于:
    (1)启用和禁用SGI和PPI。
    (2)设置SGI和PPI的优先级。
    (3)设置每个PPI为电平敏感型或边缘触发型。
    (4)将每个SGI和PPI分配到一个中断组。
    (5)控制SGI和PPI的状态。
    (6)控制内存中支持相关中断属性和 LPI 待处理状态的数据结构的基地址
    (7)为连接的PE提供电源管理支持。

  3. 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 mode
0使用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。

在这里插入图片描述
如上图所示,Redistributor中包含了一个GICR WAKER寄存器,用于记录connected,标识PE的状态是onLine还是offline。
如果让PE变成online,软件则必需这样做:
在这里插入图片描述
如果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之前配置本节中概述的设置。
    在这里插入图片描述
    对于裸机环境,通常不需要在初始配置后更改设置。
    但是,如果必须重新配置中断,例如更改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路由到指定的PE
GICD_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位寄存器。
在这里插入图片描述

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。

在这里插入图片描述

  • Interrupt masks -PSTATE。

在这里插入图片描述

  • Vector table -VBAR ELn
    在这里插入图片描述

4 其他

  1. Running priority and preemption
    在这里插入图片描述
  2. Taking an interrupt
    在这里插入图片描述
  3. 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。

  1. State of individual INTIDs
    在这里插入图片描述
  2. Legacy operation
    When ARE= = 0, affinity routing is disabled (legacy operation)
    When ARE= = 1, affinity routing is enabled (GICv3 operation)

这个legacy operation指的就是GICv2 一个传统中断控制器

  1. SGI的产生
    软件生成中断(SGI)是软件通过写入中断控制器中的寄存器来触发的中断。向 CPU 接口中的SGI 寄存器写入数据即可生成 SGI
    在这里插入图片描述
    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接口
  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值