ARM中断处理之GIC

收藏一篇gic的文章 gic中断.
本章的主要内容如下:
Ø 中断处理(interrupthandling)主要描述
n GIC如何识别中断
n 软件如何通过编程GIC来配置和控制中断
n GIC处理任意CPU interface中断的状态机
n CPU的异常模式下如何与GIC交互
Ø 优先化(prioritization)
n 配置和控制每个中断的优先级
n 挂起中断的执行顺序
n 中断是否对目标CPU可见的决定因素:
u 中断优先级屏蔽
u 优先级分组
u 抢占当前activeinterrupt
3.1.1 多处理器(MP)系统中处理不同类型的中断
GIC支持外设中断(硬件中断)PI和SGI中断。在MP系统中的处理方式不同:SGI使用N-N模型,PI使用1-N模型。
3.1.2 识别GIC支持的中断
软件获取支持的中断信息:
Ø 读GICD_TYPERn。GICD_TYPER中的ITLinesNumber决定GICD_ISENABLERn的数目,因此决定了GIC支持的最大SPI的数目。所以,GIC支持的中断总数(ITLinesNumber+1)。
Ø 写0到GICD_CTLR禁止GICDistributor将中断传递给CPU interface。
Ø 对于GICD_ISENABLERn,从GICD_ISENABLE0开始。
n 写0xffffffff到GICD_ISENABLERn
n 然后读GICD_ISENABLERn,相应位为1代表支持该中断ID。

类似的软件也可以通过读取GICD_ICENABLEn来获取相应中断信息。
Ø 对于GICD_ICENABLERn,从GICD_ISENABLE0开始。
n 写0xffffffff到GICD_ICENABLERn,禁用所有中断。
n 然后读GICD_ISENABLERn,相应位为1表示中断被永久使能了。
n 写1到GICD_ISENABLERn,则相应位重新被使能。
3.2 通用中断处理
当GIC接收一个中断,将其状态置为pending。重新产生挂起中断不影响该中断状态。中断处理的顺序:

  1.  GIC决定该中断是否被使能,若没有被使能对GIC没有影响。 
    
  2.  对于每个pending中断,GIC决定目标处理器。 
    
  3.  对于每个处理器,Distributor根据他拥有的每个中断优先级信息决定最高优先级的挂起中断,将该中断传递给目标CPU interface。 
    
  4.  GIC Distributor将一个中断传递给CPUinterface后,该CPU interface决定该中断是否有足够的优先级将中断请求发送给CPU。
    
  5.  当CPU开始处理该异常中断,它读取GICC_IAR应答该中断。读取的GICC_IAR获取到中断ID,对于SGI,还有源处理器ID。中断ID被用来查找正确的中断处理函数。GIC识别读过程后,将改变该中断的状态: 
    

a) 如果该中断在pending状态时,产生了另一次中断,中断状态将从pending转化为pending &active。
b) 否则,中断状态将从pending变为active。
6. 当处理器完成中断处理后,它需要通知GIC处理已经完成。这个过程称为priority drop and interrupt deactivation:
a) 需要写EOIR(End of interrupt register)
b) 接着需要写GICC_DIR(deactivate interrupt register)
3.2.1 Priority drop and interruptdeactivation
Priority drop是降低当前中断优先级(runningpriority),这个动作发生在写EOIR后,即写GICC_EOIR或GICC_AEOIR。
Interruptdeactivation是改变中断状态:

  1.  从active & pending变为pending; 
    
  2.  从active变为idle。 
    

在GIC v2.0实现中,GICC_CTLR.EOImode为1表示这两个操作被分开执行。

3.2.2 GIC的中断控制
3.2.2.1 中断使能
对于一个外设中断(PI),一个处理器可以通过如下两种方法:
Ø 写1到GICD_ISENABLERn的相应位使能一个中断
Ø 写1到GICD_ICENABLERn的相应位禁用一个中断
对于一个SGI中断,是否永久使能或可以被上述的两个寄存器控制,这是有芯片实现决定的。
3.2.2.2 设置和清除中断挂起状态
对于外设中断,处理器可以通过如下方式控制:
Ø 写GICD_ISPENDRn设置中断pending状态;
Ø 写GICD_ICPENDRn清除中断pending状态。

对于一个电平触发的中断:
Ø 当硬件中断发出中断信号,且处理器已经GICD_ICPENDRn相应位,这个时候写GICD_ICPENDRn对该中断的挂起状态不会产生任何影响。
Ø 如果处理器对GICD_ISPENDRn的相应位写1,不管当前硬件的中断信号是否已经发出,都不会影响该中断的变化pending状态。
3.2.2.3 找到激活或挂起状态的中断
处理可以通过如下方法:
Ø 读GICD_ISPENDRn或GICD_ICPENDRn的相应位找到挂起状态的中断;
Ø 读GICD_ISACTIVERn或GICD_ICACTIVERn的相应位找到激活状态的中断。
当中断为挂起或者激活时,GICD_ISPENDRn或GICD_ISACTIVERn相应位为1;如果中断处于active& pending状态,那么这两个寄存器的相应位都为1.
3.2.2.4 产生SGI
处理器可以通过写GICD_SGIR来产生一个SGI。一个SGI可以传递给多个CPU,在GICD_SGIR寄存器中的CPUTargetList就可以指定目标处理器。
SGI可以是来自不同的处理器但使用了同一中断ID,因此,任意目标CPU可以接收来自不同CPU的使用同一个中断号的SGI。因此两个SGI只要有如下一项不同就是不同的:中断ID、源处理器和目标处理器。
当产生SGI,目标处理器读GIC的GICC_IAR返回中断号ID和源处理器。中断号ID和源处理器ID才能唯一的标识目标处理器。

