ARM通用中断控制器GIC之中断控制

news2024/11/22 20:57:05

在阅读本章之前,可以参考笔者之前关于GIC的一些描述:

ARM通用中断控制器GIC(generic Interrupt Controller)简介

ARM架构Generic Interrupt Controller(GIC)之Distributor和CPU interface功能介绍

ARM架构Generic Interrupt Controller(GIC)详解之术语介绍

ARM通用中断控制器GIC之中断处理简介

文章目录

  • GIC中断使能
  • 设置或清除一个中断的Pending状态
    • Interrupt Set-Pending Registers, GICD_ISPENDRn
    • Interrupt Clear-Pending Registers, GICD_ICPENDRn
  • 查找处于active或者pending状态的中断
  • 产生SGI中断
    • Software Generated Interrupt Register, GICD_SGIR
      • 安全扩展下产生SGI中断

GIC中断使能

对于外设中断,处理器可以通过:

  • 写入GICD_ISENABLERn 寄存器的对应bit来使能该中断。
  • 写入 GICD_ICENABLERn 寄存器的对应bit来禁止该中断。
    对于SGI中断是否能通过上述两个寄存器来enable和disable,这个由具体的实现( IMPLEMENTATION DEFINED)来定义。
    此外写入GICD_ISENABLERn 和GICD_ICENABLERn 寄存器只是控制Distributor是否能将该中断转发到CPU interface,并不会阻止该中断改变状态。比如写入GICD_ICENABLERn 寄存器来disable对应中断,并不能阻止他变成pending状态。

设置或清除一个中断的Pending状态

对于外设中断,处理器可以:

  • 写入GICD_ISPENDRn寄存器的对应bit来设置中断状态为pending。
  • 写入 GICD_ICPENDRn寄存器的对应bit来清除该中断的pending状态。
    对于电平敏感的中断:
  • 如果中断信号已经被assert,处理器再写入GICD_ICPENDRn寄存器的对应bit来清除中断将不产生作用。
  • 如果处理器通过写入GICD_ISPENDRn来使对应中断状态变为pending,将忽略该中断的硬件信号,并且保留pending状态,不管该中断是被asserted还是deasserted。
    包含pending的中断状态有两种:
  • pending
  • active and pending
    对于边沿触发的中断来讲,包含pending的中断状态可以通过写入GICD_ISPENDRn寄存器,或者GIC对该中断信号的assertion来进行锁定。
    但是对于电平敏感的中断来讲,它的包含pending的中断状态可以通过写入GICD_ISPENDRn寄存器来锁定,但是不能根据传递到GIC的中断信号来锁定。
    以下是电平敏感中断的电路逻辑示意图:
     Logic of the pending status of a level-sensitive interrupt
    此外,对于SGI中断,GIC将忽略对GICD_ISPENDRn和GICD_ICPENDRn寄存器的写入,处理器不能通过写入这些寄存器来改变SGI中断的中断状态。一般情况下,处理器可以通过写入 GICD_SGIR寄存器来使SGI中断变成pending,在GICv2中,SGI的pending状态可以通过直接写入GICD_SPENDSGIRn 和 GICD_CPENDSGIRn 寄存器的对应位来改变。

Interrupt Set-Pending Registers, GICD_ISPENDRn

GICD_ISPENDRn寄存器提供一个Set-pending bit,对该bit写入1能够将对应外设中断的状态设置为pending,读取对应bit则可以知道该中断是否处于pending状态。
在多处理器系统中,GICD_ISPENDR0(PPI和SGI)寄存器被每个与GIC相连的处理器banked(复用)。
 GICD_ISPENDR bit assignments
从GICD_ISPENDR0开始,寄存器里每个bit代表一个不同中断ID的中断控制位,比如GICD_ISPENDR0[0]表示控制中断ID为0的中断。
对该寄存器进行读取:

  • 读到0:表明对应中断在任何处理器中都不处于pending状态。
  • 读到1:
    - 对于SGI和PPI中断,当前中断在当前处理器中是pending状态的。
    - 对于SPI中断,当前中断至少在一个处理器中处于pending状态。
    上文提到过,对于SGI中断,写入GICD_ISPENDRn寄存器的操作将会被忽略,因为SGI有自己的Set-pending寄存器 SGI
    Set-Pending Registers, GICD_SPENDSGIRn。对于SPI和PPI中断来讲:
  • 写入0:无影响
  • 写入1:其效果取决于是边缘触发还是电平敏感中断:
    - 边缘触发(Edge-triggered),如果当前中断已经是pending状态,则不受影响;如果之前是inactive状态,则会变成pending状态;如果之前是active状态,则会变成active and pending状态。
    - 电平敏感(Level sensitive),如果当前中断已经是pending状态,如果对应中断信号已经被asserted,写操作将不会改变中断的状态,但是该中断信号被deasserted后该中断将仍保持pending状态;如果对应中断未处于pending状态,如果之前是inactive状态,则会变成pending状态;如果之前是active状态,则会变成active and pending状态。

