中断子系统--硬件层(GICv3)

目录

综述

硬件层--GICV3

中断类型

中断状态

Distributor组件

中断使能配置

中断触发方式配置

中断优先级配置 

中断分组标记

GIC处理中断流程


综述

 

由上面的block图,我们可知linux kernel的中断子系统分成4个部分:

  • 硬件层:最下层为硬件连接层,对应的是具体的外设与SoC的物理连接,中断信号是从外设到中断控制器,由中断控制器统一管理,再路由到处理器上;
  • 硬件相关层:这个层包括两部分代码,一部分是架构相关的,比如ARM64处理器处理中断相关,另一部分是中断控制器的驱动代码;
  • 通用层:这部分也可以认为是框架层,是硬件无关层,这部分代码在所有硬件平台上是通用的;
  • 用户层:这部分也就是中断的使用者了,主要是各类设备驱动,通过中断相关接口来进行申请和注册,最终在外设触发中断时,进行相应的回调处理;

硬件层--GICV3

 

gic的核心功能,就是对soc中外设的中断源的管理,并且提供给软件,配置以及控制这些中断源。

◾distributor:SPI中断的管理,将中断发送给redistributor

◾redistributor:PPI,SGI,LPI中断的管理,将中断发送给cpu interface

◾cpu interface:传输中断给core. (实现在core内部的)

◾ITS (Interrupt Translation Service components ):用来解析LPI中断.

中断类型

  1. SGI (Software Genrated Interrupt, 0-15):通常用于核间通信,也可称作IPI(Inter-Processor Interrupt)。比如可以使处理器停止工作,唤醒处理器等
  2. PPI (Private Peripheral Interrupt, 16-31):属于单个PE的私有中断,因此不同PE可以有相同的PPI号,但是对应不同的中断源。例如cpu的定时器中断等
  3. SPI (Shared Peripheral Interrupt, 32-1019):所有PE共享的中断,或者叫不限定特定的Cpu的中断。常见的按键中断啥的大部分都是这种
  4. LPI (Locality-specific Peripheral Interrupt, irqnr > 8192):GICv3新增,可以通过读/写寄存器的方式发送/接收中断。PI是一种基于消息的边沿中断。也就是,中断信息,不在通过中断线,进行传递,而是通过memory。gic内部,提供一个寄存器,当外设往这个地址,写入数据时,就往gic发送了一个中断。在soc系统中,外设想要发送中断给gic,是需要一根中断线的。如果现在一个外设,需要增加一个中断,那么就要增加一根中断线,然后连接到gic。这样,就需要修改设计。而引入了LPI之后,当外设需要增加中断,只需要使用LPI方式,传输中断即可,不需要修改soc设计。

 

应用场景:

  1. IPI:IPI_WAKEUP以手机为例,屏幕是一个重要的用户交互界面,用户通过触摸、滑动等方式与屏幕进行交互。为了保证屏幕的响应速度和用户体验,需要在用户按下电源键时尽快唤醒屏幕。但是,在手机中,为了节省电量和延长电池寿命,cpu核心通常会进入睡眠状态,以降低功耗。因此在用户按下电源键时,需要唤醒处于睡眠状态的cpu核心来处理这个事件。在多个核的系统中,一个cpu核心需要唤醒其他核心时,可以使用IPI_WAKEUP中断,具体的说,当用户按下电源键时,手机会向内核发送该中断请求,内核会将这个请求转发给处于睡眠状态的cpu核心,该核心会执行相应的处理程序,初始化显卡、显示器和输入设备等,最终将屏幕的内容显示出来。

中断状态

 

 

  1. Inactive:当前未声明中断源,无中断状态;
  2. Pending:硬件或软件触发了中断,中断源已被置位,但尚未传递到目标CPU,在电平触发模式下,产生中断的同时保持pending状态;
  3. Active:中断已被 CPU 确认;
  4. Active and pending:;对于边沿触发方式,表示一个中断正在处理,又触发一个新中断

并发生了抢占(GIC角度的抢占,只要又中断在处理,又发中断信号给CPU就算抢占),则原中断就会变成AP状态。