3.2.5 特殊中断号
GIC保留中断号1020~1023,其中1023是伪中断号(SpuriousInterrupt)。
3.3 中断优先化
3.3.1 Preemption
在一个active中断被处理完之前,CPUinterface 支持通知更高优先级的中断到目标处理器。这种情况必要条件如下:
Ø 该中断的优先级高于当前CPUinterface被屏蔽优先级;
Ø 该中断的组优先级高于正在当前CPU interface处理的中断优先级
Preemption(抢占)发生在处理器应答这个新的中断时,开始为执行新中断的相应服务程序。原来的中断就被抢占,这种情况也称为中断嵌套。
3.3.2 Priority Masking(优先级屏蔽)
GICC_PMR定义了目标处理器的优先级阈值。GIC仅上报那些优先级高于这个阈值的pending中断。初始值为0,屏蔽所有的中断。
3.3.2 优先级分组(Priority grouping)
优先级分组是将GICC_BPR(Binary PointRegister)分为两个域,组优先级(group priority)和组内优先级(subpriority)。当决定抢占(Preemption)的时候,组优先级相同的中断被视为一样的,不考虑组内优先级。那就意味着在每个优先级组内只能有一个中断被激活。组优先级又被称为抢占级别(preemption level)。
GIC使用组优先级决定挂起中断是否有足够的优先级抢占当前active中断,原则如下:
Ø 如果发生抢占,该挂起中断的组优先级一定比当前active中断的组优先级高,也就是说,挂起中断的组优先级域的值小于active中断的组优先级域的值。
Ø 如果当前CPUinterface上没有active中断,最高优先级的挂起中断将被传递给处理器,而不考虑组优先级。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "Linux ARM GIC 中断流程" 是指在 ARM 架构的 Linux 操作系统中,使用 Generic Interrupt Controller(GIC处理器来管理系统中各种中断的流程。它负责将来自不同设备和外部事件的中断请求,分派给适当的处理程序来处理,并确保系统按顺序执行这些处理程序。中断处理是系统中一个重要的组成部分,它允许设备和软件互相通信,并提高了系统的稳定性和可靠性。 ### 回答2: Linux是一个非常流行的开源操作系统,可以在不同架构的计算机上运行。ARM架构是一种广泛使用的嵌入式系统架构,因此,许多嵌入式设备都使用Linux作为其操作系统。在ARM架构上,通常会使用GIC(通用中断控制器)来管理中断,这个过程可以分为中断触发、CPU响应和中断处理三个部分。 中断触发是指中断信号从设备到达GIC的过程。当一个设备需要发送一个中断时,它会向GIC发送一个中断请求信号,并指定中断号,这个中断号是唯一的,用于区分不同的中断GIC会根据中断号去查找到这个中断对应的中断控制器,进而把这个请求传递给指定的CPU。 CPU响应是指CPU接收到中断请求信号后的响应过程。当GIC中断请求传递给CPU时,CPU需要检查是否允许这个中断请求,也就是检查中断屏蔽寄存器(Interrupt Mask Register)。如果这个中断请求已被屏蔽,则CPU不会响应,否则,它会设置自己的中断挂起寄存器(Interrupt Pending Register),告诉GIC它已经准备好去处理这个中断中断处理是指CPU执行中断处理程序,处理具体的中断。当CPU设置了它的中断挂起寄存器后,GIC会向CPU发送一个中断信号。CPU会暂停当前的进程,并把当前的上下文信息(比如,寄存器值)保存到内存中。之后,CPU会跳转到中断处理程序(Interrupt Service Routine),开始执行具体的中断处理代码。中断处理程序完成后,CPU会从内存中恢复之前保存的上下文信息,并恢复之前进程的执行。 总的来说,ARM架构上的Linux操作系统通常使用GIC来管理中断,其中包括中断触发、CPU响应和中断处理三个方面。这个流程对于保证系统的稳定性和快速响应非常重要。 ### 回答3: 在ARM架构的Linux系统中,GIC(Generic Interrupt Controller)被用来管理中断。当发生中断时,GIC会将中断信号发送到CPU,然后CPU会停止当前的进程并处理中断GIC中断流程如下: 1. 报告中断:设备或其他外部事件引发中断信号,设备向GIC发送中断信号,GIC会产生一个中断源标识符,然后将其发给CPU。 2. 响应中断:CPU根据中断源标识符查询GIC,查看中断请求的优先级和处理器状态,如果中断请求的优先级高于当前中断处理器,那么CPU会中止当前进程,执行中断处理程序。 3. 中断处理中断处理程序会读取设备状态,进行相应的操作,处理完成后会发出一个中断信号,通知GIC中断已被处理。 4. 中断结束:GIC收到来自设备的中断完成信号后,将中断源标识符置为未激活状态。 在这个流程中,GIC起到了一种路由的作用,将中断信号从设备传输到CPU,同时根据中断请求的优先级来优先处理高优先级的中断。这样就可以保证系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值