armv8 - GIC-V2 中断控制器

GIC起源

上一节中,粗略讲了hylicos上用的armv7上的一个通用中断控制器,其只支持60个中断源。但现代SoC上,中断系统正变得越来越复杂,旧的中断控制器已经无法胜任这些系统,主要体现在以下几点上:

  1. 中断源越来越多,有的系统中断源有几百个,甚至上千个。
  2. 中断类型越来越多,比如普通外设中断,软件触发中断,CPU Core之间的中断,还有类似于PCIe上的基于消息传递的中断等
  3. 虚拟化技术的引入,主要开始支持虚拟中断

针对这些需求,arm开发了GIC,专门管理中断。这里以GIC-V2作例子讲解,GIC-V2已经支持虚拟化,典型的IP核心为GIC-400。

中断状态,触发方式,硬件中断号

每一个中断支持的状态有:

  1. 不活跃状态(inactive): 中断处于无效状态
  2. 等待状态(pending):中断处于有效状态,但是等待CPU响应该中断
  3. 活跃状态(active):CPU已经响应该中断
  4. 活跃并等待(active and pending):CPU正在处理该中断,但是该中断源又发了中断过来。

针对外设中断,有两种触发方式:

  • 边沿触发
  • 电平触发

GIC会为每一个硬件外设,也就是每一个硬件中断源,都分配一个中断号,即硬件中断号。

中断类型中断号范围
SGI0 ~ 15
PPI16 ~ 31
SPI32 ~ 1019

GIC-V2

以ARM Vexpress V2P-CA15_CA7为例子,GIC和core cluster之间的关系
GIC-400同时支持两个cpu cluster
在这里插入图片描述
GIC-400支持多种中断类型:

  1. SGI - 软件触发中断,通常用于多核之间的通信。 GIC-V2最多支持16个SGI中断,中断号范围为0~15。SGI通常在linux内核中被用作处理器之间的中断(Inter-Processor Interrupt IPI),被送达指定CPU上。
  2. PPI - 私有外设中断,每个处理器内核私有的中断。 最多吃吃16个PPI,16 ~ 31。PPI会被送达到指定的CPU上处理,典型的,CPU的local timer interrupt就是PPI的。
  3. SPI - 共享外设中断,所有处理器共享的中断。可以支持988个外设中断。32 ~ 1019.

GIC 组成

主要由分发器(distributor)和CPU接口组成。
分发器:主要用于仲裁和分发中断请求给CPU

  • 全局中断使能
  • 每个中断的使能
  • 中断的优先级
  • 中断的分组
  • 中断的目的core
  • 中断触发方式
  • 对于SGI中断,传输中断到指定的core
  • 每个中断的状态管理 提供软件,可以修改中断的pending状态

CPU接口:负责与CPU内核连接,通过nIRQ和nFIQ与CPU Core交流

  • 将中断请求发送给cpu
  • 对中断进行认可(acknowledging an interrupt)
  • 中断完成识别(indicating completion of an interrupt)
  • 设置中断优先级屏蔽
  • 定义中断抢占策略
  • 决定当前处于pending状态最高优先级中断

在这里插入图片描述

中断流程

GIC 检测当前的中断流程如下:

  1. 当GIC检测到一个中断发生时,会将该中断标记为pending
  2. 对于每一个pending状态的中断,分发器负责为其确定目标CPU,将请求发送到该CPU
  3. 对于每个CPU,分发器会从众多pending状态的中断中,选择一个优先级最高的中断请求发送到与目标CPU对接的CPU接口。
  4. CPU接口会决定这个中断是否可以发送给目标CPU。如果优先级满足,GIC会发送一个中断请求给目标CPU。
  5. GIC进入中断异常,读取GICC_IAR来响应这个中断(由软件的异常处理程序负责,这个过程也被叫做中断认可)。GICC_IAR里保存的是硬件中断号。对于SGI来说,返回源CPI的ID。
  6. GIC在感知到软件读取该寄存器后会做如下处理:
    a. 如果中断处于pending,则pending --> active
    b. 如果中断重新产生,则pending --> active and pending
    c. 如果中断处于active,则active --> active and pending
  7. 处理器执行完中断的处理,发送一个EOI信号给GIC。

GIC-V2寄存器

寄存器也分为两部分:

  1. 分发器的寄存器:包括中断的设置和配置
  2. CPU接口的寄存器:CPU相关的特殊设置

GIC-V2的寄存器,名称以n结尾的,有n个。比如GICD_ISENABLERn寄存器有n个。这些寄存器每个寄存器上的每一个bit都用于描述一个中断源是否使能,因为中断源非常多,因此需要很多个这样的寄存器。GIC-V2支持1020个中断号,所以需要1020/32,即32个这样的寄存器,每个寄存器占用4字节偏移,所以其地址空间是0x100 ~ 0x100 + 0x4*31(0x7c)。

