当前位置: 首页 > article >正文

《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__overview》学习笔记

 1.GIC是基于Arm GIC架构实现的,该架构已经从GICv1发展到最新版本GICv3和GICv4。 Arm 拥有多个通用中断控制器,可为所有类型的 Arm Cortex 多处理器系统提供一系列中断管理解决方案。这些控制器的范围从用于具有小型 CPU 内核数的系统的最简单的 GIC-400 到用于高性能多芯片系统的 GIC-600。

2.GICv3 支持 Arm TrustZone 技术,但 TrustZone 的使用是可选的。GICD_CTLR.DS 位控制了中断安全性模型。如果设置为 1,禁用安全状态,所有中断被视为非安全中断;如果设置为 0,启用安全状态,使得安全中断和非安全中断能够被分别处理。

3.在ARM GICv3和GICv4中,Distributor、Redistributor和CPU接口是核心的中断管理模块,它们各自承担不同的功能,协同工作来管理系统中的中断。以下是对这三个模块的详细总结:1Distributor:Distributor是一个全局的组件,所有CPU共享,负责处理 Shared Peripheral Interrupts (SPIs),即系统中共享的外设中断,它是整个中断控制器的核心模块。Distributor的主要任务是配置和管理这些SPIs,可以选择启用或禁用SPI。Distributor提供接口来设置每个中断的优先级,还负责SPIs中断的路由,决定哪个中断会发送到哪个处理器核心。Distributor可以配置每个SPI是电平敏感的(Level-sensitive)还是边沿触发的(Edge-triggered)。除了传统的中断信号,Distributor还能生成消息信号中断(MSIs),这是一个更灵活的中断触发机制,常用于PCIe总线设备。还可以确定在每个安全状态中使用的程序员模型:亲和性路由还是传统遗留模式;2Redistributors:每个处理器核心都有一个对应的Redistributor,它主要负责管理与该核心相关的Private Peripheral Interrupts (PPIs) 和 Software Generated Interrupts (SGIs),即私有的外设中断和软件生成的中断。Redistributor提供接口来启用或禁用与该处理器核心相关的中断,包括SGIs和PPIs,它允许软件为每个SGIs和PPIs中断设置优先级。Redistributor还可以将中断分配到不同的中断组(如安全组和非安全组),以便在不同的安全状态下灵活处理中断。Redistributor允许设置每个PPI的触发方式,可以是电平敏感或边沿触发,确保灵活适应设备需求,Redistributor还为处理器核心提供电源管理支持,还可以控制SGI和PPI的状态;CPU接口:每个处理器核心也有一个独立的CPU接口,负责处理中断信号,是每个处理器核心与中断控制器的直接交互接口。在GICv3中,CPU接口通过系统寄存器(例如ICC_*_ELn)来访问。CPU接口提供了基本的中断处理配置和控制接口。通过这些寄存器,处理器可以配置是否启用中断处理,以及设置中断的整体优先级策略。当处理器接收到中断信号时,CPU接口提供了确认中断的机制,即通过读取Interrupt Acknowledge Register(IAR)来确认中断。随后,CPU接口允许处理器在处理中断后降低中断的优先级,确保其他中断能够有机会被处理。处理器可以通过设置中断优先级屏蔽寄存器,来定义系统中需要响应的最高优先级的中断。低于屏蔽值的中断会被忽略,从而实现对中断处理的灵活控制。CPU接口还允许定义处理器核心的抢占策略,决定哪个中断可以打断当前处理中断,使得高优先级中断能够抢占低优先级的中断,提供更精细的中断管理机制。在使用上述三个组件的相关寄存器之前,软件必须启用系统寄存器接口。这由ICC_SRE_ELn寄存器中的SRE位控制,其中n指定异常级别:EL1-EL3。

