ARMv8-A Generic Interrupt Controller(GIC)

Posted Loopers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARMv8-A Generic Interrupt Controller(GIC)相关的知识,希望对你有一定的参考价值。

本节描述下ARM架构下的中断控制器,The Generic Interrupt Controller(GIC)

ARM架构下GIC支持好几个版本,GIC-v1, GIC-v2, GIC-v3, GIC-v4

本系列文章重点聚焦在GIC-V3版本,而GIC-V3版本的典型代表就是GIC-500

 

关于GIC-500的特性

  • GIC-500可以最大支持128Cores
  • GIC-500目前只支持ARMv8架构
  • GIC支持四种中断类型
  • 支持CPU-Interface, Distributor

 

GIC-500和CPU之间的框图

  • 中断的产生是通过physical interrupt signals(外设中断信号)或者Message-based Interrupts 或者SGIS。其实这就是GIC支持的几种中断类型
  • GIC是通过AXI4-Stream专用接口连接到CPU上的

 

GIC-500的内部布局

可以看到GIC内部有两个重要的模块

  • Distributor(仲裁器):
  • CPU Interface : CPU-Interface更倾向于CPU侧,每一个CPU都存在一个Interface。

再看一张更详细的图

此图中涉及了好几个概念,Distributor, CPU Interface, Redistributor, SGI, PPI, SPI, LPL

可以先看下面的中断状态和Distributor和CPU-interface的概念

  • SPI会先从Distributor路由到Target Redsitributor,然后再路由到CPU-interface模块
  • PPI直接会路由到local的Redsitributor
  • SGI中断类型是由软件触发的,则会从core路由到CPU-interface和Redsitributor模块,然后会到Dsitributor模块,决定路由到一个或者多个cpu上

 

中断类型

GIC-v3中定义了四种中断类型

  • SGI(Software Generated Interrupt)
    1. 中断号是0-15之间
    2. 用于core之间相互通信,由软件触发的中断,也可以称为IPI中断
  • PPI(Private Perpheral Interrupt)
    1. 中断号在16-31之间
    2. 此类中断是每个core私有的,只用于当前core处理一些业务时使用,比如每个core上有一个tick中断,用于进程调度使用
  • SPI(Shared Perpheral Interrupt)
    1. 中断号在32-1020之间
    2. 此类中断是由外设触发的中断信号产线,比如touch的触摸屏中断等
  • LPI(Local-sperical Perpherial Interrupt)
    1. 此中断不只支持GIC-v1,GIC-v2.
    2. 只基于消息类型的中断

 

Distributor仲裁器

仲裁器的主要作用是对中断优先级排序,以及将SPI和PPI中断分发到Redistributor和CPU-Interface模块,仲裁器对应的寄存器为GICD_CTLR

  • 使能或者关闭此中断(使能状态
  • 对中断进行设置优先级(优先级
  • 设置此中断的触发方式,是边沿触发还是电平触发(触发方式
  • 控制中断的状态(中断状态
  • 使能或者关闭Securiy(中断安全状态
  • 设置中断的Affinity(中断的亲合性
  • 中断的路由情况,是由那个cpu去处理此中断(中断路由信息

以上就是Distributor的作用

 

CPU interface

每一个CPU对应到一个CPU Inrerface模块,当触发中断后,会由Distributor模块来设置中断的状态,以及路由到那个cpu

  • 控制中断的状态,是否已经处理完毕(状态控制
  • 标识一个中断,获取中断的中断号(获取中断号
  • 设置中断的优先级,如果多个中断同时到CPU-interface模块,需要区分优先级(优先级
  • 决定是都要mask此中断等(MASK

 

中断的状态

  • InActive  中断当前没有触发
  • Pending  中断已经触发了,正在等待相应的core处理中断,代表此中断已经路由到CPU interface模块了
  • Active  代表此中断已经在处理中
  • Active and Pending 代表相同的中断在处理中,又触发了一个相同的中断

 

中断状态的改变

  • Inactive -> Pending
    • 此中断由外设触发了
  • Pending -> Active
    • 此中断已经由CPU在处理了
  • Active -> Inactive
    • 此中断已经处理完毕了

 

中断处理流程

  • 外设或者软件触发一个中断,中断的状态设置为Pending
  • 此中断会走到Dirtibutor模块,进行优先级,状态,亲合性,以及路由到那个core
  • CPUinterface会将此中断路由到相应的core
  • 此时CPU会访问Interrupt Acknowledge Register(ICC_IAR0)寄存器,会获取对应的INTID,然后会将中断的状态由pending修改为Active
  • 当CPU处理完此中断后,软件上会写此EOI(End of Interrupt)标识此中断处理完毕
  • 将中断的状态由active修改为inactive

 

以上是关于ARMv8-A Generic Interrupt Controller(GIC)的主要内容,如果未能解决你的问题,请参考以下文章

armv8-a:测试 SIMD 寄存器是不是为 != 0

[译] ARMv8-A的基础知识

ARMv8-A vs ARMv7 Registers

ARMv8-A Exception Handling

ARMv8-A 地址翻译技术之MMU的前世今生

ARMv8-A非对齐数据访问支持(Alignment support)