Distributor组件

Distributor主要包含两部分功能:中断属性配置,和将中断路由到下一步的GIC组件cpu interface

以下将分别描述Distributor可以执行的重要中断属性设置。

中断使能配置

GICv3可以设置特定中断号对应的中断是否被使能,若未设置使能状态则该中断不会被发送到CPU interface。中断的使能可以通过GICD_ISENABLER<n>寄存器设置(n为0 - 32),中断的失能可以使用GICD_ICENABLER<n>寄存器设置,这两个寄存器都为32 bit寄存器,每个中断使用一个bit控制其使能 / 失能状态。其寄存器定义如下:

 

中断触发方式配置

中断的触发方式可分为边沿触发(上升沿、下降沿)和电平触发(高电平、低电平),两种触发方式的行为有所不同。

触发方式

特点

边沿触发

在检测到上升沿或下降沿后触发中断,软件应答该中断后,中断即为active状态

电平触发

在检测到特定电平后触发中断,之后软件必须再次deassert,中断才会进入active状态(防止反复触发) (后面中断注册代码中会看到)

  SPI的中断触发方式可用GICD_ICFGR<n>寄存器设置(n为0 - 63),它是一个32bit寄存器,用两个bit表示一个中断的触发方式,其中bit0为保留位,bit1位0表示电平触发,为1表示边沿触发。其寄存器定义如下:

 

中断优先级配置 

gic 中,存在两种类型的优先级,一种是每个中断源都可配置为一个静态的中断优先级( distributor 管理),这个优先级可通过软件动态地修改,多个中断同时发生时,GIC选择将优先级最高的发给CPU。另一种是 CPU interface 运行优先级,如果已有中断在运行,只有当前中断的优先级高于正在处理的优先级时,中断才会将当前中断发送到 CPU 核,从GIC角度来看,这就是抢占了。也就是在 CPU 正在处理低优先级中断时,再次发送一个高优先级中断,不过发送归发送,具体的实现中 CPU 是不是会受理该新的中断,根据实现而定,比如 linux 中,即使配置 gic 支持抢占,也会因为 linux 处理中断时会关闭中断而禁止中断的抢占。

gic 中,优先级由 8 位表示,总共 256 个等级。优先级值的 value 越低,对应的执行优先级越高

ICC_BPRn_EL1寄存器,该寄存器定义优先级值字段分成两部分的点,即组优先级字段和子优先级字段。 组优先级字段确定组 1 中断抢占。 换句白话来解释就是,中断优先级被分成了两部分,如下图所示,ICC_BPRn_EL1寄存器的BIT[2:0]定义了下图中的N的值

 

对于抢占,仅考虑Group优先级位。 Subpriority优先级位被忽略. 然后举一个例子:

INTID A has priority 0x10

INTID B has priority 0x20

INTID C has priority 0x21

如上有三个中断,A可以抢占B,但B不可以抢占C,因为BCGroup priority是一样的

 

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

首先,distributor 总是会将最高优先级的外部中断传递给 CPU interface,而 CPU interface 会维护当前自己正在处理或者正在 assert CPU IRQ 线的中断优先级。

第一种:CPU interface将中断信号发给cpu,CPU 再通过iar寄存器的读操作获取外部中断 ID.但是,在 CPU 的 IRQ 线被 assert 到 CPU 读取寄存器的过程中,产生了更高优先级的中断,会发生什么? distributor 会将新发生的高优先级的中断传递给 CPU interface,因此执行到 CPU 读取中断 ID 寄存器时,读取的也就是新中断的 ID 号,这种情况下,实现了高优先级中断的优先处理,从 CPU interface 的角度来说,这算是中断抢占,因为旧的中断已经提交,而新的高优先级中断横插一脚,而对于 CPU 来说,这并不算中断抢占,毕竟 CPU 还没有真正开始执行旧的中断,算是合理的优先级排序,毕竟抢占的概念通常用在正在执行的对象上。