4.配置ARM GIC:1全局设置:分配器控制寄存器(GICD_CTLR)必须配置为启用中断组并设置路由模式,即首先启用亲和性路由(ARE位),GICD_CTLR中的ARE位(包括ARE_NS和ARE_S两个位,分别控制非安全模式和安全模式下的路由模式)控制GIC是在GICv3模式还是传统模式下运行(传统模式提供与GICv2的向后兼容性)。而后启用三个中断分组,Group0,SecureGroup1和Non-secureGroup1,分别由EnableGrp0、EnableGrp1S和EnableGrp1NS位控制;2每个PE的设置:每个核心都有自己的重新分配器Redistributor,Redistributor包含一个名为GICR_WAKER的寄存器,用于记录连接的PE是否在线或离线,中断仅转发至GIC认为在线的PE,复位时所有PE均被视为离线。想要将连接的PE 标记为在线,软件必须首先将GICR_WAKER.ProcessorSleep清除为0,而后轮询GICR_WAKER.ChildrenAsleep位直到读数为0。当PE离线时(即GICR_WAKER.ProcessorSleep==1),针对PE的中断将导致唤醒请求信号被置位。通常该信号将发送至系统的电源控制器,然后电源控制器打开PE,唤醒时该PE上的软件将清除ProcessorSleep位,从而允许转发唤醒PE的中断,如下图:

3CPU接口设置:CPU接口负责向与其连接的PE传送中断异常。要启用 CPU 接口,首先要启用系统寄存器访问,CPU 接口 (ICC_*_ELn) 部分描述了 CPU 接口寄存器,以及如何在 GICv3 中将它们作为系统寄存器进行访问。软件必须通过设置 ICC_SRE_ELn 寄存器中的 SRE 位来启用对 CPU 接口寄存器的访问。而后设置优先级掩码和二进制点寄存器。CPU接口包含优先级屏蔽寄存器(ICC_PMR_EL1)和二进制点寄存器(ICC_BPRn_EL1)。优先级掩码设置中断必须具有的最低优先级才能转发到PE,二进制点寄存器用于优先级分组和抢占(组优先级和子优先级)。接着设置EOI模式,CPU接口中ICC_CTLR_EL1和ICC_CTLR_EL3中的EOImode位控制如何处理中断完成。最后还需要使能每个中断组的信号,即与Group0和Group1相关的中断使能,具体查看手册P22;4PE配置:首先是路由控制,中断的路由控制位于PE的SCR_EL3和HCR_EL2中,路由控制位决定中断发生的异常级别ELn,这些寄存器中的路由位在复位时具有未知值,因此必须由软件初始化它们。其次是中断掩码,PE在PSTATE中也有异常掩码位,当这些位被设置时,中断被屏蔽,这些位在复位时设置。还有向量表,PE向量表的位置由VBAR_ELn寄存器设置,就像SCR_EL3和HCR_EL2、VBAR_ELn寄存器在复位时具有未知值,软件必须设置VBAR_ELn寄存器以指向内存中适当的向量表。还要考虑SPI、PPI和SGI的配置,SPI通过分发器使用GICD_*寄存器进行配置,PPI和SGI通过各个再分配器使用GICR_*寄存器进行配置。常见的相关的寄存器有:寄存器GICD_IPRIORITYn和GICR_IPRIORITYn用来配置优先级,每个INTID有一个与之相关联的优先级,表示为一个8位无符号值,0x00表示最高优先级,0xFF表示最低优先级,中断控制器不必实现所有8位优先级。如果GIC支持两个安全状态,则至少需实现5位,如果仅支持单一安全状态,则至少需实现4位。寄存器GICD_IGROUPn、GICD_IGRPMODn、GICR_IGROUPn和GICR_IGRPMODn用来配置中断所属的组,中断可以配置为属于三种中断组之一:组0、安全组1和非安全组1。使用寄存器GICD_ICFGRn和GICR_ICFGRn来指定中断是边沿触发还是电平触发。对于私有外设中断(PPIs)和共享外设中断(SPIs),软件必须指定其触发方式。软件生成中断(SGIs)总是被视为边沿触发,因此GICR_ICFGR0对这些中断的行为为读作一、写无效(RAO/WI)。每个INTID具有一个使能位,使用GICD_ISENABLERn和GICD_ICENABLERn进行使能配置。被配置为不可屏蔽的中断被视为高于同一组中所有其他中断的优先级,不可屏蔽属性在GICv3.3中引入,并需要处理器的支持,仅安全组1和非安全组1的中断可以标记为不可屏蔽。

