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,一经查实,立即删除!

相关文章

android 自定义软键盘的显示和隐藏

记一下,以后不用找在InputMethodService中有这两个方法可以看到软键盘显示状态 //软键盘隐藏 override fun onWindowHidden() {super.onWindowHidden() } //软键盘显示 override fun onWindowShown() {super.onWindowShown() } 在activity中可以通过这种方法看到软键盘显示状…

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

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

【力扣 21】合并两个有序链表 C++题解(链表+双指针)

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2 [] 输出:[]…

小程序发劵插件sendCoupon的使用

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

求连续值遍历步数 OD(C++)

将从1开始的连续整数随机打乱,存放到数组 numbers中,请计算从1开始递增访问完所有元素,总共需要移动的步数。 输入 2<= numbers,length <= 100, 1 <= numbers[i]<= numbers.length 输出 一个整数,表示需要移动的步数 样例1 输入:[4,3,6,1,5,2] 输出…

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窗体状态栏右下角默认是有的三角框&#xff0c;在项目设计时不需要&#xff0c;如何去掉呢&#xff1f; 默认的窗体界面如下 选中状态栏&#xff0c;修改属性SizeGripEnabled勾选去掉 再次运行&#xff0c;三角框去掉了

【前端】为什么我的定时器在后台运行误差严重 - 浏览器限制后台页面定时器运行速度

【前端】为什么我的定时器在后台运行误差严重 - 浏览器限制后台页面定时器运行速度 为什么我的定时器在后台运行误差严重&#xff1f; 定时器&#xff08;如 setTimeout 和 setInterval&#xff09;是前端开发中常用的工具&#xff0c;它们允许我们在设定的时间后执行代码。但…

java steam 的使用

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

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

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

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

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

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

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

Imagenet-A,Imagenet-C和ImageNet-O

Imagenet-A ImageNet-A 数据集包含由 ResNet 模型错误分类的真实世界、未经修改和自然发生的示例。该数据集包含 7,500 张经过对抗性过滤的图像&#xff0c;很容易导致机器学习模型的性能显著下降。 Imagenet-C 对ImageNet 1K添加了一些常见的图像损坏&#xff08;如模糊和噪…

【QT+QGIS跨平台编译】之一:【sqlite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、sqlite3介绍二、文件下载三、文件分析四、pro文件五、编译实践一、sqlite3介绍 SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式…

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

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

API设计模式:REST、GraphQL、gRPC与tRPC全面解析

一、引言 在现代Web和微服务架构中&#xff0c;API&#xff08;应用程序编程接口&#xff09;的设计和实现方式至关重要。本文将探讨四种流行的API设计模式&#xff1a;REST&#xff08;Representational State Transfer&#xff09;、GraphQL、gRPC以及新兴的tRPC。每种模式都…

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

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

DAY22xss2

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

开源元数据管理平台Amundsen安装

Amundsen 是一个用于数据发现和元数据管理的开源平台。Amundsen是一个用于提高数据分析师、数据科学家和工程师在与数据交互时的生产力的数据发现和元数据引擎。目前,它通过索引数据资源(表、仪表板、流等)并基于使用模式(例如,高频查询的表会比低频查询的表更早显示)提供…

sql server 查询所有表的记录条数

DECLARE tableName NVARCHAR(MAX) DECLARE sql NVARCHAR(MAX) CREATE TABLE #TempTable (TableName SYSNAME, RowCounts BIGINT) -- 遍历所有用户表 DECLARE TableCursor CURSOR FOR SELECT t.NAME FROM sys.tables t WHERE t.is_ms_shipped 0 -- 过滤掉系统表 AND t.name…