Interrupt Clear-Pending Registers, GICD_ICPENDRn

GICD_ICPENDRs为GIC支持的每个中断提供一个Clear-pending bit。写入对应中断的Clear-pending位将清除该中断的pending状态。读取该bit位是否为1可以确定中断是否处于pending状态。
在这里插入图片描述
对该寄存器进行读取:

  • 读到0:表明对应中断在任何处理器中都不处于pending状态。
  • 读到1:
    - 对于SGI和PPI中断,当前中断在当前处理器中是pending状态的。
    - 对于SPI中断,当前中断至少在一个处理器中处于pending状态。
    对于SPI和PPI中断来讲:
  • 写入0:无影响
  • 写入1:其效果取决于是边缘触发还是电平敏感中断:
    - 边缘触发(Edge-triggered),如果中断不处于pending状态,则不受影响。如果之前是pending状态,则会变成inactive状态;如果之前是active and pending状态,则会变成active状态。
    - 电平敏感(Level sensitive),如果当前中断的pending状态是由于写入GICD_ISPENDRn寄存器导致的:如果之前是pending状态,则会变成inactive状态;如果之前是active and pending状态,则会变成active状态。否则,如果中断信号仍被asseted,中断将保持pending状态。

查找处于active或者pending状态的中断

若想知道一个中断是否处于pending状态,可以读取 GICD_ISPENDRn 或者GICD_ICPENDRn寄存器。若想知道中断是否处于active状态,可以读取 GICD_ISACTIVERn 或者GICD_ICACTIVERn,这两个寄存器有Set-active和clear-active 位用来控制中断的active状态。

产生SGI中断

处理器可以通过写入GICD_SGIR寄存器来产生一个SGI中断,一个SGI中断可以设置多个目标处理器,并且SGIR寄存器里有目标寄存器列表。GICD_SGIR包括如下优化:

  • 只中断写入GICD_SGIR的处理器
  • 中断除写入GICD_SGIR的处理器以外的所有处理器
    来自不同处理器的SGI中断使用同一个中断ID,所以任何目标处理器可以收到来自不同处理器产生的相同中断ID的SGI。但是如果以下条件不同,则任意两个SGI中断的pending状态是独立的:
  • 中断ID
  • 源处理器
  • 目标处理器
    在CPU interface中,在任何时候,一次只能有一个特定中断ID的中断处于active状态,这意味着CPU interface不能同时有两个SGI处于active状态,甚至是不同处理器使用相同中断ID的SGI中断发送中断信号到该处理器。
    在目标处理器的CPU interface中,通过读取 GICC_IAR寄存器,可以获得中断ID,以及产生该中断的CPU ID,即源处理器ID。中断ID加上源处理器ID,可以让目标处理器获知该中断独一无二的来源。
    此外,在多处理器系统中,每个SGI中断的优先级可以为每个目标处理器单独设置,详情可查看 Interrupt Priority Registers, GICD_IPRIORITYRn,中断优先级寄存器。对于每个CPU interface来讲,对于所有优先级相同的,特定中断ID的,处于pending状态的SGI中断,CPU interface序列化地处理它们,具体的系列化处理顺序取决于系统的实现定义(IMPLEMENTATION SPECIFIC.)。

Software Generated Interrupt Register, GICD_SGIR