5设置SPI的目标PE:对于SPI,必须配置中断目标,通过GICD_IROUTERn或GICD_IROUTERnE寄存器来配置。每个SPI对应一个GICD_IROUTERn寄存器,寄存器中的Interrupt_Routing_Mode位决定了中断的路由策略。Interrupt_Routing_Mode为0时SPI将被定向到特定的处理单元,具体的目标由寄存器中的亲和性坐标(A.B.C.D)指定,这意味着中断的接收者是固定的。Interrupt_Routing_Mode为1时SPI可以被送往任何连接的PE,且由分配器(Distributor)而非软件选择目标PE。每次中断被触发时,目标PE可能会不同,这种路由方式被称为1-of-N路由。值得注意的是,PE可以选择不接收1-of-N中断,这通过GICR_CTLR中的DPG1S、DPG1NS和DPG0位进行控制。

5.GIC将挂起的中断路由到PE之前要经过以下检查:1检查与中断关联的组是否已启用,每个INTID属于一个组,组0、安全组1或非安全组1,作为禁用组成员的中断无法发送到PE,这些中断将保持待处理状态,直到该组被启用为止;2检查中断是否已启用:单独禁用的中断可以变为挂起状态,但不会转发到PE;3检查路由控制以确定哪些PE可以接收中断:对于共享外设中断SPI,路由由GICD_IROUTERn控制,SPI可以针对一个特定的PE,或任何一个连接的PE。对于特定于位置的外设中断LPI,路由信息来自ITS。专用外设中断PPI特定于一个PE,并且只能由该PE处理。对于软件生成的中断SGI,原始PE定义目标PE列表;4检查中断优先级和优先级掩码来决定哪些PE适合处理中断:每个PE在其CPU接口中都有一个优先级掩码寄存器ICC_PMR_EL1,该寄存器设置将中断转发到该PE所需的最低优先级,只有优先级高于掩码的中断才会发送给PE;5检查运行优先级来决定哪些PE可以处理中断:运行优先级和抢占涵盖运行优先级以及它如何影响抢占,如果PE尚未处理中断,则运行优先级为空闲优先级0xFF,只有优先级高于运行优先级的中断才能抢占当前中断。如果中断通过了所有上述这些测试,它将作为IRQ或FIQ异常转发到适当的内核。

6.中断号确认:当进入异常处理程序时,软件不知道它采取了哪个中断,处理程序必须读取中断应答寄存器IAR之一以获取中断的 INTID。

通常IAR在进入中断处理程序时被读取,然而软件可以随时读取寄存器。有时IAR无法返回有效的INTID。例如,软件读取ICC_IAR0_EL1,确认第0组中断,但待处理中断属于第1组。在这种情况下,读取将返回保留的INTID之一,如下表所示:

有一个特殊情况:ICC_IAR0_EL1通常用于确认组0中断的中断号,但在EL3下,由于SecureGroup1中断会被处理为高优先级的FIQ,所以它们也会通过ICC_IAR0_EL1返回正确的中断号。FIQ的中断处理程序一般会直接读取ICC_IAR0_EL1,而IRQ的中断处理程序一般会直接读取ICC_IAR1_EL1,具体可参考手册P29的例子。