对于中断号m来说,要判断其是否使能:

n = m / 32;
off_bit = m mod 32;

这里n就是它所在寄存器GICD_ISENABLERn名称上的n。以此可以算出GICD_ISENABLERn所在的地址偏移为:

0x100 + n * 0x4

不是每个寄存器,都是用1bit来描述一个中断源,1bit描述的信息太少,有的寄存器需要以多bit来描述一个中断源的信息:
GICD_ITARGETSRn,用于描述一个中断源所能路由的目标CPU。
在这里插入图片描述
类似的,n的计算公式

n = m / 4;

寄存器偏移计算公式:

0x800 + n * 4

distributor部分

在这里插入图片描述

CPU Interface部分

在这里插入图片描述

中断路由

由于SGI和PPI都是cpu core私有的,中断路由只为SPI的中断号工作。分发器来负责中断路由,将SPI中断路由到不同的CPU Core上。如何配置路由?
GICD_ITARGETSRn就是做路由这件事的,通过配置GICD_ITARGETSRn可以指定中断号m配分发到指定的CPU Core上。GICD_ITARGETSRn是个32位的寄存器,每8位用于描述可为一个中断源处理的CP有哪些U,最多支持描述8个CPU ID,每一bit都描述一个CPU ID。某一bit被置位,说明对应的中断源可以被分发到以该索引值为CPU ID的cpu core上。

注:由于SGI和PPI的目标CPU Core是固定的,所以前32个中断源的路由配置是硬件配置死的。33 ~ 1019号中断是可以自由配置的。

GIC-400的配置

GIC-400的初始化流程

  1. 设置分发器和CPU接口寄存器组的基地址
  2. 读取GICD_TYPER,计算当前支持最多多少个中断源
  3. 初始化分发器
    a. 关闭分发器
    b. 设置SPI(比如串口中断)的路由
    c. 设置SPI的触发类型,例如,边沿触发
    d. 关闭所有中断源
    e. 重新打开分发器
  4. 初始化CPU接口
    a. 设置GIC_CPU_PRIMASK寄存器,配置优先级
    b. 配置GICC_CTLR寄存器,打开CPU接口

响应中断的流程

  1. 中断发生,CPU跳转到异常向量表
  2. 跳转到GIC中断函数,例如gic_handle_irq()函数
  3. 读取GICC_IAR,获取中断号
  4. 根绝中断号,进行相应中断处理,例如,读取的中断号是30 ,在树莓派4B上,就是PNS定时器触发了中断,跳转到定时器中断处理函数,处理中断。
  5. 中断返回。

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

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

相关文章

《WebKit 技术内幕》学习之六(1): CSS解释器和样式布局

《WebKit 技术内幕》之六(1):CSS解释器和样式布局 CSS解释器和规则匹配处于DOM树建立之后,RenderObject树之前,CSS解释器解释后的结果会保存起来,然后RenderObject树基于该结果来进行规范匹配和布局计算。当…

小程序发劵插件sendCoupon的使用

发劵插件官方文档 我目前的需求是,商家自定义满减劵、优惠劵,点击添加按钮可以添加到自己的卡包。 一开始后台了我发劵插件send-coupon文档,我想要用插件,又占空间,感觉又麻烦,不是有个wx.addCard嘛。非常…

HCIA-HarmonyOS设备开发认证-1.HarmonyOS简介

目录 前言目标一、HarmonyOS简介1.1、初识HarmonyOS1.2、HarmonyOS典型应用场景 二、HarmonyOS架构与安全2.1、HarmonyOS架构2.1.1 内核层2.1.2 系统服务层2.1.3 框架层2.1.4 应用层 2.2、HarmonyOS安全 3、HarmonyOS关键特性4、HarmonyOS生态5、思考题坚持就有收获 前言 本章…

Qt基础-窗体状态栏右下角的三角框如何去掉

Qt窗体状态栏右下角默认是有的三角框,在项目设计时不需要,如何去掉呢? 默认的窗体界面如下 选中状态栏,修改属性SizeGripEnabled勾选去掉 再次运行,三角框去掉了

java steam 的使用

说steam 前看下kotlin的一个写法如果用java怎么写 fun main() {// 创建一个列表val fruits listOf("Apple", "Banana", "Cherry", "Date", "Elderberry")// 使用 Sequence 进行过滤和映射操作val uppercaseFruitLengths …

怎么用图片生成二维码?扫描二维码看图片怎么制作?

现在将多张图片放到二维码中,通过扫码的方式预览是现在很常见的一种方式,那么如何生成图片、照片的二维码呢?对于图片二维码制作感兴趣的小伙伴,可以跟着小编来学习下面的制作技巧,借助网上的二维码生成器工具的功能&a…

基于LLaMA Factory,单卡3小时训练专属大模型 Agent

大家好,今天给大家带来一篇 Agent 微调实战文章 Agent(智能体)是当今 LLM(大模型)应用的热门话题 [1],通过任务分解(task planning)、工具调用(tool using)和…

还在纠结怎么选随身WiFi的,看看这个!随身WiFi靠谱榜第一名推荐!哪个随身WiFi最好用

你是不是还在头疼如何挑选一个靠谱好用的随身WiFi呢?市场上的随身WiFi产品五花八门,每次购买随身WiFi都会被坑,差点就失去购买的信心了~别灰心,一篇文章教你如何挑选一个靠谱好用的随身WiFi! 一、5大购买原则&#xff…

蓝桥杯备战——1.点亮LED灯

1.解析原理图 由上图可以看到8个共阳LED灯接到了573输出口,而573输入接到单片机P0口上。当573 LE脚输入高电平时,输出随输入变化,当LE为低电平时,输出锁存。 由上图可以看到Y4C接到了或非门74HC02的输出端,而输入端为…

HCIA——27E-mall、MIME;POP3、IMAP的选择,解答

学习目标: 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

DAY22xss2

远程调用xss平台网站需要在意是http还是https协议 cookie的利用 1.抓包利用 2.特定浏览器活软件 这个浏览器的使用教程 点进去之后再点击这个 然后我们开始 利用cookie cookie有几个值我们就添加几个 3.浏览器插件 遇到的突发情况 例如空白 404 这个时候我们要有种思…

SpringBoot,TDengine时序数据库,实现物联网,车联网大批量数据更新最佳实践。

简介 TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,它能安全高效地将大量设备、数据采集器每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,对业务运行状态进行实时监测、预警,提供实时的商业洞察。其…

tp5中使用ueditor编辑器保存文本到数据库后编辑时数据回显显示html标签问题解决办法

数据表中保存的数据为带html标签的源码&#xff0c;如图&#xff1a; 编辑器页面需要的内容&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> <html> <head><…

网络通信课程总结(小飞有点东西)

27集 局域网通信&#xff1a;用MAC地址 跨局域网通信&#xff1a;用IP地址&#xff08;MAC地址的作用只是让我们找到网关&#xff09; 又因为arp技术&#xff0c;可以通过MAC地址找到IP地址&#xff0c;所以我们可以通过IP地址定位到全世界任意一台计算机。 28集 在数据链路…

255:vue+openlayers 加载tomtom地图(多种形式)

第255个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中添加tomtom地图,这里包含了多种形式,诸如中文标记、英文标记、白天地图、晚上地图、卫星影像图,高山海拔地形图等。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…

爬虫是什么 怎么预防

爬虫是一种自动化程序&#xff0c;用于从网页或网站中提取数据。它们通过模拟人类用户的行为&#xff0c;发送HTTP请求并解析响应&#xff0c;以获取所需的信息。 爬虫可以用于各种合法用途&#xff0c;如搜索引擎索引、数据采集和监测等。然而&#xff0c;有些爬虫可能是恶意的…

2. figure 常见属性

2. figure 常见属性 一 figsize二 dpi三 facecolor四 edgecolor五 frameon 数据可视化是数据分析中不可或缺的一环&#xff0c;而Matplotlib作为Python中最流行的绘图库之一&#xff0c;扮演着重要的角色。在Matplotlib中&#xff0c;matplotlib.figure.Figure对象是构建图形的…

3d模型素材下载选择哪个网站比较好?

3d模型素材下载选择哪个网站比较好?需要在选择3D模型素材下载网站时&#xff0c;考虑以下几个方面&#xff1a; 1、网站的专业性和知名度&#xff1a;选择知名的、专业的网站可以提高获取到优质模型素材的概率&#xff0c;并且能够保证模型的品质和准确性。 2、模型的种类和质…

unity学习笔记----游戏练习06

一、豌豆射手的子弹控制 创建脚本单独控制子弹的运动 用transform来控制移动 void Update() { transform.Translate(Vector3.right * speed * Time.deltaTime); } 创建一个控制子弹速度的方法&#xff0c;方便速度的控制 private void SetSpeed(float spee…

Qt顶部圆角窗体

Qt&#xff1a;实现顶层窗体圆角_qt 圆角窗口弹窗-CSDN博客 setWindowFlags(Qt::FramelessWindowHint);QBitmap bmp(this->size());bmp.fill();QPainter p(&bmp);p.setPen(Qt::NoPen);p.setBrush(Qt::black);p.setRenderHint(QPainter::Antialiasing);p.drawRoundedRec…