您好,欢迎访问三七文档
GenericInterruptController(GIC)1.Introduction1.1AbouttheGenericInterruptControllerarchitecture1.通用中断控制器架构定义:•该架构用于处理任何连接到GIC上的处理器的所有中断源•通用的中断控制器可编程接口适用于单处理器或是多处理器系统中。2.GIC集成系统中所支持和管理的中断源,Itprovides:•寄存器用于管理中断源,中断行为和中断分发到一个或多个处理器•Supportfor:—ARM架构虚拟扩展—使能或禁用处理器中断的外设中断源—软件生成的中断(SGI)—中断屏蔽和优先级—单处理器和多处理器环境—在电源管理环境下的唤醒事件3.处理器安全状态和安全与非安全访问GIC处理器实现了ARM安全扩展有安全状态,安全或非安全:•处理器在非安全状态只可以通过非安全方式访问GIC•处理器在安全状态既可以通过安全也可以非安全的方式访问GIC•运行在非安全状态的软件被描述为非安全软件•运行在安全状态的的软件被描述为安全软件1.2Interruptstates图1-1中断处理状态机示意图Inactive中断未触发状态,该中断即没有Pending也没有Active;Pending由于外设硬件产生了中断事件(或者软件触发)该中断事件已经通过硬件信号通知到GIC,等待GIC分配的哪个CPU进行处理;ActiveCPU已经应答(acknowledge)了该interrupt请求,并且正在处理中但是还没有处理完;Activeandpending当一个中断源处于Active状态的时候,同一中断源又触发了中断,进入pending状态。Note:中断一旦被应答,distributor就会把该中断的状态由pending状态改为active或者是activeandpending(这是和该interruptsource的信号有关,例如如果是电平中断并且保持了该asserted电平,那么就是activeandPending)。1.3InterruptGrouping1.除了不包括安全扩展的GICv1实现,所有的GIC架构都支持中断分组。•默认所有的中断都是Group0中断,通过IRQ中断请求信号发送给连接到的处理器•每一个中断可以被配置为Group1或者是Group0中断•CPUinterface可以配置成通过FIQ中断请求发送Group0中断给连接到的处理器2.GIC包含中断分组的功能,该功能支持:•将每一个中断配置为Group0或是Group1•通过IRQ或是FIQ异常请求将Group0中断发送给目标处理器•只能通过IRQ异常请求将Group1中断发送给目标处理器•一个统一的方案用于处理Group0和Group1中断的优先级•一些Group0中断的配置的锁定是可选的3.GICv2中,当用软件模型将GICC_CTLR.AckCtl设置为0,分离的寄存器被用来管理Group0和Group1中断。—GICC_IAR,GICC_EOIR,andGICC_HPPIRforGroup0interrupts—GICC_AIAR,GICC_AEOIR,andGICC_AHPPIRforGroup1interrupts.Note:当GIC实现了安全扩展并且与之相连的处理器也实现了ARM安全扩展,那么:Group0中断为安全的中断,Group1中断为不安全的中断。1.4Interruptstype1)PeripheralInterrupt---边沿触发和电平触发PrivatePeripheralInterrupt(PPI)---ID16-ID31areusedforPPIsPPI为每个core的私有外设中断SharePeripheralInterrupt(SPI)---InterruptnumbersID32-ID1019areusedforSPIsSPI为各个core公用的中断2)SoftwareGeneratedInterrupt(SGI)---边沿触发---ID0-ID15areusedforSGIs(ID0-ID7是不安全中断,ID8-ID15是安全中断)SGI为软件可以触发的中断,经常用于各个core之间的通信。该类中断通过相关联的中断号和产生该中断的处理器的CPUID来标识3)虚拟中断(Virtualinterrupt)4)维护中断(Maintenanceinterrupt)Note:电平触发是在高或低电平保持的时间内触发,而边沿触发是由高到低或由低到高这一瞬间触发;在GIC中PPI和SGI类型的中断可以有相同的中断ID。1.5Modelsforhandlinginterrupts1)1-Nmode(SPIsusingtheGIC1-Nmodel)表示中断可以发给所有的CPU,但只能由一个CPU来处理中断;换句话说,这种类型的中断有N个目标CPU,但只能由其中一个来处理;当某一个处理器应答了该中断,便会清除在所有目标处理器上该中断的挂起状态。2)N-Nmode(PPIsandSGIsusingtheGICN-Nmodel)表示中断可以发给所有CPU,每个CPU可以同时处理该中断。当该中断被某一个处理器应答了,这不会影响该中断在其他CPU接口上的状态。举两个例子说明:1)UART接收到一包数据,产生了一个中断给GICD,GICD可以将该中断分配给CPU0-7中任何一个处理;假设该中断分配给CPU0处理了,那么在中断处理函数里面会把接收到的数据从UARTFIFO读出。可以想象一下,如果CPU0在读数据时,另外一个CPU也在处理该中断,恰巧也在读数据,那么CPU0读到的数据是不全的。这就是1-Nmodel中断,或者说SPI中断。2)比如CPU0给CPU1-7发送中断,想告知对方自己正在处理某个进程A。这种场景下,CPU1-7都接收到中断,都进入中断处理函数,CPU1-7获取到CPU0的信息后,在进程调度时,就可以绕开进程A,而自己调度其他进程。注:这个例子只是说明N-Nmodel,实际上进程调度不是这样的。1.6Spuriousinterrupts1.GIC发送给处理器的中断不再被需要,这是有可能的。如果发生上述情况,当处理器应答该中断,GIC会返回一个特殊的中断ID用来标识该中断是一个伪中断。发生伪中断的原因:•先于处理器应答该中断,发生了:—软件改变了该中断优先级—软件Disable该中断—软件改变了该中断的目标处理器•对于1-N模型的中断,其他处理器先于此处理器应答该中断1.7Banking1)Interruptbanking在多处理器系统中,对于PPI和SGI,GIC可以有多个中断使用同一个中断号。这样的中断称为bankedinterrupt,该类中断通过中断号和相关联的CPUinterface可以唯一标识。2)Registerbanking是指在同一个地址实现多个副本寄存器,即多个寄存器拥有相同的地址。•在多处理器系统中,为bankedinterrupt的相关寄存器在每个处理器上提供一个独立的copy。•在GIC实现安全扩展中,提供寄存器的安全与非安全的副本。Note:在ARM结构中最常见的RegisterBanking是R8~R12,在不同模式下,使用不同的物理寄存器。2.GICPartitioning通常把GIC分成两个部分,分发器(Distributor)和CPU接口(CPUInterface)。2.1Distributor2.1.1DistributordefinesTheDistributorcentralizesallinterruptsources,determinesthepriorityofeachinterrupt,andforeachCPUinterfaceforwardstheinterruptwiththehighestprioritytotheinterface,forprioritymaskingandpreemptionhandling.2.1.2Distributor对中断的控制1.Distributor提供可编程的接口for:(1)中断enable或者disable的控制。Distributor对中断的控制分成两个级别。一个是全局中断的控制(GIC_DIST_CTRL)。一旦disable了全局的中断,那么任何的interruptsource产生的interruptevent都不会被传递到CPUinterface。另外一个级别是对针对各个interruptsource进行控制(GIC_DIST_ENABLE_CLEAR),disable某一个interruptsource会导致该interruptevent不会分发到CPUinterface,但不影响其他interruptsource产生interruptevent的分发。(2)控制将当前优先级最高的中断事件分发到一个或者一组CPUinterface。当一个中断事件分发到多个CPUinterface的时候,GIC的内部逻辑应该保证只assert一个CPU。(?)(3)优先级控制。(4)interrupt属性设定。例如是level-sensitive还是edge-triggered(5)interruptgroup的设定Note:分发器其实应该叫汇聚器,在IC的后端设计中,layout会把各个模块引过来的中断线混接到GIC(就是上面说的三种中断),然后把混聚合的中断接到CPU的irq线上,这样core就有触觉了。2.2CPUInterfaceCPUinterface这个block主要用于和processor进行接口。2.2.1Interface的作用(a)enable或者disableCPUinterface向连接的CPUassert中断事件。对于ARM,CPUinterfaceblock和CPU之间的中断信号线是nIRQCPU和nFIQCPU。如果disable了中断,那么即便是Distributor分发了一个中断事件到CPUinterface,但是也不会assert指定的nIRQ或者nFIQ通知processor。(b)ackowledging中断。processor会向CPUinterfaceblock应答中断(应答当前优先级最高的那个中断),中断一旦被应答,Distributor就会把该中断的状态从pending状态修改成active或者pendingandactive(这是和该interruptsource的信号有关,例如如果是电平中断并且保持了该asserted电平,那么就是pendingandactive)。processorack了中断之后,CPUinterface就会deassertnIRQCPU和nFIQCPU信号线。(c)中断处理完毕的通知。当interrupthandler处理完了一个中断的时候,会向写CPUinterface的寄存器从而通知GICCPU已经处理完该中断。做这个动作一方面是通知Distributor将中断状态修改为deactive,另外一方面,CPUinterface会prioritydrop,从而允许其他的pending的interrupt向CPU提交。(d)设定prioritymask。通过prioritymask,可以mask掉一些优先级比较低的中断,这些中断不会通知到CPU。(e)设定preemption的策略(f)在多个中断事件同时到来的时候,选择一个优先级最高的通知processor2.2.2Example我们用一个实际的例子来描述GIC和CPU接口上的交互过程,具体过程如下:Figure2-1首先给出前提条件:(a)N和M用来标识两个外设中断,N的优先级大于M(b)两个中断都是SPI类型,leveltrigger,active-high(c)两个中断被配置为去同一个CPU(d)都被配置成group0,通过FIQ触发中断下面是按照时间轴来描述交互过程:2.2.3Interruptsignalbypass1.Bypass可
本文标题:GIC
链接地址:https://www.777doc.com/doc-7015158 .html