7.运行优先级和抢占:当PE确认中断时,其运行优先级与当前确认并要处理中断的优先级相同,该运行优先级的值记录在寄存器ICC_RPR_EL1中。当PE写入中断结束(EOI)寄存器之一时(PE写入该寄存器ICC_EOIR0_EL1或ICC_EOIR1_EL1以通知CPU接口它已完成指定的Group0或Group1中断的处理),运行优先级返回到其之前的值。在考虑抢占时,运行优先级的概念很重要。当向已处理较低优先级中断的 PE 发出高优先级中断信号时,就会发生抢占。二进制点寄存器ICC_BPRn_EL1将优先级分为两个字段:组优先级和子优先级,对于抢占,仅考虑组优先级位而子优先级位被忽略。二进制点寄存器仅限于控制中断处理中的抢占,而不影响待处理中断的选择过程,待处理的中断将基于它们的优先级来决定处理的顺序,而不考虑二进制点寄存器的设置。

8.中断结束:首先执行优先级下降,将运行优先级降回到中断发生之前的值。然后是停用,更新当前正在处理的中断的状态机,通常是从活动状态到非活动状态的转换。在GICv3架构中,优先级下降和停用可以一起发生,也可以单独发生。这是由ICC_CTLR_ELn.EOImode的设置决定的:该位设置为0时,对组0中断写入ICC_EOIR0_EL1或对组1中断写入ICC_EOIR1_EL1会执行优先级下降和停用,该模式常用于简单的裸机环境。该位设置为1时,对组0中断写入ICC_EOIR0_EL1或对组1中断写入ICC_EOIR1_EL1会导致优先级下降。停用需要再单独将中断号写入ICC_DIR_EL1寄存器,此模式通常用于虚拟化目的。

9.寄存器ICC_HPPIR0_EL1和ICC_HPPIR1_EL1分别用于指示 CPU 接口上最高优先级的待处理组 0 和组1中断的中断号。还有一些其他寄存器如:

10.软件生成中断 (SGI) 是软件可以通过写入中断控制器中的寄存器来触发的中断,生成 SGI 通过写入 CPU 接口中的以下 SGI 寄存器之一来生成 SGI(这是由发送方的PE 控制的):

而对于SGI的安装状态分组信息(Group0还是Group1)是由目标PE的GICR_IGROUPR0 和 GICR_IGRPMODR0 寄存器设定的,下图描述了目标PE的GIC是否转发中断(见手册P39):

 


http://www.kler.cn/a/468741.html

相关文章:

  • Unity 中计算射线和平面相交距离的原理
  • CSS 学习之正确看待 CSS 世界里的 margin 合并
  • 微信小程序Uniapp
  • k620老显卡,装cuda.等。
  • 音视频入门基础:MPEG2-PS专题(5)——FFmpeg源码中,解析PS流中的PES流的实现
  • 光缆生产车间可视化,让智能制造更透明
  • 使用 LlamaIndex 构建智能文档查询系统
  • 如何在 PC/无 PC 上从 Android 手机 SD 卡恢复已删除的文件
  • 商业领域 - 竞标极简理解
  • 音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介
  • 如何在 Spring Cloud Gateway 中创建全局过滤器、局部过滤器和自定义条件过滤器
  • 【办公类-47-02】20250103 课题资料快速打印(单个docx转PDF,多个pdf合并一个PDF 打印)
  • springmvc--请求参数的绑定
  • scala基础学习_判断循环
  • PHP伪协议:理解与安全防护
  • 基于 Spring 的自定义注解和请求拦截器实现认证机制
  • Win32汇编学习笔记05
  • 直接插入排序、折半插入排序、2路插入排序、希尔排序
  • C++软件设计模式之备忘录模式
  • “智能筛查新助手:AI智能筛查分析软件系统如何改变我们的生活
  • 实习第一周笔记
  • Scala 访问修饰符
  • Qt之FFmpeg播放器设计(十七)
  • Kotlin 面向对象与函数式编程
  • 飞书企业消息实践
  • Eclipse 首选项(Preferences)