《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):

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

健身房管理系统多身份

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…

General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model

通用 OCR 理论:通过统一的端到端模型实现 OCR-2.0 Abstract 随着人们对人工光学字符的智能处理需求日益增长,传统的OCR系统(OCR-1.0)已越来越不能满足人们的使用需求。本文,我们将所有人工光学信号(例如纯…

大数据组件(二)快速入门数据集成平台SeaTunnel

大数据组件(二)快速入门数据集成平台SeaTunnel SeaTunnel是一个超高性能的分布式数据集成平台,支持实时海量数据同步。 每天可稳定高效同步数百亿数据,已被近百家企业应用于生产。 SeaTunnel的运行流程如下图所示: 工作流程为:So…

前端如何判断多个请求完毕

在前端开发中,经常会遇到需要同时发起多个异步请求,并在所有请求都完成后再进行下一步操作的情况。 这里有几个常用的方法来实现这一需求: 使用 Promise.all() Promise.all() 方法接收一个 Promise 对象的数组作为参数,当所有的…

【机器学习】穷理至极,观微知著:微积分的哲思之旅与算法之道

文章目录 微积分基础:理解变化与累积的数学前言一、多重积分的高级应用1.1 高维概率分布的期望值计算1.1.1 多维期望值的定义1.1.2 Python代码实现1.1.3 运行结果1.1.4 结果解读 1.2 特征空间的体积计算1.2.1 单位球体的体积计算1.2.2 Python代码实现1.2.3 运行结果…

基于Arduino的FPV头部追踪相机系统

构建FPV头部追踪相机:让你置身于遥控车辆之中! 在遥控车辆和模型飞行器的世界中,第一人称视角(FPV)体验一直是爱好者们追求的目标。通过FPV头部追踪相机,你可以像坐在车辆或飞行器内部一样,自由…

鸿蒙HarmonyOS开发:拨打电话、短信服务、网络搜索、蜂窝数据、SIM卡管理、observer订阅管理

文章目录 一、call模块(拨打电话)1、使用makeCall拨打电话2、获取当前通话状态3、判断是否存在通话4、检查当前设备是否具备语音通话能力 二、sms模块(短信服务)1、创建短信2、发送短信 三、radio模块(网络搜索&#x…

高校教务系统登录页面JS分析——安徽大学

高校教务系统密码加密逻辑及JS逆向 最近有粉丝说安徽大学的教务系统换了,之前用的是正方出品的系统,今天我来看看新版教务系统怎么模拟登录,总体来说,还是比较简单的,就是一个哈希加密了密码,其次就是一个滑…

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示 参考文章源码下载地址一、SDL2的创建、初始化、退出二、系统基本Tick、彩屏刷新、按键事件三、彩屏获取与设置颜色四、彩屏填充颜色及清屏五、彩屏显示中文和英文字符串六、彩屏显示数字七、彩屏初始化八、主函数测…

Speech Recognition vs. Voice Recognition | 语音识别工作原理 | 模型训练 | 应用

注:机翻,未校。 Speech Recognition 与 Voice Recognition 剑桥词典 speech recognition,语音识别 voice recognition,声音识别 Speech vs. Voice - What’s the Difference? | This vs. That https://thisvsthat.io/speech-vs…

《Vue3实战教程》35:Vue3测试

如果您有疑问,请观看视频教程《Vue3实战教程》 测试​ 为什么需要测试​ 自动化测试能够预防无意引入的 bug,并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作,以控制用户对数据库的访问权限。通过账户管理,可以设置用户名、密码、主机地址等信息,确保数据库的安全性和可控性。例如,使用 CREATE USER 创建用户,ALTER…

【复盘】2024年终总结

工作 重构风控系统 今年上半年其实就是整体重构系统,经历了多次加班的,其中的辛酸苦辣只有自己知道,现在来看的话,其实对自己还有一定的成长,从这件事情上也明白 绩效能不能拿到A,在分配的任务的时候就决…

美食烹饪互动平台

本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) IDEAEclipseVisual Studio Code(VScode)Navica…

linux-centos-安装miniconda3

参考: 最新保姆级Linux下安装与使用conda:从下载配置到使用全流程_linux conda-CSDN博客 https://blog.csdn.net/qq_51566832/article/details/144113661 Linux上删除Anaconda或Miniconda的步骤_linux 删除anaconda-CSDN博客 https://blog.csdn.net/m0_…

[读书日志]从零开始学习Chisel 第一篇:书籍介绍,Scala与Chisel概述,Scala安装运行(敏捷硬件开发语言Chisel与数字系统设计)

简介:从20世纪90年代开始,利用硬件描述语言和综合技术设计实现复杂数字系统的方法已经在集成电路设计领域得到普及。随着集成电路集成度的不断提高,传统硬件描述语言和设计方法的开发效率低下的问题越来越明显。近年来逐渐崭露头角的敏捷化设…

工厂模式与抽象工厂模式在Unity中的实际应用案例

一、实验目的 实践工厂模式和抽象工厂模式的实际应用。 创建一个小型的游戏场景,通过应用这些设计模式提升游戏的趣味性和可扩展性。 掌握在复杂场景中管理和使用不同类型的对象。 比较在实际游戏开发中不同设计模式的实际效果和应用场景。 学习如何进行简单的性…

vue3+Echarts+ts实现甘特图

项目场景&#xff1a; vue3Echartsts实现甘特图;发布任务 代码实现 封装ganttEcharts.vue <template><!-- Echarts 甘特图 --><div ref"progressChart" class"w100 h100"></div> </template> <script lang"ts&qu…

[Linux]redis5.0.x升级至7.x完整操作流程

1. 从官网下载最新版redis&#xff1a; 官网地址&#xff1a;https://redis.io/download 注&#xff1a;下载需要的登录&#xff0c;如果选择使用github账号登录&#xff0c;那么需要提前在github账号中取消勾选“Keep my email addresses private”&#xff08;隐藏我的邮箱…

android 外挂modem模块实现Telephony相关功能(上网,发短信,打电话)

一.背景 当前模块不支持Telephony相关的功能,例如上网、发短信等功能,就需要外挂另一个模块实现此功能,这就是外挂modem模块实现Telephony功能,此篇主要就是说实现外挂modem模块功能中的Framework层实现逻辑,如下流程是在Android 13中实现的外挂pcie模块的流程 二.ril库相…