一、GIC 体系结构

igpu设置方法_igpu设置方法


通过上图可以确定,GIC 主要包含 3 部分:DistributorCPU interfacesVirtual CPU interfacesVirtual CPU interfaces 包含 Virtual interface control 和 Virtual CPU interface

1、中断类型

  • SGISoftware Generated Interrupt) - 软件触发中断:通常用于多核间通讯,最多支持 16SGI 中断,硬件中断号从 ID0~ID15
  • PPIPrivate Peripheral Interrupt) - 私有外设中断:是每个 CPU 私有的中断。最多支持 16PPI 中断,硬件中断号从 ID16~ID31
  • SPIShared Peripheral Interrupt)- 公用外设中断:最多可以支持 988 个外设中断,硬件中断号从 ID32~ID1019

2、Distributor 作用

Distributor 主要作用为检测中断源控制中断源行为将中断源分发到指定 CPU 接口上(针对每个 CPU 将优先级最高的中断转发到该接口上)。

Distributor 对中断的控制包括:

  • 全局启用中断转发到 CPU 接口
  • 开启或关闭每一个中断
  • 为每个中断设置优先级
  • 为每个中断设置目标处理器列表
  • 设置每个外设中断触发方式(电平触发、边缘触发)
  • 为每个中断设置组
  • SGI 转发到一个或多个处理器
  • 每个中断状态可见
  • 提供软件设置或清除外设中断的挂起状态的一种机制

3、中断 ID

使用 ID 对中断源进行标识。每个 CPU 接口最多可以有 1020 个中断。SPIPPI 中断为每个接口特定的,SPI 为为所有接口共用,因此多处理器系统中实际中断数大于 1020 个。

4、CPU 接口

CPU 接口提供一个处理器连接到 GIC 的接口。每一个 CPU 接口都提供一个编程接口:

  • 允许向处理器发送中断请求信号
  • 确认中断
  • 指示中断处理完成
  • 为处理器设置中断优先级掩码
  • 为处理器定义抢占策略
  • 选择最高优先级挂起中断

二、中断处理状态机

GIC 为每个 CPU 接口上每个受支持的中断维护一个状态机。下图显示了此状态机的实例,以及可能的状态转换。

igpu设置方法_igpu设置方法_02


1、添加挂起状态A1、A2

  • 对于一个 SGI,发生以下 2 种情况的 1 种:
  • 软件写 GICD_SGIR 寄存器,指定目标处理器
  • 目标处理器上软件写 GICD_SPENDSGIRn 寄存器
  • 对于一个 SPIPPI,发生以下 2 种情况的 1 种:
  • 外设发出一个中断请求信号
  • 软件写 GICD_ISPENDRn 寄存器

2、删除挂起状态B1、B2

  • 对于 SGI
  • 目标处理器写 GICD_CPENDSGIRn 寄存器
  • 对于一个 SPIPPI,发生以下 2 种情况的 1 种:
  • 电平触发类型中断,信号取消
  • 边沿触发类型中断,软件写 GICD_ICPENDRn 寄存器

3、挂起到激活C

如果中断使能,并且高优先级,软件从 GICC_IAR 寄存器读取时发生状态改变。

4、挂起到激活和挂起D

  • 对于 SGI,这种转变发生在以下任一情况下:
  • SGI 状态设置为挂起的写入操作与读取 GICC_IAR 几乎同时发生
  • 当多个挂起的 SGI 具有相同 ID 时,并且它们来自同一个源处理器并指向同一个处理器。其中一个 SGI 状态变为激活(C),其他 SGI 状态变为激活和挂起(D)。
  • 对于 SPIPPI,满足以下所有条件,则发生这种转换
  • 中断开启
  • 软件读取 GICC_IAR,读操作将激活状态添加到中断中。
  • 此外,还应满足以下条件之一:
  • 对于电平触发中断,中断信号保持。通常都是这样,因为外设直到处理器处理完中断后才会取消触发信号。
  • 对于边沿触发中断,是否发生此转换取决于读取 GICC_IAR 的时间(中断再次触发,上一次未处理),读取 GICC_IAR 可能会转换到 C,后面可能会转换到 A2

