首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ARMv8-A Generic Interrupt Controller(GIC)

ARMv8-A Generic Interrupt Controller(GIC)

作者头像
DragonKingZhu
发布2020-04-09 10:16:42
2.2K0
发布2020-04-09 10:16:42
举报

本节描述下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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于GIC-500的特性
  • GIC-500和CPU之间的框图
  • GIC-500的内部布局
  • 中断类型
  • Distributor仲裁器
  • CPU interface
  • 中断的状态
  • 中断状态的改变
  • 中断处理流程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档