其他分享
首页 > 其他分享> > ARM GIC(三) GIC V3 Handling Interrupts学习笔记。

ARM GIC(三) GIC V3 Handling Interrupts学习笔记。

作者:互联网

目录

Handling Interrupts

5.1 What happens when an interrupt becomes pending(中断什么时候变成挂起状态)

当中断被挂起时,中断控制器决定是否发送中断连接到其中一个已连接的PE。中断控制器选择的PE(如果有)取决于以下设置:
在这里插入图片描述

5.2 Interrupt acknowledge(中断响应)

CPU接口有两个IAR。读取IAR返回INTID在典型的中断处理程序中,处理中断的第一步是获取IAR。
在这里插入图片描述

5.3 Spurious interrupts(伪中断)

1020到1023是为特殊目的保留的。这些INTID可以通过读取IAR返回,并指示异常处理中的特殊情况。
在这里插入图片描述

在下面的例子中,一个移动系统有一个调制解调器中断,它向来电发出信号。此中断将由REE业务操作系统在非安全状态下处理。
在这里插入图片描述
1、当PE在安全EL1上 TEE 安全操作系统工作时,此时中断变为挂起。中断被配置为非安全组non-secure Group1时,它将作为FIQ发出信号。此时EL3 SCR_EL3.FIQ==1,IRQ == 0。

2、在EL3执行的安全监控软件读取IAR,IAR返回1021。1021指示中断预计将在非安全状态下处理,那么EL3需要执行必要的上下文切换操作。

3、现在PE处于非安全状态,中断被作为IRQ发出信号,并被带到非安全状态EL1将由REE操作系统异常向量表中处理。

上图中示例中,非安全组1中断将会导致CPU立即退出安全操作系统。这可能并不总是需要或想要的。图11显示了一个替代模型,其中中断最初用于保护EL1,也是目前TF-A主流推荐配置。

Figure 11 Alternative routing model

1、当PE在安全EL1上执行受信任的操作系统时,调制解调器中断变为挂起。当调制解调器中断被配置为非安全组1时,它将作为FIQ发出信号。但是此时SCR_EL3.FIQ==0,采取异常以保护EL1。
2、受信任的操作系统执行完其内部所有操作之后。当它准备好时,TEE-OS系统将使用SMC指令,切回非安全状态,此时CPU回到REE系统中
3、SMC例外情况适用于EL3。在EL3执行的安全监视器软件执行以下操作:必要的上下文切换操作。
4、现在PE处于非安全状态,中断被作为IRQ发出信号,并被路由到当前层级异常向量表中处理。

5.4 Running priority & preemption(优先级和抢占)

PMR设置中断必须转发到特定PE的最小优先级。这个GICv3体系结构具有运行优先级的概念。当PE确认一个中断时,它的运行优先级变成了中断的优先级。当PE写入时,运行优先级返回到它以前的值其中一个EOI寄存器。当前运行优先级报告在CPU接口的运行优先级寄存器中(ICC_RPR_EL1)。在考虑抢占时,运行优先级的概念很重要。抢占发生在优先级中断被发信号给已经在处理低优先级中断的PE。先发制人为软件带来了一些额外的复杂性,但它可以防止低优先级中断阻塞处理更高优先级的中断。

在 distributor 和 CPU interface 中都存在中断优先级的概念,高优先级的中断信号自然是优先处理,优先处理分为两种概念,一种是抢占优先,高优先级的中断可以直接抢占低优先级中断执行,另一种是并发的优先级,也就是当两个中断同时触发时,才会使用根据优先级来判断谁先执行,而如果低优先级中断正在处理,也只能等着。

在 gic 中,优先级由 8 位表示,总共 256 个等级,具体的实现可以不使用这么多,最少可以使用 4 bits 来表示,即 16 个优先级,优先级值的 value 越低,对应的执行优先级越高,因此,优先级为 0 总是表示最高优先级的中断,而最低优先级对应的 value,根据使用的优先级 bits 而定。

在 gic 中,存在两种类型的优先级,一种就是上面说的每个中断源都可配置为一个静态的中断优先级(由 distributor 管理),这个优先级可通过软件动态地修改,另一种是 CPU interface 的 runtime 优先级,即当前正在处理的优先级,当前中断的优先级高于正在处理的优先级时,中断才会将当前中断发送到 CPU 核,不同优先级的中断之间可以配置抢占,也就是在 CPU 正在处理低优先级中断时,再次发送一个高优先级中断,不过发送归发送,具体的实现中 CPU 是不是会受理该新的中断,根据实现而定,比如 linux 中,即使配置 gic 支持抢占,也会因为 linux 处理中断时会关闭中断而禁止中断的抢占。

在 GIC 的初始化阶段就已经为每个外部中断初始化了优先级,在外部中断传递的过程中,优先级和抢占的功能体现在下面的情况中

5.5 End of interrupt(中断处理)

当中断已被处理时,软件必须通知中断控制器中断已被处理已被处理,以便状态机可以转换到下一个状态。当 CPU 中断处理完之后,需要将中断处理完的消息通知 GIC,这个消息通知包含两个部分

在GICv3体系结构中,优先级下降和停用可以同时发生,也可以单独发生。这是由ICC的设置决定。ICC_CTLR_ELn.EOImode。
在这里插入图片描述
在具体的实现中,这两个过程可配置为统一操作和分开操作的模式,由寄存器 GICC_CTLR 的 EOI 配置位进行配置,在 GIC 中被称为 EOI(end of interrupt) mode,当 EOI mode 被使能时,写寄存器 GICC_EOIR 将会触发中断的 priority drop,而 deactivate 操作需要通过写 GICC_DIR 寄存器实现,当 EOI mode 被 disable (对应上图中EOImode = 0)时,直接写 GICC_EOIR 将会同时触发 priority drop 和中断的 deactivate。

中断如何上报呢?

前面几篇博文主要结合手册梳理了中断一些基础概念,以及中断路由,中断嵌套的概念。下面以一个常见的低电平触发的中断为例,下面是一个中断的完整上报流程

这是一个 SPI 中断的处理流程,对于 SGI 来说,不同之处在于:

标签:Handling,优先级,中断,Interrupts,处理,GIC,interface,抢占,CPU
来源: https://blog.csdn.net/xy010902100449/article/details/122708715