一、GIC 体系结构
通过上图可以确定,GIC
主要包含 3
部分:Distributor
、CPU interfaces
和 Virtual CPU interfaces
。Virtual CPU interfaces
包含 Virtual interface control 和 Virtual CPU interface
。
1、中断类型
-
SGI
(Software Generated Interrupt
) - 软件触发中断:通常用于多核间通讯,最多支持16
个SGI
中断,硬件中断号从ID0~ID15
。 -
PPI
(Private Peripheral Interrupt
) - 私有外设中断:是每个CPU
私有的中断。最多支持16
个PPI
中断,硬件中断号从ID16~ID31
。 -
SPI
(Shared Peripheral Interrupt
)- 公用外设中断:最多可以支持988
个外设中断,硬件中断号从ID32~ID1019
。
2、Distributor 作用
Distributor
主要作用为检测中断源、控制中断源行为和将中断源分发到指定 CPU
接口上(针对每个 CPU
将优先级最高的中断转发到该接口上)。
Distributor
对中断的控制包括:
- 全局启用中断转发到
CPU
接口 - 开启或关闭每一个中断
- 为每个中断设置优先级
- 为每个中断设置目标处理器列表
- 设置每个外设中断触发方式(电平触发、边缘触发)
- 为每个中断设置组
- 将
SGI
转发到一个或多个处理器 - 每个中断状态可见
- 提供软件设置或清除外设中断的挂起状态的一种机制
3、中断 ID
使用 ID
对中断源进行标识。每个 CPU
接口最多可以有 1020
个中断。SPI
和 PPI
中断为每个接口特定的,SPI
为为所有接口共用,因此多处理器系统中实际中断数大于 1020
个。
4、CPU 接口
CPU
接口提供一个处理器连接到 GIC
的接口。每一个 CPU
接口都提供一个编程接口:
- 允许向处理器发送中断请求信号
- 确认中断
- 指示中断处理完成
- 为处理器设置中断优先级掩码
- 为处理器定义抢占策略
- 选择最高优先级挂起中断
二、中断处理状态机
GIC
为每个 CPU
接口上每个受支持的中断维护一个状态机。下图显示了此状态机的实例,以及可能的状态转换。
1、添加挂起状态(A1、A2
)
- 对于一个
SGI
,发生以下2
种情况的1
种:
- 软件写
GICD_SGIR
寄存器,指定目标处理器 - 目标处理器上软件写
GICD_SPENDSGIRn
寄存器
- 对于一个
SPI
或PPI
,发生以下2
种情况的1
种:
- 外设发出一个中断请求信号
- 软件写
GICD_ISPENDRn
寄存器
2、删除挂起状态(B1、B2
)
- 对于
SGI
- 目标处理器写
GICD_CPENDSGIRn
寄存器
- 对于一个
SPI
或PPI
,发生以下2
种情况的1
种:
- 电平触发类型中断,信号取消
- 边沿触发类型中断,软件写
GICD_ICPENDRn
寄存器
3、挂起到激活(C
)
如果中断使能,并且高优先级,软件从 GICC_IAR
寄存器读取时发生状态改变。
4、挂起到激活和挂起(D
)
- 对于
SGI
,这种转变发生在以下任一情况下:
- 将
SGI
状态设置为挂起的写入操作与读取GICC_IAR
几乎同时发生 - 当多个挂起的
SGI
具有相同ID
时,并且它们来自同一个源处理器并指向同一个处理器。其中一个SGI
状态变为激活(C
),其他SGI
状态变为激活和挂起(D
)。
- 对于
SPI
或PPI
,满足以下所有条件,则发生这种转换
- 中断开启
- 软件读取
GICC_IAR
,读操作将激活状态添加到中断中。 - 此外,还应满足以下条件之一:
- 对于电平触发中断,中断信号保持。通常都是这样,因为外设直到处理器处理完中断后才会取消触发信号。
- 对于边沿触发中断,是否发生此转换取决于读取
GICC_IAR
的时间(中断再次触发,上一次未处理),读取GICC_IAR
可能会转换到C
,后面可能会转换到A2
。
5、删除激活状态(E1、E2
)
- 软件写入
GICC_EOIR
或GICC_DIR
来停用中断,
三、中断分组和中断优先级
本节描述了一个不使用中断分组的实现,也不包括GIC安全扩展。中断分组和 GIC
安全扩展扩展了 GIC
中断优先级的基本模型。
软件通过为每个中断源分配一个优先级值来配置中断优先级。优先级值为 8
位无符号二进制。一个GIC至少支持 16
个优先级,最多支持 256
个优先级。如果 GIC
实现的优先级少于 256
个,则优先级字段的低阶位为 RAZ/WI
。这意味着表示优先级的字段 4 - 8 bit
,详细信息见表 3-1
。
在 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
:
带有 GIC
安全扩展的 GICv1
实现和 GICv2
实现有两个二进制点寄存器。用于计算优先级分组的二进制点寄存器取决于中断是组 0
中断还是组 1
中断,通过 GICD_IGROUPRn
寄存器定义,以及 GICC_CTLR.CBPR
位值。表 3-3
显示了用于不同 GIC
实现的二进制点寄存器。
四、中断分组对中断处理的影响
本节介绍中断分组和 GIC
安全扩展插件对中断处理的影响。
包含 GIC
安全扩展的 GICv1
实现,或任何 GICv2
实现,为 IRQ
和 FIQ
异常请求提供两个中断输出信号:
-
CPU
接口始终对组1
中断使用IRQ
异常请求 - 软件可以将
CPU
接口配置组0
中断使用IRQ
或FIQ
异常请求。
上电时或复位后,任何 GIC
实现都配置为仅使用单个中断输出信号。
1、GIC 中断分组支持
在 GICv1
实现中,中断分组仅作为 GIC
安全扩展的一部分提供。
GICD_IGROUPRn
寄存器将每个中断配置为组 0
或组 1
。
在 CPU
接口中,在 GICv2
实现中,GICC_*
别名寄存器可以提供对组 0
和组 1
寄存器的独立控制,如表 3-4
所示:
在包含 GIC
安全扩展的实现中,寄存器别名:
- 通常表示组
0
寄存器的非安全副本的别名,例如,GICC_ABPR
寄存器是GICC_BPR
寄存器非安全副本的别名 - 只能通过安全访问进行访问。
在包含 GIC
安全扩展的 GICv1
实现中:
- 唯一实现的别名寄存器是
GICC_ABPR
- 组
1
中断的其他控制仅由组0
控制寄存器的非安全副本提供,如图3-5
所示:
在包含GIC
安全扩展的GIC
实现中,在GICv1
和GICv2
中,CPU
接口对组1
中断的非安全控制是相同的。这意味着,在GICv2
实现中,表3-5
显示了提供对组1
中断进行非安全控制的GICC_*
寄存器。
在支持中断分组的实现中,GICC_CTLR
包含其他字段,包括用于控制分组中断处理的字段:
- 独立的使能位控制组
0
和组1
中断到连接的处理器的信号
-
bit[0]
是不支持中断分组的GIC
中的Enable
位,它成为EnableGrp0
位,并控制是否向处理器发送组0
中断信号 - 增加了
EnableGrp1
位,以控制是否向处理器发送组1
中断信号。
FIQEn
位,它控制接口信号组0
是否使用IRQ
或FIQ
中断请求中断到处理器。CBPR
位,控制是否使用GICC BPR
或GICC_ABPR
来确定可能被组1中断抢占的中断AckCtl
位,用于控制是否读取GICC_IAR
,或实现安全扩展的GIC
安全读取GICC_IAR
,来确认组1
中断。- 在
GICv2
实现中:
-
IRQ
和FIQ
旁路禁用位,用于控制是否将旁路IRQ
和FIQ
信号转发到处理器 -
EOImode
位,用于控制优先级下降是否与中断停用分开。如果 GIC 实现了安全扩展,则会为非安全访问和安全性访问实现单独的EOImodeNS
和EOImodeS
位。这为非安全和安全中断处理提供了结束中断模式的独立控制。
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
展示这种配置:
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
显示中断的优先级值字段的安全视图。存储在分发服务器中的优先级值等效于"安全"视图。
在这个视图中:
- 位
H-D
是GIC
必须实现的位,对应于32
个优先级。 - 位
c-a
是GIC
可能实现的位,如果未实现,则为RAZ/WI
。 -
GIC
必须实现位H-a
以提供最多256
个优先级。 -
ARM
建议,对于组1中断,bit[7]
设置为1
。
非安全访问只能看到与中断优先级的非安全视图对应的优先级值字段。对于非安全访问,GIC
支持的优先级是其支持的安全访问的一半。图 3-4
显示组 1
中断的优先级值字段的非安全视图。
在这个视图中:
- 位
G-D
是GIC
必须实现的位,对应于16
个优先级。 - 位
c-a
是GIC
可能实现的位,如果未实现,则为RAZ/WI
。 -
GIC
必须实现位G-a
以提供最多128
个优先级。 -
bit [0]
是RAZ/WI
。
优先级值的非安全视图不显示该值在分发服务器中的存储方式。在存储该值之前,将该值从非安全写入到优先级字段:
- 值右移
1
位。 -
bit [7]
被设置为1
。
此转换意味着组 1
中断的优先级值位于可能值范围的上半部分,这意味着中断优先级位于优先级范围的下半部分。
对中断的优先级值的安全读取将返回存储在分发服务器中的值。图 3-5
显示了组 1
的优先级值字段的安全视图,该组 1
的优先级值字段由非安全访问设置,或者由安全访问设置 bit[7]== 1
的优先级值。
对组 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
显示了"优先级"值字段的视图之间的关系。
图 3-7
显示来自安全访问和非安全访问的中断优先级的软件视图如何与分发服务器中持有的优先级值相关,以及安全访问和非安全访问可见的中断值。这适用于实现优先级值最大范围的 GIC
。
表 3-6
显示了 GIC
实现的优先级值位数如何影响组 1
中断优先级的安全和非安全视图。
不安全的软件无法查看组 0
中断的优先级设置。
这种优先级值表示的模型确保了编写的软件能够按照预期的实现这种 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_ABPR
是GICC_CTLR
的非安全副本的别名。GICC_ABPR
是一个安全寄存器,只能通过安全软件访问来访问。
3、中断分组对优先级分组的影响
当中断使用 GICC_ABPR
时,有效二进制点值比寄存器中存储的值少一个,如表 3-7
所示。这意味着,如果软件不知道中断分组和 GIC
安全扩展的影响,则无论它是在处于安全还是非安全状态的处理器上运行,都会看到相同的优先级分组机制。
- 在
GICv2
中,有效的二进制点值调整也发生在不包含安全扩展的GIC
实现中。 - 优先级分组始终基于分发服务器中保存的优先级值,而不是对非安全中断对应的优先级值的非安全读取可见的值。
GICC_ABPR
寄存器支持的最小二进制点值为:
- 具体定义实现。
- 在
1-4
范围内。 - 一个大于
GICC_BPR
寄存器的安全副本支持的最小值。
当 GICC_CTLR.CBPR==0
时,组1中断的优先级分组结果如表 3-7
所示。
在包含安全扩展的 GIC
实现中,当 GICC_CTLR.CBPR == 1
时:
- 对
GICC_BPR
的非安全读取将返回安全GICC_BPR
的值,该值递增1
并饱和为0b111
。 - 对
GICC_BPR
的非安全写入将被忽略。 -
GICC_ABPR
寄存器是多余的。
4、当 GIC 支持中断分组时生成中断
见文档
五、虚拟化扩展对中断处理的影响
见文档
六、GIC 使用模型示例
实现 ARMv7-A
或 ARMv7-R
体系结构配置文件的 ARM
处理器支持两个中断请求信号 nIRQ
和 nFIQ
,每个信号都有一个关联的异常和处理器模式:
- 触发
IRQ
请求会生成IRQ
异常。默认情况下,这是在IRQ
模式下执行的,并且采用异常会屏蔽后续的IRQ
异常。 - 触发
FIQ
请求会生成FIQ
异常。默认情况下,这是在FIQ
模式下进行的,并且采用异常会屏蔽FIQ
和IRQ
异常。
所有这些使用模型示例都使用图 3-8
中所示的硬件实现,以及支持组 0
和组 1
中断的 GIC
。
在每个使用模型中,软件使用 GICD_IGROUPRn
寄存器将中断分配给两组,并使用 IRQ
和 FIQ
中断请求向处理器发出信号。
1、使用 IRQ 和 FIQ 提供不安全和安全的中断
图 3-9
显示了一个实现 GIC
安全扩展的系统,连接到一个实现 ARM
处理器安全扩展的处理器。此实现:
- 使用组
0
中断作为安全中断,以FIQ
信号。 - 将组
1
中断用作非安全中断,以IRQ
为信号。
这意味着,在处理器上,FIQ
中断永远不会路由到非安全软件,IRQ
中断也永远不会路由到安全软件。
使用组 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
寄存器提供的中断分组来控制 IRQ
和 FIQ
,基于:
- 将
FIQ
分配给中断组0
。 - 将
IRQs
分配给中断组1
。
本节适用于包含 GIC
安全扩展的任何 GICv1
实现或任何 GICv2
实现。
在 GIC
复位时,对于支持中断分组的 GIC
实现,所有中断都分配给组 0
。
因此,要使用此配置,在处理器上执行的软件必须:
- 对
GICD_IGROUPRn
寄存器进行编程,以将IRQ
中断分配给组1
。
对于不包含安全扩展的 GICv2
实现,GICD_IGROUPRn
重置值是由具体实现定义的。
- 将
GICC_CTLR.FIQEn
设置为1
,以将组0
中断分配给FIQ
。 - 将
GICC_CTLR.AckCtl
设置为0
,这样FIQ
和IRQ
中断都可以从单个地址空间中被确认,使用
-
GICC_IAR
确认组0
中断。 -
GICC_AIAR
确认组1
中断。 -
GICC_EOIR
指示组0
中断完成。 -
GICC_AEOIR
指示组1
中断完成。
然而,GICC_AIAR
和 GICC_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
上的虚拟化扩展的功能实现虚拟分发服务器。此虚拟分发服务器可以将来自GIC
的IRQ
中断虚拟化为虚拟IRQ
和虚拟FIQ
中断,并将其路由到相应的虚拟机。 - 将物理
IRQ
路由到Hyp
模式,以便虚拟分发服务器可以为其提供服务。
- 在虚拟机上运行的客户机操作系统将中断分配给组
0
或组1
,以将其分配为FIQ
或IRQ
。对GIC
分发服务器寄存器的访问将捕获到虚拟机管理程序,因此可以访问虚拟分发服务器。
虚拟CPU
接口将这些中断作为虚拟FIQ
或虚拟IRQ
发出信号。此虚拟化受虚拟机管理程序控制,对来宾操作系统不可见。
当GIC
向处理器发送IRQ
信号时,中断将路由到Hyp
模式。虚拟机管理程序确定中断是针对自身还是针对来宾操作系统。如果是针对来宾操作系统,它将确定: - 哪个客户机操作系统必须处理中断。
- 该来宾操作系统是否已将中断配置为
FIQ
或IRQ
。 - 中断优先级,基于目标来宾操作系统的优先级配置。
如果中断以当前客户机操作系统为目标,则虚拟机管理程序将更新 List
寄存器,以将中断添加到当前虚拟机的挂起中断列表中。
- 在收到当前来宾操作系统无法处理的
IRQ
时,虚拟机管理程序可以:
- 将控制权转移到可以处理中断的客户机操作系统。
- 将中断标记为挂起,作为相应来宾操作系统的已保存上下文的一部分。
- 一个系统可以有一些中断,这些中断可以由多个来宾操作系统处理,而其他中断必须路由到特定的来宾操作系统。
客户机操作系统处理虚拟中断的方式与处理相应物理中断的方式完全相同。来宾操作系统无法检测到它正在处理虚拟中断而不是物理中断。
七、编程模型
见文档