第二种:当 CPU 读取中断 ID 寄存器时,同时意味着向 CPU interface应答 了该中断,并开始处理中断,如果在处理过程中产生了更高优先级的中断,此时这个中断在满足以下条件的情况下就会抢占当前的中断:一,GIC配置中断可抢占。二:再次将中断信号发给cpu(当然,这是硬件上表现抢占,但软件上实际并不一定会抢占)

中断分组标记

GICv3支持两种secure状态或单一secure状态,它可以通过配置寄存器GICD_CTRL.DS实现

 

有三个中断grounp。对于SPI类型的中断,可以通过寄存器GICD_IGROUPR和GICD_IGRPMOD配置其中断group。每种group中断都期望被下表特定的异常等级处理:

gicv3可以触发两种中断信号irq和fiq,对中断分组的目的就是使不同group的中断在不同状态下可以被分别分发到irq或fiq,在aarch64状态下,中断的分发方式如下:

 

从上表可知:
(1)group 0中断总是以FIQ方式触发
(2)secure group 1中断根据cpu的当前执行状态确定触发方式。若当前执行状态为secure EL0 、EL1,以irq方式触发。否则,以fiq方式触发
(3)non secure group 1中断,若当前执行状态为non secure EL0、EL1、EL2,以irq方式触发。否则,以fiq方式触发     

 

GIC处理中断流程

下面以一个常见的低电平触发的中断为例,下面是一个中断的完整上报流程:

  1. 外设产生中断,拉低连接到 gic 的中断线,表示中断产生,此时中断位pending状态
  2. 如果该中断使能,distributor 根据该中断设置的 CPU mask 将中断传递到对应的单个或多个 CPU interface,一般来说,只会将中断传递给一个 CPU 处理,如果为一个中断设置多个 target CPU,中断源的触发会导致多个 CPU 的 IRQ 引脚被拉低从而进入中断模式,实际上又只会有一个 CPU 处理该中断。但是在 GIC 手册中,是支持这种做法的,也就是一个中断源配置多个 target CPU(1-N中断),第一个 CPU ack 了该中断之后,后续的 CPU 查询中断 ID 寄存器返回无效的中断号 1023,退出中断处理,如果存在多个中断,distributor 会将最高优先级的中断发送给 CPU interface。

  1. CPU interface 决定是否将中断发送给 CPU 核,也就是触发对应 CPU 的 irq 引脚,取决于中断传递是否使能以及中断是否有足够的优先级,如果 CPU 当前没有正在处理中断,自然是可以传递的,如果 CPU 正在处理中断,那就看新中断的优先级是否更高同时还取决于是否配置了中断的抢占。

  1. 在 arm linux 中,CPU interface 将中断信号传递给 CPU,实际上就是 assert CPU 的 IRQ 中断线,如果 CPU 没有屏蔽 irq 中断线,就会跳转到中断模式,处理中断,经过一系列的现场保存工作等准备工作之后,CPU 会读取 GICC_IAR 寄存器获取中断 ID,读这个寄存器也意味着 CPU ack 了该中断,因为是电平触发的模式,该中断在 gic 中记录的状态切换为 active and pending,因为即使 CPU ack 了中断,当前中断线的电平并没有被拉高,还是处于触发状态。 如果是边沿触发的中断,在 CPU ack 了之后,就会切换为 active 状态。

  1. 系统的中断代码会调用到用户自定义的中断处理程序,在自定义处理程序中,用户需要将该外部中断 deassert,也就是将中断线重新置为高,该 gic 的状态也就从 active and peding 切换为 active,如果没有这一个步骤,中断会被反复触发。

  1. 中断处理完成后(可能只是上半部处理结束),软件可以写寄存器ICC_EOIR0_EL1 / ICC_EOIR1_EL1以执行中断的优先级下降和deactive操作。中断deactive之后,将会变为inactive状态。此处重置优先级的原因:cpu在响应优先级为4的中断A,当中断A的上半部分完成后,通知GIC,优先级重置(drop priority),GIC将当前的最高优先级中断重置,重置到响应中断A之前的优先级,比如优先级6(中断优先级值越小,则优先级越高),那么此时优先级为5的中断B,就可以被cpu响应。最后中断A的下半部分完成后,通知GIC,将该中断A的状态,设置为inactive状态,此时中断A就真正的完成了。
  2. linux 内核中会重新开启中断(操作 CPSR 的 i bit???),gic 也就可以重新发送其它的 pending 中断到 CPU 上了。

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

  1. 中断是软件触发的,通过向对应的寄存器中写入需要触发的中断号(0-15)以及对应的 CPU ID。
  2. distributor 并不再需要通过读取 CPU mask 寄存器来决定该中断需要发送给哪个 CPU,SGI 的 target CPU 在触发中断时已经决定了。
  3. SGI 中断可以发送给多个 CPU,而且经常作为 CPU 之间通信的方式,各个 CPU 之间处理 SGI 中断是独立的,比如对于 8 号 SGI 中断,每个 CPU 都可以独立处理,而且在处理的过程中,每个 CPU 对应该中断的中断状态也是独立的。

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

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

