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.rhkb.cn/news/245534.html

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

相关文章

OceanBase创建租户

租户是集群之上的递进概念,OceanBase 数据库采用了多租户架构。 集群偏部署层面的物理概念,是 Zone 和节点的集合,租户则偏向于资源层面的逻辑概念,是在物理节点上划分的资源单元,可以指定其资源规格,包括…

800G光传输网络中的相干调制与PAM4技术

在800G光传输网络架构中,相干调制技术和PAM4(四电平脉冲幅度调制)技术各具优势,分别针对不同应用场景提供高效解决方案。 相干调制是高级光通信的核心技术之一,它通过精密操控光载波的频率、相位和振幅来编码信息&…

RabbitMQ 笔记一

概览: MQ基本概念 RabbitMQ入门 基本工作模 1.MQ是什么? MQ:Message Queue, 存储消息的中间件,是消息发送过程中的暂存容器,主要用于解决分布式系统进程间的通信。 分布式系统通信的两种方式:直接远程调用、借助第三…

Idea上操作Git回退本地版本,怎么样保留已修改的文件,回退本地版本的四种方式代表什么?

Git的基本概念:Git是一个版本控制系统,用于管理代码的变更历史记录。核心概念包括仓库、分支、提交和合并。 1、可以帮助开发者合并开发的代码 2、如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突 3、代码文件版本管理 问题描述 当我们使用git提交代码…

Linux本地部署SVN服务结合内网穿透实现远程访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

php下curl发送cookie

目录 一:使用 CURLOPT_COOKIE 选项 二:CURLOPT_COOKIEFILE 三:CURLOPT_HTTPHEADER php curl发送cookie的几种方式,下面来介绍下 一:使用 CURLOPT_COOKIE 选项 通过设置 CURLOPT_COOKIE 选项,你可以将 cookie 字符…

el-table 动态渲染多级表头;一级表头根据数据动态生成,二级表头固定

一、表格需求: 实现一个动态表头,一级表头,根据数据动态生成,二级表头固定,每列的数据不一样,难点在于数据的处理。做这种表头需要两组数据,一组数据是实现表头的,另一组数据是内容…

《WebKit技术内幕》学习之十三(3):移动WebKit

3 其他机制 3.1 新渲染机制 为了移动领域更好的用户体验,渲染机制所做的改进主要是提升渲染性能来增加响应的速度,甚至不惜牺牲一些跟规范定义的行为不一致的地方。在这一小节中主要介绍三个方面的技术,其一是Tiled Backing Store&#x…

81.网游逆向分析与插件开发-背包的获取-装备栏数据结构的逆向分析

内容参考于:易道云信息技术研究院VIP课 上一个内容:自动化助手显示物品数据-CSDN博客 然后游戏中有弓箭,弓箭有数量,可以作为突破口,也可以使用物品id 获取弓的方式 获取弓箭的方式 然后搜索250 然后搜索出一个 然后…

C语言-算法-线性dp

[USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中,从 7 → 3 → 8 →…

k8s-基础知识(Pod,Deployment,ReplicaSet)

k8s职责 自动化容器部署和复制随时扩展或收缩容器容器分组group,并且提供容器间的负载均衡实时监控,即时故障发现,自动替换 k8s概念及架构 pod pod是容器的容器,可以包含多个container pod是k8s最小可部署单元,容器…

从物联网看智慧文旅的未来:技术与实践的完美结合,重塑旅游体验的新篇章

一、物联网技术:智慧文旅的基石 随着科技的飞速发展,物联网技术已经深入到我们生活的方方面面,尤其在智慧文旅领域,物联网技术更是起到了不可或缺的作用。它如同智慧文旅的基石,为旅游行业带来了前所未有的创新和变革…

Elasticsearch内核解析 - 数据模型篇

Elasticsearch内核解析 - 数据模型篇 - 知乎 Elasticsearch是一个实时的分布式搜索和分析引擎,它可以帮助我们用很快的速度去处理大规模数据,可以用于全文检索、结构化检索、推荐、分析以及统计聚合等多种场景。 Elasticsearch是一个建立在全文搜索引擎…

8.6跳跃游戏②(LC45-M)

算法: 与上一题一样,还是看最大覆盖范围 要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数! 这里…

go 语言中 json.Unmarshal([]byte(jsonbuff), j) 字节切片得使用场景

struct_tag的使用 在上面的例子看到,我们根据结构体生成的json的key都是大写的,因为结构体名字在go语言中不大写的话,又没有访问权限,这种问题会影响到我们对json的key的名字,所以go官方给出了struct_tag的方法去修改…

unity刷新grid,列表

获取UIGrid 组件,更新列表 listParent.GetComponent().repositionNow true;

Ubuntu 申请 SSL证书并搭建邮件服务器

文章目录 Log 一、域名连接到泰坦(Titan)电子邮件二、NameSilo Hosting 避坑三、Ubuntu 搭建邮件服务器1. 环境准备2. 域名配置3. 配置 Postfix 和 Dovecot① 安装 Nginx② 安装 Tomcat③ 申请 SSL 证书(Lets Encrypt)④ 配置 pos…

【并发编程】 synchronized的普通方法,静态方法,锁对象,锁升级过程,可重入锁,非公平锁

目录 1.普通方法 2.静态方法 3.锁对象 4.锁升级过程 5.可重入的锁 6.不公平锁 非公平锁的 lock 方法: 1.普通方法 将synchronized修饰在普通同步方法,那么该锁的作用域是在当前实例对象范围内,也就是说对于 SyncDemosdnewSyncDemo();这一个实例对象…

ORBSLAM3安装

1. 依赖 在该目录下打开终端,安装下面所有依赖。 1. 1 编译软件 sudo apt-get install gccsudo apt-get install g++sudo apt-get install build-essentialsudo apt-get install cmakesudo apt-get install openssl sudo apt-get install libssl-dev1. 2 Pangolin git cl…

蓝桥杯备战——5.动态数码管扫描

1.分析原理图 经查阅说明书得知数码管为共阳极,共阳端口接到了U8,而段码接到了U7。 如果需要选中U8,我们只需要将P250;P261;P271; 如果需要选中U7,我们只需要将P251;P261;P271; 2.代码示例 void Delay1ms() //12.000MHz {unsigned char data i, j;i 12;j 169;…