处理器写入GICD_SGIR可以产生SGI中断。使用限制:通过写入 GICD_CTLR寄存器来将Distributor的转发功能禁止,是否会影响GICD_SGIR,这个由具体的实现定义( IMPLEMENTATION DEFINED)。以下是GICD_SGIR寄存器的字段分配图:
GICD_SGIR bit assignments

  • [25:24] TargetListFilter:这将决定Distributor如何处理被请求的SGI中断,即要转发到何处:
    - 0b00:将中断转发到在CPUTargetList定义的CPU interface中
    - 0b01:将中断转发到所有CPU interface中,除了当前请求中断的处理器。
    - 0b10:将中断转发到当前请求SGI中断的处理器相连的CPU interface中。
    - 0b11:保留
  • [23:16] CPUTargetList:如果TargetListFilter的值为0b00,CPUTargetList中将定义Distributor必须被转发到的CPU interface。CPUTargetList中共八个bit,每个bit代表一个处理器。比如CPUTargetList[0]对应CPU interface 0,如果CPUTargetList[0]=1,表明该SGI中断必须转发到CPU interface 0。如果TargetListFilter的值为0b00,并且CPUTargetList也为0,说明Distributor不需要将中断转发到任何CPU interface。
  • [15] NSATT:仅在系统包含安全扩展中实现,如果没有实现安全扩展,这个字段将保留。NSATT指定SGI需要的security value:
    - 只有当SGI在该CPU interface上被配置为Group 0时,才将SGIINTID字段中指定的SGI转发到指定的CPU interface。
    - 只有当SGI在该CPU interface上被配置为Group 1时,才将SGIINTID字段中指定的SGI转发到指定的CPU interface。
    - 该字段只可以在安全状态下被写入,只有当指定的SGI中断被配置成group 1时,任何对GICD_SGIR的非安全写入才会生成SGI,并且忽略NSATT的值。
  • [3:0] SGIINTID : 需要被转发到指定的CPU interface中的SGI中断的中断ID,范围是0到15。

安全扩展下产生SGI中断

如果GIC实现了安全扩展,通过写入GICD_SGIR寄存器,使得SGI中断转发到指定的处理器,这取决于:

  • 写入GICD_SGIR的是Group 0(secure)还是Group 1(non-secure)
  • 对于secure写入SGIR,写入 GICD_SGIR的NSATT字段的值。
  • 在目标处理器中,特定的中断是否被配置成Group 0(secure)还是Group 1(non-secure)。

GICD_IGROUPR0寄存器中保存了SGI中断的安全状态。在多处理器系统中, GICD_IGROUPR0被每个与之相联的处理器banked(复用),所以系统可以为每个处理器独立设置SGI中断的安全状态。对GICD_SGIR寄存器写一次,可以配置多个目标处理器,对于每个目标处理器,Distributor将决定是否将SGI中断转发到该处理器。
下表展示了Distributor是否可以将SGI转发到指定的CPU interface的真值表:
Truth table for sending an SGI to a target processor

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

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

相关文章

一文带你快速搭建框架(最全MyBatis笔记)

目录 一.概述 1.简介 2.maven构建 二.相关概念 1.Mapper接口 2.ORM思想 三.映射配置文件 1.文件结构 2.映射配置文件标签详解 3.SQL语句中参数的获取 (1)获取方式 (2)参数类型 4.各种SQL操作 5.处理表字段和实体类属性名不一致的情况 6.多对一映射关系的处理 7…

InnoDB引擎架构

1、逻辑存储结构: 表空间(ibd文件):一个Mysql实例可以对应多个表空间,用于存储记录、索引等数据。 段:分为数据段、索引段、回滚段、 InnoDB是索引组织表,数据段就是B树的叶子节点&#xff0c…

使用Flink1.16.0的SQLGateway迁移Hive SQL任务

使用Flink的SQL Gateway迁移Hive SQL任务 前言 我们有数万个离线任务,主要还是默认的DataPhin调度CDP集群的Hive On Tez这种低成本任务,当然也有PySpark、打Jar包的Spark和打Jar包的Flink任务这种高成本的任务【Java和Scala都有】。毕竟SQL上手门槛极低…

【邻接表】【数组表示链表】怎么用数组链表 表示 邻接表

怎么用数组链表 表示 邻接表***邻接表(数组链表)是怎么存储的?***邻接表(数组链表)是怎么存储的? 正常情况下,我们用链表存储的话,我们让 1 指向 2 我们会给出 1 和 2的地址&#xf…

Java基于JSP二手书交易平台设计与实现

现代网络技术发展迅速,传统的书店销售模式受到诸如场地、资金、宣传等因素制约,已经不能满足人们的日益增长的图书购买需求,网上书店应运而生,基于web的网络书店给人们带来了很大便利,网络书店不仅是传统售书模式的发展…

AidLux智慧交通AI安全实战学习

本次参加AidLux训练营,Rocky作为主讲老师,学习到了利用目标检测算法流程和AI攻防策略进行结合,从而达到安全。 1.检测汽车模型的训练 本次目标检测的模型是Yolov5,首先对标注图片 进行转换,转换为yolov5的格式&#…

《痞子衡嵌入式半月刊》 第 61 期

痞子衡嵌入式半月刊: 第 61 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢…

激光切割机机械结构设计

