您的位置 首页 > 腾讯云社区

ARMv8-A Generic Interrupt Controller(GIC)---DragonKingZhu

本节描述下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可以最大支持128CoresGIC-500目前只支持ARMv8架构GIC支持四种中断类型支持CPU-Interface, DistributorGIC-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的RedsitributorSGI中断类型是由软件触发的,则会从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模块,进行优先级,状态,亲合性,以及路由到那个coreCPUinterface会将此中断路由到相应的core此时CPU会访问Interrupt Acknowledge Register(ICC_IAR0)寄存器,会获取对应的INTID,然后会将中断的状态由pending修改为Active当CPU处理完此中断后,软件上会写此EOI(End of Interrupt)标识此中断处理完毕将中断的状态由active修改为inactive ---来自腾讯云社区的---DragonKingZhu

关于作者: 瞎采新闻

这里可以显示个人介绍!这里可以显示个人介绍!

热门文章

留言与评论(共有 0 条评论)
   
验证码: