参考文档:

Documentation – Arm Developer 
ARM Generic Interrupt Controller Architecture Specification

目录

一,GIC的作用

二,GIC的组成

二,中断状态 Interrupt states

三,中断类型

1,软件中断Software Generated Interrupt (SGI)

2,外设中断(Peripheral interrupt)

Private Peripheral Interrupt (PPI)

Shared Peripheral Interrupt (SPI)

Edge-triggered

Level-sensitive

四,中断配置Configuration

五,中断初始化 Initialization

六,中断处理 handling


ARM提供了一个可用于ARMv8-A系统的通用中断控制器GIC,这个中断控制器的编程接口在GIC架构中定义。通用中断控制器(GIC)支持多核系统中cores之间由软件生成(SGI)、私有(PPI)和共享外设(SPI)中断的路由。

GIC架构还提供了可用于管理中断源和行为的寄存器,以及(在多核系统中)将中断路由到各个core的寄存器。它使软件能够屏蔽、启用和禁用来自单个源的中断,对单个中断源(在硬件上)进行优先级排序,并生成软件中断。GIC接受在系统级别断言的中断,并可以向它所连接的每个core发出信号,可能导致IRQ或FIQ异常。

一,GIC的作用

GIC可用于ARM A系列和R系列的单core或者多core的架构,在至少1个core的系统中管理中断,它支持:

  1. 有相关寄存器来管理中断源(interrupt sources),中断行为(interrupt behavior)以及中断路由(interrupt routing)
  2. ARM 架构的安全扩展
  3. ARM架构虚拟化扩展(实现ARM虚拟化扩展的处理器也必须实现ARM安全扩展)
  4. 从硬件(外设)中断源中,使能、禁止以及产生处理器中断
  5. 软件生成中断(SGI)
  6. 中断屏蔽以及优先级
  7. 支持单核和多核环境
  8. 在电源管理环境(power-management environments)中被事件唤醒

二,GIC的组成

GIC主要有两大功能模块,分发器(Distributor)和CPU接口(CPU Interface):

  • 分发器(Distributor):系统中的所有中断源都与之相连接。Distributor有寄存器可以控制每个中断的属性,比如优先级、状态、安全状态、路由信息以及使能状态等。Distributor通过连接的CPU interface,可以决定将哪个中断转发到指定的core中。
  • CPU接口(CPU interface):core通过CPU interface来接收中断,CPU interface通过寄存器来屏蔽、确认以及控制转发到指定core的中断。在系统中每个core有个独立的CPU interface。

在软件层面,中断由一个称为中断ID的数字标识。中断ID与中断源一一对应,软件可以使用中断ID来识别中断的来源,并调用相应的处理程序来为中断提供服务。此外,显示给软件的确切中断ID是由系统设计决定的。

二,中断状态 Interrupt states

以下状态适用于GIC和连接的处理器之间的每个接口:

Inactive(非活跃) 不是活动的或挂起的中断,这意味着当前还没有断言(assert)中断。
Pending(挂起) 已经被断言(asserted),但是等待core进行处理。挂起的中断将会被转发到CPU interface,然后会被core进行处理。
Active(活跃) 该中断已被core确认,正在处理,但尚未完成。
Active and pending(活跃并挂起) 一个core正在处理中断,而GIC有一个来自同一源的挂起的中断。

中断的优先级和可以被转发到的core列表都在Distributor中配置,Distributor确定可以传递到core的处于pending状态的最高优先级的中断, 然后转发到与该core相连的CPU interface。在CPU interface中,中断被依次发送给core,然后在core中会发生FIQ或者IRQ异常。

Core会执行异常处理器(exception handler),handler必须从CPU interface 寄存器中获取到该中断的ID号,然后开始处理中断源。当处理完成后,handler必须对CPU interface的寄存器(EOI)进行写入,以说明中断处理完成。

一个中断状态变化过程:

  • Inactive -> Pending:当中断被外设断言时
  • Pending -> Active:当中断处理器(handler)获知了当前中断
  • Active -> Inactive:handler处理完成了中断

在Distributor中有相关寄存器能显示不同中断ID的当前中断状态,GIC提供寄存器来控制SPI中断转发到哪些core。这种机制使操作系统能够在core之间进行共享和分发中断。

三,中断类型

1,软件中断Software Generated Interrupt (SGI)

这是由软件显式生成的,通过写入专用的Distributor寄存器,即Software Generated Interrupt Register (GICD_SGIR)。它最常用于core间通信。可以针对所有SGI,也可以针对系统中选定的一组cores。中断ID为0-15。用于给定中断的中断ID是由生成它的软件设置的。

SGI具有边缘触发属性。中断的软件触发相当于中断请求信号的边缘转移。

