ARM V8 GIC中断模块

news2025/3/2 4:44:05

文章目录

  • 1. 缩略语
  • 2. 简介
    • 2.1. 中断类型
      • 2.1.1 SGI软件中断
      • 2.1.2 PPI私有外设中断
      • 2.1.3 SPI 共享外设中断
      • 2.1.4 LPI(locality-specific peripheral interrupts)
    • 2.2. GIC 架构
      • 2.2.1 Distributor
      • 2.2.2 Redistributor
      • 2.2.3 CPU Interfaces
    • 2.3. 属性层次(affinity,亲和度相关)(待补充)
  • 2.4. 中断状态
    • 2.5. 中断分组
    • 2.6. 中断生命周期
    • 2.7. 中断流程
  • 3. 寄存器
  • 4. 参考资料
  • 5. 问题记录
    • 5.1.什么是屏蔽优先级?
    • 5.2. 亲和度如何理解?如何应用
    • 5.3. 哪个模块负责仲裁优先级?
    • 5.5. 为什么GIC V3会把Interface放到Core中
    • 5.6. Group与安全等级如何理解,在R52中如何理解

1. 缩略语

在这里插入图片描述

2. 简介

以下介绍均以ARM R52内核(GIC v3)介绍。

2.1. 中断类型

2.1.1 SGI软件中断

16个,中断号:0~15。通过向ICDSGIR寄存器写入SGI中断号、CPU ID,来产生一个软件中断;通过读ICCIAR寄存器或者向ICDICPR寄存器相应的比特位写1,可以清除中断。所有的SGI为边沿触发。通常用于处理器之间的通信,如linux内核电源管理模块中调用的ipi中断就是通过SGI实现的。
由软件触发,多用于核间通信。

2.1.2 PPI私有外设中断

16个,中断号:16~31,该类型中断是每个处理器私有的,即一个特定的中断只会被路由到特定的处理器上。且其同一个中断号在每个处理器上都可以有不同的中断,如对于一个拥有两个PE的smp系统,中断号16的PPI中断可以分别被注册为PE0和PE1的私有中断,它们可以被独立触发并被特定的PE独立处理SPI共享外设中断。

2.1.3 SPI 共享外设中断

中断号:32~1019,该类型中断不与特定的cpu绑定,可以根据affinity配置被路由到任意cpu或一组特定的cpu上。如一般的外设中断都是通过SPI方式连接的。

2.1.4 LPI(locality-specific peripheral interrupts)

LPI是一种基于消息的边沿中断。也就是,中断信息,不在通过中断线,进行传递,而是通过memory。gic内部,提供一个寄存器,当外设往这个地址,写入数据时,就往gic发送了一个中断。
在soc系统中,外设想要发送中断给gic,是需要一根中断线的。如果现在一个外设,需要增加一个中断,那么就要增加一根中断线,然后连接到gic。这样,就需要修改设计。而引入了LPI之后,当外设需要增加中断,只需要使用LPI方式,传输中断即可,不需要修改soc设计。
引入了LPI之后,GICv3中,还加入了ITS组件,interrupt translation service。ITS将接收到的LPI中断,进行解析,然后发送到对应的redistributor,再由redistributor将中断信息,发送给cpu interface。
外设通过写 GITS_TRANSLATER 寄存器,来传递消息中断。具体可见GIC架构图中Message based interrupts。

PS:GICv3支持,但是在Armv8-R未实现,即R52中未实现

2.2. GIC 架构

主要分为以下几部分,Distributor、Redistributor、CPU Interfaces三部分。
在这里插入图片描述

2.2.1 Distributor

  • Group的使能;
  • SPI的Group的配置,中断在软件层面分为FIQ和IRQ,在硬件上对应分为Group 0和Group 1,具体可以设置xxx寄存器,设置为0,选择Group0(FIQ),设置为1,选择Group 1(IRQ);
  • SPI的使能、优先级、触发方式(电平还是边沿)、目标核,R52优先级支持5bit,最高32级优先级,值越小,优先级越高;优先级相同时,按自然优先级排序,ID越小优先级越高
  • SPI的Pending、Active状态设置和清除。

2.2.2 Redistributor

  • 电源管理,负责更新GIC模块的上下电状态,下电时,软件写ProcessorSleep=1,同时软件一直读取ChildrenAsleep,知道读到1为止。上电时,软件写ProcessorSleep=0,同时软件一直读取ChildrenAsleep,知道读到0为止。
  • 配置PPI
  • 配置SGI