相关文章

AP2400 LED汽车摩灯照明电源驱动 过EMC DC-DC降压恒流IC

产品特点 宽输入电压范围&#xff1a;5V&#xff5e;100V 可设定电流范围&#xff1a;10mA&#xff5e;6000mA 固定工作频率&#xff1a;150KHZ 内置抖频电路&#xff0c;降低对其他设备的 EMI干扰 平均电流模式采样&#xff0c;恒流精度更高 0-100%占空比控制&#xff0…

连续四年入选!三项荣耀!博云科技强势上榜Gartner ICT技术成熟度曲线

日&#xff0c;全球知名咨询公司Gartner发布了2023年度的《中国ICT技术成熟度曲线》&#xff08;《Hype Cycle for ICT in China, 2023》&#xff0c;以下简称“报告”&#xff09;。令人瞩目的是&#xff0c;博云科技在报告中荣获三项殊荣&#xff0c;入选云原生计算&#xff…

揭秘bi数据分析系统:如何轻松掌握商业智能的秘密

在大数据时代的背景下&#xff0c;企业开始越来越重视数据分析的重要性。bi数据分析系统不仅可以帮助企业感知市场变化趋势&#xff0c;还可以实时监测并评估企业经营决策的效果&#xff0c;支持企业的持续发展。在国内&#xff0c;国产数据处理工具如瓴羊Quick BI等崛起&#…

Neety与IO模型简介

Netty与IO模型简介 1、Netty 是由 JBOSS 提供的一个 Java 开源框架&#xff0c;现为 Github 上的独立项目。 2、Netty 是一个异步的、基于事件驱动的网络应用框架&#xff0c;用以快速开发高性能、高可靠性的网络 IO 程序。 3、Netty 主要针对在 TCP 协议下&#xff0c;面向…

【android】mac mini m2安装android studio

文章目录 一、环境搭建1.1 安装路径1.2 mac arm1.3 安装android studio 二、安装sdk三、更新sdk3.1 关闭代理3.2 重新更新sdk 四、更新api五、项目创建六、gradle安装七、avd八、问题&#xff1a;build tools缺失九、编译运行小结 一、环境搭建 1.1 安装路径 windows&#xf…

高温老化房软件使用教程

高温老化炉软件通常具有以下几个模块&#xff1a; 1. 参数设置模块&#xff1a;该模块用于设置高温老化炉的相关参数&#xff0c;包括温度、时间、压力等。用户可以通过输入框、滑动条或下拉菜单等方式设定参数&#xff0c;并将参数发送给高温老化炉。 2. 监控模块&#xff1a;…

Ansible环境搭建,CentOS 系列操作系统搭建Ansible集群环境

Ansible是一种自动化工具&#xff0c;基于Python写的&#xff0c;原理什么的就不过多再说了&#xff0c;详情参考&#xff1a;https://www.itwk.cc/post/403.html https://blog.csdn.net/qq_34185638/article/details/131079320?spm1001.2014.3001.5502 环境准备 HOSTNAMEIP…

CAD绘制法兰、添加光源、材质并渲染