目 录 摘 要………………………………………………………………………………………Ⅰ ABSTRACT…………………………………………………………………………………… Ⅱ 1 绪论 1 1.1课题背景 1 1.2现实意义 1 1.3设计任务 1 1.4总体设计方案分析 2 2 机械部分XY工作台及Z轴的…

分享99个小清新PPT模板,总有一款适合您

PPT下载链接:https://pan.baidu.com/s/1VW0Eljx1Ac9QEEBaiIvqcg?pwd40hn 提取码:40hn 源码下载链接:ppt.rar - 蓝奏云 采集的参数 page_count 1 # 每个栏目开始业务content"text/html; charsetgb2312"base_url "https:…

如何查找无物流信息单号

我是在一家大公司里面上班,我公司都是那种厂家直销,所以每天发货量是比较大,同时一天都是几家快递同时发货,我是负责每天跟踪物流信息状况,公司要求每天都上报当天发货的快递在24小时之内有没有物流信息,如…

嵌入式编程别忽略了C语言的标准

正文大家好,我是bug菌~最近做代码评审发现很多同事的编码都游走在风险的边沿,其中最显眼的就是局部变量定义位置比较随意。对于C语言编程老手而言,绝大部分都已经养成了"变量定义必放在语句块的开头"这一习惯,依稀还记得…

windows虚拟机中docker运行springboot容器报错:Unable to access jarfile /app.jar

1.在Windows系统中创建了虚拟机,并且在虚拟机中安装了docker,但是在使用Dockerfile创建镜像并且运行时报错 2.使用shell脚本运行的,并且检查后也没有发现文件或者路径有错 解决: 使用vim加参数的形式打开shell脚本,可以…

微服务架构下的认证鉴权解决方案

背景 单体应用在向微服务化架构演进时,需要考虑如何解决服务认证授权的问题。如果处理不好,会引发架构的混乱,带来安全、性能、难以维护的问题。 以最典型的包含WEB页面的具备登录态管理的系统为例。在最初阶段,登录鉴权一般通过…

文华财经期货技术分析日内多空信号共振指标公式,波段行情短线抄单操盘幅图指标

​期货交易的很大一个误区是“痴迷于各种指标公式” 大家千万不要痴迷于指标,记住一点:行情软件界面之中的K线图叫主图,其余指标叫附图。 这从叫法上就该知道,我们寻找买卖点要在主图K线上来寻找,指标只是起到辅助分析的作用&…

操作系统02_内存分页管理_分段管理_设备管理_IO处理_索引文件结构_文件目录_位示图---软考高级系统架构师007

存储管理可以分为固定存储管理和分页存储管理。 现在固定存储管理已经不用也不考,但要知道因为固定存储管理指的是整存整取 也就是把一整个程序,比如说10G的游戏全部都存到内存里 这样的话是非常占用内存的,这个固定存储管理现在已经不用了。 然后这里我们主要看分页存储管: …

蓝桥杯比赛 NOC竞赛C++项目选择题真题和模拟题汇总

题目来源:第10届蓝桥杯青少年组C选拔赛 1、下面哪个密码最安全 A. 111111 B. 123456 C. qwerty D. Z2a8Q1 2、如果今天是星期六,再过60天是星期几? A. 星期三 B. 星期四 C. 星期五 D. 星期六 3、90到100之间有几个素数? …

mmcv和openCV两个库imcrop()和imresize()方法的对应【基础分析】

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录MMCV 全家桶mmcv.imresize(img, (1000, 600), return_scaleTrue) 方法实现对应的…

Unity 之 Post Processing后处理不同项目配置(URP项目配置)

Unity 之 Post Processing后处理不同项目配置(URP项目配置)一,Post Processing介绍二,正常项目配置2.1 场景配置2.2 摄像机配置2.3 集成步骤小结三,URP项目配置3.1 具体配置步骤3.2 最终实现效果四,代码控制…

【每天一个cmake技巧】简单的cmake demo

简单的cmake demo 一个简单的cmake 工程,包括生成动态库和链接动态库的demo工程和test工程。 demo下载链接: https://download.csdn.net/download/sinat_35178307/87243966 目录结构 该工程可以生成一个dll,一个调用dll的demo,…

【数据分享】维基百科Wiki负面有害评论(网络暴力)文本数据多标签分类挖掘可视化...

原文链接:http://tecdat.cn/?p8640讨论你关心的事情可能很困难。网络暴力骚扰的威胁意味着许多人停止表达自己并放弃寻求不同的意见(查看文末了解数据免费获取方式)。平台努力有效地促进对话,导致许多社区限制或完全关闭用户评论…