当一个SGI在多处理器实现中发生时,Interrupt Acknowledge Register,GICC_IAR的CPUID字段(或者是Aliased Interrupt Acknowledge Register,GICC_AIAR)可以确认是哪个core在请求中断。

2,外设中断(Peripheral interrupt)

外设中断可分为私有外设中断(Private Peripheral Interrupt,PPI)和共享外设中断(Shared Peripheral Interrupt,SPI):

Private Peripheral Interrupt (PPI)

特定于单个处理器的外设中断,这是一个全局外设中断,Distributor可以将其路由到一个或多个指定的cores。中断ID为16-31。这些ID标识了core私有的中断源,并且独立于另一个core上的同一中断源。

Shared Peripheral Interrupt (SPI)

Distributor可以将其路由到任何指定的处理器组合。这是由一个外设生成的中断,GIC可以将它路由到一个到多个core。中断号为32-1020。SPI用于从整个系统可访问的各种外设发出信号中断。

每个外设中断也可以分为边缘触发中断和电平敏感中断:

Edge-triggered

这是一种在检测到中断信号的上升边缘时断言的中断,然后不管信号的状态如何,都保持断言,直到被本规范定义的条件清除为止。

Level-sensitive

当中断信号级别是活动的时候就断言,当中断信号级别不是活动的时候就撤销断言。

四,中断配置Configuration

GIC作为内存映射的外设被访问,所有的core都可以访问公共的Distributor,但是CPU interface 是banked的,这意味着,每个core可以使用相同的地址来访问它们各自私有的CPU interface,但是一个core不能访问其他core的CPU interface。

Distributor中有一系列的寄存器用来配置每个独立中断的属性,可以配置的属性包括:

  • 中断优先级interrupt priority (GICD_IPRIORITY<n>),Distributor使用这个属性来决定接下来哪个中断将会被转发到CPU interface。
  • 中断配置 interrupt configuration (GICD_ICFGR<n>),这个决定中断是电平敏感还是边缘触发,但对SGI中断不适用,SGI只具有为边缘触发特性。
  • 中断目标处理器 interrupt target (GICD_ITARGETSR<n>),这个属性只对SPI适用,它决定了一个中断可以转发到的core列表。
  • 中断使能和禁止状态 Interrupt enable or disable status (GICD_ISENABLER<n> and
    GICD_ICENABLER<n>)
    。只有中断在Distributor中被使能enable,当中断变成pending状态的时候才会被转发。
  • 中断安全特性 Interrupt security (GICD_IGROUPR<n>),这决定了中断是否被分配到 Secure 还是 Normal (Non-Secure)区域。
  • 中断状态,Interrupt state

Distributor还提供了优先级屏蔽(priority masking),相当于优先级阈值,通过它,低于某个优先级的中断将被阻止到达core。Distributor在确定是否可以将pending中断转发到特定的核心时使用此方法。此外,每个core与之相连的CPU interface可以实现对中断更精细的控制。

五,中断初始化 Initialization

Distributor和CPU interface都会在reset的时候被disable,GIC必须在reset之后进行初始化,以便可以将中断传递到core中。

在Distributor中,软件必须配置:优先级,目标core,安全性以及enable 状态等属性,随后必须通过其控制寄存器(GICD_CTLR)启用Distributor。

对于每个CPU interface,软件必须编写控制中断的优先级掩码priority mask及抢占设置preemption settings(中断抢占,即中断嵌套)。每个cpu interface接口必须通过控制寄存器(GICD_CTLR)来使能,然后GIC才可以将中断转发到指定core中。

在core预期中断到来之前,软件通过需在中断向量表中设置有效的中断向量,在PSTATE中清除中断掩码位,以及设置路由控制,让core接收中断。

系统的完整的中断机制可以通过disable Distributor来禁止,中断传递到core中的功能也可以通过disable CPU interface来禁用,此外,每个独立的中断也可以在Distributor阶段被使能或者禁止。

所以中断若想传递到core中,Distributor和CPU interface都必须被使能,并且需要足够的优先级(高于在优先级阈值)。

六,中断处理 handling

  1. 当core开始处理中断时,它首先从中断向量表中获取最顶层(top-level)的中断向量,然后跳转到该向量所指向的handler并开始执行。
  2. 最顶层的中断向量指向中断处理器(handler),将会读取Interrupt Acknowledge Register,IAR寄存器来从CPU interface 中获得当前的中断ID,当中断ID返回后,这个读操作会让Distributor把当前中断的状态标记为Active。
  3. 一旦中断ID被知晓(识别了中断源),最顶层的中断handler将会派发一个针对这个中断源的handler来处理这个中断。
  4. 当针对该中断源的中断handler处理完了该中断,这个最顶层的handler将会在CPU interface 中,把该中断的ID写入End of Interrupt (EoI) 寄存器,这个操作将会让CPU interface转发其他正在pending状态的中断到core中,也包括处理单个中断的时候。
  5. 等待当前core处理的中断可能不止一个,但是CPU interface一次只能转发一个中断到core中,最顶层的中断handler将会重复上述流程,直到它读到了特殊的中断ID值1023,表明当前core以及没有正在pending的中断需要处理了,这个特殊的中断ID也称为虚假中断ID(spurious interrupt ID)。

