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)
- 中断号是0-15之间
- 用于core之间相互通信,由软件触发的中断,也可以称为IPI中断
- PPI(Private Perpheral Interrupt)
- 中断号在16-31之间
- 此类中断是每个core私有的,只用于当前core处理一些业务时使用,比如每个core上有一个tick中断,用于进程调度使用
- SPI(Shared Perpheral Interrupt)
- 中断号在32-1020之间
- 此类中断是由外设触发的中断信号产线,比如touch的触摸屏中断等
- LPI(Local-sperical Perpherial Interrupt)
- 此中断不只支持GIC-v1,GIC-v2.
- 只基于消息类型的中断
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)的主要内容,如果未能解决你的问题,请参考以下文章