PS:MCU进入睡眠模式后,Distributor是还在工作的,因为要依赖外部中断去唤醒CPU,而外部中断是要经过Distributor的,所以Distributor还在工作。

2.2.3 CPU Interfaces

  • 提供当前Group0/1响应的中断ID(ICC_RPR 反应当前正在处理的中断优先级)
  • 设置当前核的屏蔽优先级(ICC_PMR)
  • 中断确认,中断执行完毕后,软件去设置标志位(ICC_IARn),告诉硬件中断执行完毕,优先级降低(不合理)
  • 当前核的Group的使能
  • 软中断触发(ICC_SGInR)
    PS:
    interfaces与Distributor的使能范围应该是不一样的,interfaces里面应该是分开关,Distributor里面应该是总开关。
    针对同一个Core同时来了两个中断请求,具体的仲裁是在CPU Interfaces进行的。

2.3. 属性层次(affinity,亲和度相关)(待补充)

GICv3的一大变化,是对core的标识。对core不在使用单一数字来表示,而是使用属性层次来标识,和arm core使用MPIDR_EL1系统寄存器来标识core一致。
每个core,根据属性层次的不同,使用不同的标号来识别。如下图所示,是一个4层结构,那么对于一个core来说,就可以用xxx.xxx.xxx.xxx 来识别

但是R52只有三级,不支持Level3
在这里插入图片描述

2.4. 中断状态

在这里插入图片描述
Inactive:中断没激活也没挂起
Pending:中断产生,但是没有响应服务
Active:中断正在响应服务,但还没服务完
Active & Pending:中断在响应服务的过程中,又产生了中断请求

2.5. 中断分组

gicv3,将中断分成了2个大组,group0和group1。
group0:提供给EL3使用
group1:又分为2组,分别给安全中断和非安全中断使用
如下图所示:
在这里插入图片描述
以下是IRQ,FIQ与组的对应关系:
在这里插入图片描述
R52没有EL3
在这里插入图片描述
Armv8(R52)只支持安全状态,即CPU只有Secure EL0,EL1这种情况。
在这里插入图片描述

2.6. 中断生命周期

中断生命周期,如下图所示:

在这里插入图片描述

  • generate:外设发起一个中断
  • distribute:distributor对收到的中断源进行仲裁,然后发送给对应的cpu interface
  • deliver:cpu interface将中断发送给core
  • activate:core通过读取 GICC_IAR 寄存器,来对中断进行认可
  • priority drop: core通过写 GICC_EOIR 寄存器,来实现优先级重置
  • deactivation:core通过写 GICC_DIR 寄存器,来无效该中断
  • 这个中断生命周期,和gicv2的中断生命周期是一样的。

2.7. 中断流程

下图是gic的中断流程,中断分成2类:

  • 一类是中断要通过distributor,比如SPI中断
  • 一类是中断不通过distributor,比如LPI中断

在这里插入图片描述
中断要通过distributor的中断流程

  • 外设发起中断,发送给distributor
  • distributor将该中断,分发给合适的re-distributor
  • re-distributor将中断信息,发送给cpu interface。
  • cpu interface产生合适的中断异常给处理器
  • 处理器接收该异常,并且软件处理该中断

LPI中断的中断流程

  • 外设发起中断,发送给ITS
  • ITS分析中断,决定将来发送的re-distributor
  • ITS将中断发送给合适的re-distributor
  • re-distributor将中断信息,发送给cpu interface。
  • cpu interface产生合适的中断异常给处理器
  • 处理器接收该异常,并且软件处理该中断

3. 寄存器

分为两类,一类是放在GIC里面的外设寄存器,通过memory-mapped访问,一类是放在CPU里面的寄存器,内核直接通过汇编命令访问。
memory-mapped访问的寄存器:

  • GICC: cpu interface寄存器
  • GICD: distributor寄存器
  • GICH: virtual interface控制寄存器,在hypervisor模式访问
  • GICR: redistributor寄存器
  • GICV: virtual cpu interface寄存器
  • GITS: ITS寄存器