虚假中断ID 1023是个保留值,不能分配给任何设备,当顶层中断handler读到这个值时,它将完成它的执行,并且准备将core恢复上下文(在处理中断前的状态)。

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

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

    在阅读本章之前,可以参考笔者之前关于GIC的一些描述: ARM通用中断控制器GIC(generic Interrupt Controller)简介 ARM架构Generic Interrupt Con ...

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

    在阅读本章之前,可以参考笔者之前关于GIC的一些描述: ARM通用中断控制器GIC(generic Interrupt Controller)简介 ARM架构Generic Interrupt Con ...

  3. ARM通用中断控制器GIC之中断处理状态机 Interrupt handling state machine

    中断有四种状态:inactive,pending,active 和active and pending.而产生中断的方式有两种,一种是通过写pending寄存器,让中断进入pending状态,可以忽略 ...

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

    在上一篇博文ARM通用中断控制器GIC(generic Interrupt Controller)简介中,笔者对GIC做了一个整体的简介,接下来笔者将对GIC中的一些细节问题进行研究学习,首先要介绍的 ...

  5. GIC通用中断控制器

    1. GIC简介 操作系统中,中断是很重要的组成部分.有了中断系统才可以不用一直轮询(polling)是否有事件发生,系统效率才得以提高.一般在系统中,中断控制分为三个部分:模块.中断控制器和处理器. ...

  6. Linux中断子系统(一)中断控制器GIC架构

    Linux中断子系统(一)中断控制器GIC架构 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客: Linux中断子系统(一)中 ...

  7. ARM GICv3中断控制器

    changelog: 2019年02月17日 初稿 2020年03月1日 fix typos以及增加中断路由 1. 前言 GIC,Generic Interrupt Controller.是ARM公司 ...

  8. Linux中断子系统(二)中断控制器GIC驱动分析

    Linux中断子系统(二)中断控制器GIC驱动分析 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客: Linux中断子系统(一 ...

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

    GIC由Distributor和CPU interface两部分组成,如果支持虚拟化扩展,还有virtual CPU interface.本文主要介绍Distributor和CPU interface ...

最新文章

  1. linux常用查看硬件设备信息命令
  2. [开源]KJFramework.Message 智能二进制消息框架 -- 性能提升
  3. 使用sql语句,查询 mysql 的安装地址
  4. 《Android安全技术揭秘与防范》—第8章8.5节Hook检测/修复
  5. sql server中扩展存储过程
  6. 使用LXCFS实现容器资源的视图隔离
  7. Intel超线程技术 Hyper-Threading Technology (1) - 引言与历史
  8. 【刷题】LOJ 6005 「网络流 24 题」最长递增子序列
  9. 线性代数矩阵论——行列式的一些性质推论及Cramer法则
  10. 笔记| 计算机数据表示实验(HUST)| 汉字机内码获取实验
  11. 文件内存映射(一):它是什么
  12. 超靠谱,一文教会你如何注册申请安徽省实用新型专利
  13. matlab 全局符号变量,优化全局变量使用 - MATLAB Simulink Example - MathWorks 中国
  14. PHP搞笑文字表情包在线制作网站源码
  15. 一个简单的教学管理系统(SQL实现)
  16. 求助,DatabaseError: (cx_Oracle.DatabaseError) ORA-00904: xiaoli: 标识符无效
  17. 计算机网络家庭网络设计,为家庭设计一个局域网
  18. CryEngine5 Shader调试
  19. 【数学】泰勒公式推导(佩亚诺余项)
  20. 网易视频云:浅谈视频通信技术的发展

热门文章

  1. STM32F103C8T6定时器实现led的周期闪烁及PWM实现流水灯
  2. Elasticsearch根据查询条件求和sum
  3. 不是机器人阿的吻戏在哪一集_不是机器人啊第12集分集剧情介绍(共32集)_电视剧_搜视网...
  4. 微信服务商快速进件,商户自己提交资料,减少工作量
  5. uni-app h5唤起App
  6. php %3c%3c%3cxml 报错,ThinkPHP5框架缺陷导致远程命令执行(POC整合帖)
  7. 数据类型和抽象数据类型
  8. 长见识了!现在连送快递的都用上大数据了!
  9. vue + vscode 插件
  10. 基于虹软(ArcSoft)实现人脸识别——Android版