首先绘制两个圆柱体&#xff0c;相互嵌套 在顶部继续绘制圆柱体&#xff0c;这是之后要挖掉的部分 在中央位置绘制正方形 用圆角工具&#xff1a; 将矩形的四个角分别处理&#xff0c;效果&#xff1a; 用拉伸工具 向上拉伸到和之前绘制的圆柱体高度齐平 绘制一个圆柱体&#…

VUE框架:vue2转vue3全面细节总结(2)导航守卫

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…

laravel项目运行问题记录

一.首页404未找到 检查项目配置是否配置好 解决地址:phpstudy网站或站点创建成功,打开无响应_php打开提示站点创建成功_荒-漠的博客-CSDN博客 二.vendor目录不存在 composer未安装 解决地址:laravel安装composer依赖_荒-漠的博客-CSDN博客 三.首页可以展示 里面路径404 未配…

Adobe ColdFusion 反序列化漏洞复现(CVE-2023-29300)

0x01 产品简介 Adobe ColdFusion是美国奥多比&#xff08;Adobe&#xff09;公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言。 0x02 漏洞概述 Adobe ColdFusion存在代码问题漏洞&#xff0c;该漏洞源于受到不受信任数据反序列化漏洞的影响&#xff0c;攻击…

C# App.config和Web.config加密

步骤1&#xff1a;创建加密命令 使用ASP.NET提供的命令工具aspnet_regiis来创建加密命令。 1、打开控制台窗口&#xff0c;在命令行中输入以下命令&#xff1a; cd C:\Windows\Microsoft.NET\Framework\v4.xxxxx aspnet_regiis.exe -pef connectionStrings "C:\MyAppFo…

C#,OpenCV开发指南(01)

C#&#xff0c;OpenCV开发指南&#xff08;01&#xff09; 一、OpenCV的安装1、需要安装两个拓展包&#xff1a;OpenCvSharp4和OpenCvSharp4.runtime.win 二、C#使用OpenCV的一些代码1、需要加头文件2、读取图片3、在图片上画矩形框4、 在图片上画直线 一、OpenCV的安装 1、需…

南京https证书中的通配符https证书

随着互联网的快速发展&#xff0c;越来越多的网站开始使用HTTPS协议来保证用户的信息安全和隐私。而HTTPS协议的实现离不开HTTPS证书的支持。HTTPS证书是一种数字证书&#xff0c;用于验证网站的身份并加密数据传输。它通过使用公钥加密技术&#xff0c;确保用户与网站之间的通…

[JAVAee]网络编程-套接字Socket

目录 基本概念 发送端与接收端 请求与响应 ​编辑客户端与服务器 Socket套接字 分类 数据报套接字 流套接字传输模型 UDP数据报套接字编程 DatagramSocket API DatagramPacket API InetSocketAddress API 示例一: 示例二: TCP流数据报套接字编程 ServerSock…

LISA:通过大语言模型进行推理分割

论文&#xff1a;https://arxiv.org/pdf/2308.00692 代码&#xff1a;GitHub - dvlab-research/LISA 摘要 尽管感知系统近年来取得了显著的进步&#xff0c;但在执行视觉识别任务之前&#xff0c;它们仍然依赖于明确的人类指令来识别目标物体或类别。这样的系统缺乏主动推理…

在golang中引入私有git仓库的pkg包?引入私有Git仓库的包:在Go语言项目中轻松实现

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to Golang Language.✨✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(37)-掌握Fiddler中Fiddler Script用法你有多牛逼-下

1.简介 Fiddler是一款强大的HTTP抓包工具&#xff0c;它能记录所有客户端和服务器的http和https请求&#xff0c;允许你监视&#xff0c;设置断点&#xff0c;甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说&#xff0c;都有很大的帮助。Fiddler提供的功能基本上能…

系统架构设计高级技能 · 软件可靠性分析与设计(三)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

Redis 加入服务列表自启动

1、下载reids windows版本&#xff0c;选择zip格式下载 2、解压zip&#xff0c;并进入路径&#xff1b; 3、命令提示符&#xff08;cmd&#xff09; 进入解压后的路径后&#xff0c;输入指令&#xff1a;redis-server --service-install redis.windows.conf&#xff1b; 4、如…