系统寄存器访问的寄存器:

  • ICC: 物理 cpu interface 系统寄存器
  • ICV: 虚拟 cpu interface 系统寄存器
  • ICH: 虚拟 cpu interface 控制系统寄存器

4. 参考资料

GICv3:https://zhuanlan.zhihu.com/p/520133301
https://zhuanlan.zhihu.com/p/261379308
架构基础:https://zhuanlan.zhihu.com/p/261379308
GICv2:内部包含Distributor和Redistributor、Interface模块的功能,目前不确定完全与GICv3完全一样
https://zhuanlan.zhihu.com/p/527107797

5. 问题记录

5.1.什么是屏蔽优先级?

过滤优先级较小的中断,小于MASK优先级的中断不会通知到CPU。
PS:上电后,MASK为0,即屏蔽所有中断,想要响应中断,一定要初始化该参数。

5.2. 亲和度如何理解?如何应用

在R52里面全是0,目前是理解将亲和度相同的核聚集为一类。
在这里插入图片描述

5.3. 哪个模块负责仲裁优先级?

参考资料1:https://zhuanlan.zhihu.com/p/527107797
在这里插入图片描述

5.5. 为什么GIC V3会把Interface放到Core中

寄存器分为系统寄存器和外设寄存器两种,与内核相关的寄存器称为系统寄存器,Core可以直接通过汇编命令去访问,而外设寄存器是通过memory-mapped方式(一般会使用AXI总线)访问。
GICV2中,cpu interface的寄存器,是实现在GIC内部的,因此当core收到一个中断时,会通过axi总线(假设memory总线是axi总线),去访问cpu interface的寄存器。而中断在一个SOC系统中,是会频繁的产生的,这就意味着,core会频繁的去访问GIC的寄存器,这样会占用AXI总线的带宽,总而会影响中断的实时响应。而且core通过AXI总线去访问cpu interface寄存器,延迟,也比较大。
在gicv3中,将cpu interface从GIC中抽离出来,实现在core内部,而不实现在GIC中。core对cpu interface的访问,通过系统寄存器方式访问,也就是使用msr,mrs访问,那么core对cpu interface的寄存器访问,就加速了,而且还不占用AXI总线带宽。这样core对中断的处理,就加速了。

5.6. Group与安全等级如何理解,在R52中如何理解

配置为Group0后,无论当前Core的安全等级是什么,最后都是发起FIQ中断,如果配置Group1,则根据下表去对应。

在这里插入图片描述
①R52没有EL3(具体参考‘3.2.5.中断分组’)
②R52 Core状态只有SecureEL0,EL1
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

perl Window安装教程

perl Window安装教程 下载地址 https://platform.activestate.com/tangxing806/ActivePerl-5.28/distributions 运行state-remote-installer.exe 按下图截图步骤 检查perl版本 参考文献: perl安装教程

算法日记(2024.12.09)

1.二叉树的最小深度 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:2 …

《操作系统 - 清华大学》6 -5:局部页面置换算法:最不常用置换算法 (LFU, Least Frequently Used)

文章目录 1. 最不常用算法的工作原理2.最不常用算法特征3. 示例 1. 最不常用算法的工作原理 最不常用算法:注意并不是表示算法本身不常用,而是采取最不常使用页面的策略,Least Frequently Used, LFU。LRU 是最久未被访问的页&…

Hive分区值的插入

对于Hive分区表,在我们插入数据的时候需要指定对应的分区值,而这里就会涉及很多种情况。比如静态分区插入、动态分区插入、提供的分区值和分区字段类型不一致,或者提供的分区值是NULL的情况,下面我们依次来展现下不同情况下的表现…

OpenAI12天 –第3天的实时更新,包括 ChatGPT、Sora、o1 等

OpenAI提前开启了假期,推出了为期 12 天的活动,名为“OpenAI 12 天”。在接下来的一周左右的每一天,OpenAI 都将发布现有产品的新更新以及新软件,包括备受期待的 Sora AI 视频生成器。 OpenAI 首席执行官 Sam Altman 表示&#x…

C#导出数据库到Excel文件(.NET)

随着企业业务的增长和复杂性的增加,对数据进行有效的分析、共享和报告变得至关重要;而Excel,作为一款广泛接受的数据处理工具,提供了强大的计算能力、可视化选项以及与多种数据分析工具的兼容性,使得它成为从数据库导出…

基于Java后台实现百度米制坐标转WGS84地理坐标实战

目录 前言 一、需求简介 1、信息查询 二、Java后台转换 1、相关属性 2、相关转换方法 3、实例转换 三、Leaflet可视化 1、准备展示数据 2、Marker标记 3、可视化效果 四、总结 前言 在现代信息技术高速发展的今天,地理信息系统(GIS&#xff0…

声音克隆GPT-SoVITS

作者:吴业亮 博客:wuyeliang.blog.csdn.net 一、原理介绍 GPT-SoVITS,作为一款结合了GPT(生成预训练模型)和SoVITS(基于变分信息瓶颈技术的歌声转换)的创新工具,正在声音克隆领域掀…

自动驾驶数据集的应用与思考

数据作为新型生产要素,是数字化、网络化、智能化的基础,是互联网时代的“石油”“煤炭”,掌握数据对于企业而言是能够持续生存和发展的不竭动力,对于需要大量数据训练自动驾驶系统的企业而言更是如此。 而随着激光雷达、毫米波雷…

开源项目:轻型图像分割 unet_lite

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

贪心算法专题(四)

目录 1. 单调递增的数字 1.1 算法原理 1.2 算法代码 2. 坏了的计算器 2.1 算法原理 2.2 算法代码 3. 合并区间 3.1 算法原理 3.2 算法代码 4. 无重叠区间 4.1 算法原理 4.2 算法代码 5. 用最少数量的箭引爆气球 5.1 算法原理 ​5.2 算法代码 1. 单调递增的数字…

【大模型系列篇】GPU资源容器化访问使用指南

在当今的高性能计算和机器学习领域,GPU(图形处理单元)因其卓越的并行计算能力而扮演着至关重要的角色。随着容器化技术如 Docker 的普及,越来越多的数据科学家和开发者选择将他们的应用和工作负载封装到 Docker 容器中&#xff0c…

【力扣】409.最长回文串

问题描述 思路解析 因为同时包含大小写字母,直接创建个ASCII表大小的桶来标记又因为是要回文子串,所以偶数个数的一定可以那么同时,对于出现奇数次数的,我没需要他们的次数-1,变为偶数,并且可以标记出现过…

Linux——管理用户和用户组

一、用户有哪些 root用户 定义:root用户是Linux系统中的最高权限用户,具有对系统所有资源的完全控制权。特性:root用户可以执行系统中的任何操作,包括修改系统配置文件、安装软件、管理系统服务等。由于其拥有最高权限&#xff0c…

SIP系列七:ICE框架(P2P通话)

我的音视频/流媒体开源项目(github) SIP系列目录 目录 一、NAT 1、NAT介绍 2、NAT类型 2.1、 完全圆锥型NAT 2.2、受限圆锥型NAT 2.3、端口受限圆锥型NAT 2.4、对称NAT 3、NAT打洞 3.1、不同一NAT下 3.2、同一NAT下 二、ICE 三、ICE中的SDP 至此&#x…

Spring Boot如何实现防盗链

一、什么是盗链 盗链是个什么操作,看一下百度给出的解释:盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的…

5.内容管理模块-课程查询

搞清楚一个项目的业务流程最直接的手段,就是找一个账号登录进去,操作一遍。 3.3设计接口 接口设计分析 post在需要提交很多参数的时候使用,并且post的安全性较高。 接口分析: po包,一般存放和数据库交互的实体类。 …

网络编程 | TCP套接字通信及编程实现经验教程

1、TCP基础铺垫 TCP/IP协议簇中包含了如TCP、UDP、IP、ICMP、ARP、HTTP等通信协议。TCP协议是TCP/IP协议簇中最为常见且重要的通信方式之一,它为互联网上的数据传输提供了可靠性和连接管理。 TCP(Transmission Control Protocol,传输控制协议…

vue3组件间传值

definProps方式 子组件&#xff1a;assignSuppliers.vue const propdefineProps({fid:String}); 父组件&#xff1a;index.vue <!-- 供应商分配 --><n-drawerwidth"800"v-model:visible"drawerSupplierConfig.visible":title"drawerSuppli…

《网络安全编程基础》之Socket编程

我的代码 server.c // server.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <Winsock2.h> #pragma comment(lib,"ws2_32.lib") //添加静态链接库文件 void main(int argc,char* argv[]) {WSADATA …