5、删除激活状态(E1、E2

  • 软件写入 GICC_EOIRGICC_DIR 来停用中断,

三、中断分组和中断优先级

本节描述了一个不使用中断分组的实现,也不包括GIC安全扩展。中断分组和 GIC 安全扩展扩展了 GIC 中断优先级的基本模型。

软件通过为每个中断源分配一个优先级值来配置中断优先级。优先级值为 8 位无符号二进制。一个GIC至少支持 16个优先级最多支持 256 个优先级。如果 GIC 实现的优先级少于 256,则优先级字段的低阶位为 RAZ/WI。这意味着表示优先级的字段 4 - 8 bit,详细信息见表 3-1

igpu设置方法_寄存器_03


GIC 优先级方案中,数字越低,优先级越高0 始终为最高优先级,最低优先级取决于实现的优先级数量。

中断优先级值保存在 GICD_IPRIORITYRn 寄存器中。通过写 GICD_IPRIORITYRn 寄存器设置中断优先级。

确定优先级位数方法:先向 GICD_IPRIORITYRn 寄存器写入 0xFF,再读取 GICD_IPRIORITYRn 寄存器。

1、中断抢占

CPU 支持更高优先级抢占目标处理器。当发生以下 2 中情况会发生目标处理器抢占:

  • 当前中断信号的优先级高于该 CPU 接口的优先级掩码
  • 当前中断信号所在组优先级高于处理器处理中断优先级组

抢占发生在处理器确认新的中断时,并开始优先服务于之前活动的中断或当前运行的进程。当这种情况发生时,就称最初的主动中断已被抢占。当另一个中断仍然处于活动状态时开始服务于一个中断,有时被描述为中断嵌套。


对于符合 ARM 体系结构的处理器:

  • CPSR 寄存器中的 I 位或 F 位的值确定处理器是否通过启动中断确认过程来响应信号中断。
  • 处理抢占中断时,处理器必须保存并稍后恢复以前活动的 ISR 的上下文。

优先级下降意味着中断的优先级不再影响 CPU 接口上的运行优先级,因此不会阻止中断抢占。在 GICv1 实现中,仅当中断停用时才会发生优先级下降,但在 GICv2 实现中,优先级下降和中断停用可以分开。


2、优先级掩码

CPU 接口中 GICC_PMR 寄存器定义目标处理器优先级阈值。GIC 仅向目标处理器发出优先级高于此阈值的挂起中断信号。值为零(寄存器复位值)会屏蔽所有中断,使其无法向关联的处理器发出信号。GIC 在将挂起中断的优先级与优先级阈值进行比较时不使用优先级分组

GIC 始终屏蔽具有最大支持优先级字段值的中断。这提供了一种额外的方法来防止中断被发送到任何处理器。

注:将 255 写入 GICC_PMR 寄存器,总是设置支持最大优先级字段值。表 3-1 显示了支持的最大字段值如何随实现的优先级位数而变化。

3、优先级分组

优先级分组使用二进制点寄存器(GICC_BPR)将优先级值拆分为两个字段:组优先级子优先级。在确定抢占时,所有具有相同组优先级的中断都被认为具有相同的优先级,而不考虑其子优先级。这意味着每个组优先级上只能有一个处于活动状态的中断。活动组优先级也称为抢占级别。

GIC 使用组优先级字段来确定挂起的中断是否具有足够的优先级来抢占活动中断,如下所示:

  • 一个挂起的中断要抢占一个活动中断,它的组优先级必须高于活动中断的组优先级。也就是说,新中断的组优先级字段的值必须小于"正在运行"优先级的组优先级字段的值。
  • 如果 CPU 接口上没有活动中断,则可以向处理器发出最高优先级的等待中断信号,而不考虑组的优先级。

在每种情况下,挂起的中断优先级与优先级掩码进行比较,并且只有当中断高于掩码时才会发出中断信号。

二进制点寄存器(GICC_BPR)将优先级值拆分为两个字段,具体含义见表 3-2

igpu设置方法_igpu设置方法_04


带有 GIC 安全扩展的 GICv1 实现和 GICv2 实现有两个二进制点寄存器。用于计算优先级分组的二进制点寄存器取决于中断是组 0 中断还是组 1 中断,通过 GICD_IGROUPRn 寄存器定义,以及 GICC_CTLR.CBPR 位值。表 3-3 显示了用于不同 GIC 实现的二进制点寄存器。

igpu设置方法_ARM_05

四、中断分组对中断处理的影响

本节介绍中断分组和 GIC 安全扩展插件对中断处理的影响。

包含 GIC 安全扩展的 GICv1 实现,或任何 GICv2 实现,为 IRQFIQ 异常请求提供两个中断输出信号:

  • CPU 接口始终对组 1 中断使用 IRQ 异常请求
  • 软件可以将 CPU 接口配置组 0 中断使用 IRQFIQ 异常请求。

上电时或复位后,任何 GIC 实现都配置为仅使用单个中断输出信号。

1、GIC 中断分组支持


GICv1 实现中,中断分组仅作为 GIC 安全扩展的一部分提供。


GICD_IGROUPRn 寄存器将每个中断配置为组 0 或组 1

CPU 接口中,在 GICv2 实现中,GICC_* 别名寄存器可以提供对组 0 和组 1 寄存器的独立控制,如表 3-4 所示:

igpu设置方法_寄存器_06


在包含 GIC 安全扩展的实现中,寄存器别名:

  • 通常表示组 0 寄存器的非安全副本的别名,例如,GICC_ABPR 寄存器是 GICC_BPR 寄存器非安全副本的别名
  • 只能通过安全访问进行访问。

在包含 GIC 安全扩展的 GICv1 实现中:

  • 唯一实现的别名寄存器是 GICC_ABPR
  • 1 中断的其他控制仅由组 0 控制寄存器的非安全副本提供,如图 3-5 所示:

    在包含 GIC 安全扩展的 GIC 实现中,在 GICv1GICv2 中,CPU 接口对组 1 中断的非安全控制是相同的。这意味着,在 GICv2 实现中,表 3-5 显示了提供对组 1 中断进行非安全控制的 GICC_* 寄存器。

在支持中断分组的实现中,GICC_CTLR 包含其他字段,包括用于控制分组中断处理的字段:

  • 独立的使能位控制组 0 和组 1 中断到连接的处理器的信号
  • bit[0] 是不支持中断分组的 GIC 中的 Enable 位,它成为 EnableGrp0 位,并控制是否向处理器发送组 0 中断信号
  • 增加了 EnableGrp1 位,以控制是否向处理器发送组 1 中断信号。
  • FIQEn 位,它控制接口信号组 0 是否使用 IRQFIQ 中断请求中断到处理器。
  • CBPR 位,控制是否使用 GICC BPRGICC_ABPR 来确定可能被组1中断抢占的中断
  • AckCtl 位,用于控制是否读取 GICC_IAR,或实现安全扩展的 GIC 安全读取 GICC_IAR,来确认组 1 中断。
  • GICv2 实现中:
  • IRQFIQ 旁路禁用位,用于控制是否将旁路 IRQFIQ 信号转发到处理器
  • EOImode 位,用于控制优先级下降是否与中断停用分开。如果 GIC 实现了安全扩展,则会为非安全访问和安全性访问实现单独的 EOImodeNSEOImodeS 位。这为非安全和安全中断处理提供了结束中断模式的独立控制。

2、GIC 支持中断分组时的特殊中断编号

GIC 架构为特殊用途保留的中断 ID 号的完整列表如下:

  • 1020-1021:保留
  • 1022:仅当 GIC 支持中断分组时才使用。
  • 1023:如果没有足够优先级的等待中断向处理器发出信号,这个值将被返回给处理器,作为中断确认的响应。

3、中断分组对中断确认的影响

在不支持中断分组的 GIC 实现中,当处理器接受中断时,它通过读取 GICC_IAR 来确认该中断。GICC_IAR 的读取用于查询确认执行读取的处理器的最高优先级挂起中断。

在支持中断分组的 GIC 实现中,ARM 强烈建议将 GICC_CTLR.AckCtl 设置为 0,这意味着:

对于 GICv2 实现:

  • 0 中断通过读取 GICC_IAR,或安全读取 GICC_IAR(如果实现包括 GIC 安全扩展)
  • 1 中断通过读取 GICC_AIAR,或非安全读取 GICC_IAR(如果实现包括 GIC 安全扩展)

对于 GICv1 实现:

  • 0 中断必须通过读取安全 GICC_IAR
  • 1 中断必须通过读取不安全 GICC_IAR

在各种情况下,读取都必须是对 CPU 接口上挂起中断的最高优先级的确认。

如果中断确认寄存器访问与 CPU 接口上优先级最高的挂起中断不对应,则:

  • 当优先级最高的挂起中断是组 1 中断时,读取 GICC_IAR 返回虚假中断值 1022
  • 当优先级最高的挂起中断是组 0 中断时,读取 GICC_AIAR 将返回虚假中断值 1023

GICC_CTLR.GICC_AckCtl 位设置为 0 时,为确保系统正确性,每个组 0 中断的优先级必须高于任何组 1 中断。

GICC_CTLR.AckCtl 位设置为 1 时,读取 GICC_IAR 确认 CPU 接口上优先级最高的挂起中断,无论它是组 0 还是组 1 中断。但是,ARM 弃用了 GICC_CTLR.AckCtl 的这种用法,并强烈建议使用 GICC_CTLR.AckCtl 设置为 0 的软件模型。

使用 GIC 安全扩展插件进行中断确认

本小节介绍当实现 ARM 处理器安全扩展的处理器连接到包含 GIC 安全扩展的 GIC CPU 接口时,确认分组中断的要求如何应用于中断处理。在此配置中:

  • 0 中断是安全中断
  • 1 中断是非安全中断

该小节仅描述 GICC_CTLR.AckCtl 设置为 0(建议的配置)的操作。

如果最高优先级的挂起中断是安全中断,则处理器必须对 GICC_IAR 进行安全读取以确认它。

要确认非安全中断,处理器可以:

  • GICC_IAR 寄存器执行非安全读取
  • GICv2 实现中,对 GICC_AIAR 寄存器执行安全读取。

这意味着,当非安全软件正在处理非安全中断时,处理器会对 GICC_IAR 进行非安全读取以确认非安全中断。

如果 GICC_IAR 的读取与中断的安全性不匹配,则读取 GICC_IAR 不会确认任何中断并返回以下值:

  • 1022 用于在最高优先级中断为"不安全"时进行安全读取
  • 1023 表示最高优先级中断为"安全"时的非安全读取。

4、GIC上电或复位配置

上电时或复位后,支持中断分组的 GIC 实现配置为:

  • 分配给组 0 的所有中断
  • 已禁用 FIQ 异常请求。

这意味着使用 IRQ 中断请求向组 0 中断发出信号。图 3-2 展示这种配置:

igpu设置方法_寄存器_07

5、中断分组和中断优先级

许多系统实现要求任何组 1 中断都不会抢占任何组 0 中断。对于这样的实现,ARM 强烈建议:

  • 0 中断始终在支持的优先级值范围的下半部分分配优先级值。这些值对应于优先级较高的中断。
  • 1 中断始终在支持的优先级值范围的上半部分分配优先级值。这些值对应于较低优先级的中断。

这可确保每个组 1 中断的优先级都低于任何组 0 中断。

如果 GIC 支持 GIC 安全扩展:

  • GIC 提供中断优先级设置的安全和非安全视图。
  • 支持的最小优先级值数从 16 增加到 32
  • 非安全访问只能看到支持的优先级值的一半。因此,如果 GIC 实现了 32 个优先级值,则非安全访问只能看到 16 个优先级值。

1、包括安全扩展的GIC中中断优先级的软件视图

当处理器读取组 1 中断的优先级值时,GIC 将返回该值的安全视图或非安全视图,具体取决于访问是"安全"还是"不安全"。本节介绍中断优先级的两种视图以及它们之间的关系。

GIC 至少实现 32 个优先级,最多 256 个优先级。这意味着它实现了 GICD IPRIORITYRn 寄存器中8位优先级值字段的 5-8 位。所有实现的优先级位都可以通过安全访问进行访问,并且优先级字段的未实现的低阶位是 RAZ/WI。图 3-3 显示中断的优先级值字段的安全视图。存储在分发服务器中的优先级值等效于"安全"视图。

igpu设置方法_优先级_08


在这个视图中:

  • H-DGIC 必须实现的位,对应于 32 个优先级。
  • c-aGIC 可能实现的位,如果未实现,则为 RAZ/WI
  • GIC 必须实现位 H-a 以提供最多 256 个优先级。
  • ARM 建议,对于组1中断,bit[7] 设置为 1

非安全访问只能看到与中断优先级的非安全视图对应的优先级值字段。对于非安全访问,GIC 支持的优先级是其支持的安全访问的一半。图 3-4 显示组 1 中断的优先级值字段的非安全视图。

igpu设置方法_igpu设置方法_09


在这个视图中:

  • G-DGIC 必须实现的位,对应于 16 个优先级。
  • c-aGIC 可能实现的位,如果未实现,则为 RAZ/WI
  • GIC 必须实现位 G-a 以提供最多 128 个优先级。
  • bit [0]RAZ/WI

优先级值的非安全视图不显示该值在分发服务器中的存储方式。在存储该值之前,将该值从非安全写入到优先级字段:

  • 值右移 1 位。
  • bit [7] 被设置为 1

此转换意味着组 1 中断的优先级值位于可能值范围的上半部分,这意味着中断优先级位于优先级范围的下半部分。

对中断的优先级值的安全读取将返回存储在分发服务器中的值。图 3-5 显示了组 1 的优先级值字段的安全视图,该组 1 的优先级值字段由非安全访问设置,或者由安全访问设置 bit[7]== 1 的优先级值。

igpu设置方法_寄存器_10


对组 1 中断的优先级值字段的安全写入可以将 bit[7] 设置为 0。如果安全写设置 bit[7]0

  • 非安全读取返回值 0bGFEDcba0
  • 非安全写可以更改字段的值,只能修改分发器视图中 bit[7] 设置为 1

此非安全访问行为仅适用于 GICD_IPRIORITYRn 中的"优先级"值字段:

  • 如果 GICC_PMR 中的"优先级"字段包含 bit[7] == 0 的值,则该字段为"非安全访问"的 RAZ/WI
  • 如果 GICC_RPR 中的"优先级"字段包含 bit[7] == 0 的值,则该字段为"非安全访问"的 RAZ

3-6 显示了"优先级"值字段的视图之间的关系。

igpu设置方法_字段_11


3-7 显示来自安全访问和非安全访问的中断优先级的软件视图如何与分发服务器中持有的优先级值相关,以及安全访问和非安全访问可见的中断值。这适用于实现优先级值最大范围的 GIC

igpu设置方法_字段_12


3-6 显示了 GIC 实现的优先级值位数如何影响组 1 中断优先级的安全和非安全视图。


不安全的软件无法查看组 0 中断的优先级设置。


igpu设置方法_优先级_13


这种优先级值表示的模型确保了编写的软件能够按照预期的实现这种 GIC 架构功能,而不管 GIC 是否实现了 GIC 安全扩展。但是,程序员必须确保软件为第 0 组和第 1 组中断分配适当的优先级。

有关管理优先级值的建议

ARM 强烈建议:

  • 对于组 0 中断,软件将优先级值字段的 bit[7] 设置为 0
  • 如果使用安全写入来设置组 1 中断的优先级,软件会将优先级值字段的 bit[7] 设置为 1

这可确保所有组 0 中断的优先级值都低于所有组 1 中断,因此优先级较高。但是,系统可能具有此方案无法满足的要求。


  • GIC 和连接的处理器都包含安全扩展时,组 0 中断是安全中断,组 1 中断是非安全中断。
  • 软件可能不了解 GIC 安全扩展,因此可能不知道它是否对 GIC 寄存器进行安全访问或非安全访问。但是,对于任何实现的中断,软件可以将 0xFF 写入相应的 GICD_IPRIORITYRn 优先级值字段,然后读回存储在该字段中的值以确定支持的中断优先级范围。ARM 建议,在以这种方式检查优先级范围之前:
  • 对于外设中断,软件首先禁用中断。
  • 对于 SGI,软件首先检查中断是否处于非活动状态。

2、通过组 1 中断控制抢占

GIC 实现支持中断分组时,GICC_BPR 始终用于确定组 0 中断是否向处理器发出信号,以便进行可能的抢占。默认情况下,GICC_ABPR 用于确定是否向组 1 中断发出信号以进行可能的抢占。但是,当 GICC_CTLR.CBPR 设置为 1 时,GICC_BPR 用于确定组 0 和组 1 中断的可能抢占。

GIC 安全扩展对控制组 1 中断抢占的影响

如果 GIC 实现包括安全扩展:

  • CBPR 位仅在 GICC_CTLR 的安全副本中实现。
  • 它是 GICC_BPR 的安全副本,即:
  • 始终用于确定组 0 中断是否向处理器发出信号。
  • GICC_CTLR.CBPR 设置为 1 时,也用于确定组 0 中断是否发出信号。
  • GICC_ABPRGICC_CTLR 的非安全副本的别名。
  • GICC_ABPR 是一个安全寄存器,只能通过安全软件访问来访问。

3、中断分组对优先级分组的影响

当中断使用 GICC_ABPR 时,有效二进制点值比寄存器中存储的值少一个,如表 3-7 所示。这意味着,如果软件不知道中断分组和 GIC 安全扩展的影响,则无论它是在处于安全还是非安全状态的处理器上运行,都会看到相同的优先级分组机制。


  • GICv2 中,有效的二进制点值调整也发生在不包含安全扩展的 GIC 实现中。
  • 优先级分组始终基于分发服务器中保存的优先级值,而不是对非安全中断对应的优先级值的非安全读取可见的值。

GICC_ABPR 寄存器支持的最小二进制点值为:

  • 具体定义实现。
  • 1-4 范围内。
  • 一个大于 GICC_BPR 寄存器的安全副本支持的最小值。

GICC_CTLR.CBPR==0 时,组1中断的优先级分组结果如表 3-7 所示。

igpu设置方法_字段_14


在包含安全扩展的 GIC 实现中,当 GICC_CTLR.CBPR == 1 时:

  • GICC_BPR 的非安全读取将返回安全 GICC_BPR 的值,该值递增 1 并饱和为 0b111
  • GICC_BPR 的非安全写入将被忽略。
  • GICC_ABPR 寄存器是多余的。

4、当 GIC 支持中断分组时生成中断

见文档

五、虚拟化扩展对中断处理的影响

见文档

六、GIC 使用模型示例

实现 ARMv7-AARMv7-R 体系结构配置文件的 ARM 处理器支持两个中断请求信号 nIRQnFIQ,每个信号都有一个关联的异常和处理器模式:

  • 触发 IRQ 请求会生成 IRQ 异常。默认情况下,这是在 IRQ 模式下执行的,并且采用异常会屏蔽后续的 IRQ 异常。
  • 触发 FIQ 请求会生成 FIQ 异常。默认情况下,这是在 FIQ 模式下进行的,并且采用异常会屏蔽 FIQIRQ 异常。

所有这些使用模型示例都使用图 3-8 中所示的硬件实现,以及支持组 0 和组 1 中断的 GIC

igpu设置方法_寄存器_15


在每个使用模型中,软件使用 GICD_IGROUPRn 寄存器将中断分配给两组,并使用 IRQFIQ 中断请求向处理器发出信号。

1、使用 IRQ 和 FIQ 提供不安全和安全的中断

3-9 显示了一个实现 GIC 安全扩展的系统,连接到一个实现 ARM 处理器安全扩展的处理器。此实现:

  • 使用组 0 中断作为安全中断,以 FIQ 信号。
  • 将组 1 中断用作非安全中断,以 IRQ 为信号。

这意味着,在处理器上,FIQ 中断永远不会路由到非安全软件,IRQ 中断也永远不会路由到安全软件。

igpu设置方法_ARM_16


使用组 0 和组 1 中断将安全中断作为 FIQ 发出信号,将非安全中断作为 IRQ 发出信号,要求处理器:

  • 路由要在安全监视器模式下获取的 FIQ
  • 防止不安全的软件屏蔽 FIQ
  • 确保 IRQ 在安全状态下运行时被屏蔽。

独立控制安全和非安全中断

3-9 所示的系统满足一般安全要求,即非安全操作不得干扰安全操作。安全软件通过将 FIQ 路由到安全软件而不允许非安全软件屏蔽它们来完全控制 FIQ

GIC 复位时,所有中断都分配给组 0,使其成为安全中断。处理器上的安全软件:

  • GICD_IGROUPRn 寄存器进行编程,以指示哪些中断是组 1,非安全中断。
  • 将安全 GICC_CTLR.FIQEn 位设置为 1,以将 CPU 接口配置为对组 0 中断使用 FIQ
  • 必须在分发服务器中独立启用组 0 中断和第 1 组中断:
  • GICD_CTLR.EnableGrp0 开启组 0 中断。
  • GICD_CTLR.EnableGrp1 开启组 1 中断。
  • 必须在 CPU 接口中独立启用组 0 中断和组 1 中断:
  • GICC_CTLR.EnableGrp0 开启组 0 中断。
  • GICC_CTLR.EnableGrp1 开启组 1 中断。

2、在不使用处理器安全扩展时支持 IRQ 和 FIQ

3-10 显示了处理器未实现或未使用处理器安全扩展的系统。该系统可以使用 GICD_IGROUPRn 寄存器提供的中断分组来控制 IRQFIQ,基于:

  • FIQ 分配给中断组 0
  • IRQs 分配给中断组 1

本节适用于包含 GIC 安全扩展的任何 GICv1 实现或任何 GICv2 实现。

igpu设置方法_字段_17


GIC 复位时,对于支持中断分组的 GIC 实现,所有中断都分配给组 0

因此,要使用此配置,在处理器上执行的软件必须:

  • GICD_IGROUPRn 寄存器进行编程,以将 IRQ 中断分配给组 1

对于不包含安全扩展的 GICv2 实现,GICD_IGROUPRn 重置值是由具体实现定义的。


  • GICC_CTLR.FIQEn 设置为 1,以将组 0 中断分配给 FIQ
  • GICC_CTLR.AckCtl 设置为 0 ,这样 FIQIRQ 中断都可以从单个地址空间中被确认,使用
  • GICC_IAR 确认组 0 中断。
  • GICC_AIAR 确认组 1 中断。
  • GICC_EOIR 指示组 0 中断完成。
  • GICC_AEOIR 指示组 1 中断完成。

然而,GICC_AIARGICC_AEOIR 仅在 GICv2 实现中实现。使用 GICv1 实现运行的处理器可能必须使用已弃用的操作模式,并将 GICC_CTLR.AckCtl 设置为 1

  • 通过以下任意一种方式配置所需的二进制点支持模型:
  • GICC_CTLR.CBPR 设置为 0,以便组 0 使用 GICC_BPR,组 1 使用 GICC_ABPR
  • GICC_CTLR.CBPR 设置为 1,以便组 0 和组 1 使用公共二进制点寄存器,GICC_BPR

3、在虚拟化处理器环境中支持 IRQ 和 FIQ

图 3-11 显示了一个支持处理器虚拟化的系统,该系统在虚拟机上执行旧版软件。处理器使用模型的基础是:

  • 安全软件分配:
  • 对组 0 的安全中断,作为 FIQ 信号发送到处理器。
  • 对组 1 的非安全中断,作为 IRQ 向处理器发出信号。
  • 虚拟机管理程序:
  • 使用 GIC 上的虚拟化扩展的功能实现虚拟分发服务器。此虚拟分发服务器可以将来自 GICIRQ 中断虚拟化为虚拟 IRQ 和虚拟 FIQ 中断,并将其路由到相应的虚拟机。
  • 将物理 IRQ 路由到 Hyp 模式,以便虚拟分发服务器可以为其提供服务。
  • 在虚拟机上运行的客户机操作系统将中断分配给组 0 或组 1,以将其分配为 FIQIRQ。对 GIC 分发服务器寄存器的访问将捕获到虚拟机管理程序,因此可以访问虚拟分发服务器。
    虚拟 CPU 接口将这些中断作为虚拟 FIQ 或虚拟 IRQ 发出信号。此虚拟化受虚拟机管理程序控制,对来宾操作系统不可见。

    GIC 向处理器发送 IRQ 信号时,中断将路由到 Hyp 模式。虚拟机管理程序确定中断是针对自身还是针对来宾操作系统。如果是针对来宾操作系统,它将确定:
  • 哪个客户机操作系统必须处理中断。
  • 该来宾操作系统是否已将中断配置为 FIQIRQ
  • 中断优先级,基于目标来宾操作系统的优先级配置。

如果中断以当前客户机操作系统为目标,则虚拟机管理程序将更新 List 寄存器,以将中断添加到当前虚拟机的挂起中断列表中。


  • 在收到当前来宾操作系统无法处理的 IRQ 时,虚拟机管理程序可以:
  • 将控制权转移到可以处理中断的客户机操作系统。
  • 将中断标记为挂起,作为相应来宾操作系统的已保存上下文的一部分。
  • 一个系统可以有一些中断,这些中断可以由多个来宾操作系统处理,而其他中断必须路由到特定的来宾操作系统。

客户机操作系统处理虚拟中断的方式与处理相应物理中断的方式完全相同。来宾操作系统无法检测到它正在处理虚拟中断而不是物理中断。

七、编程模型

见文档