ARM GIC简介与Linux中断处理分析

先简单说明一下GIC(具体详尽的介绍请查阅ARM GIC相关文档)

GIC即general interrupt controller。

它是一个架构,版本历经了GICv1(已弃用),GICv2,GICv3,GICv4。对于不同的GIC版本,arm公司设计了对应的GIC IP

GIC的核心功能:对soc中外设的中断源的管理,并且提供给软件,配置以及控制这些中断源。

下面一张ARM GICv2 的图

中断源类型说明:

SGI(Software-generated interrupt):范围0 - 15,软件触发的中断,一般用于核间通讯

PPI(Private peripheral interrupt ): 范围16 - 31,私有外设中断,只对指定的core有效

SPI(Shared peripheral interrupt):范围32 - 1019,共享中断,不限定特定的core

控制分两部分,Distributor和CPU interface

Distributor对中断的控制包括:
(1)中断enable或者disable的控制
(2)将当前优先级最高的中断事件分发到一个或者一组CPU interface
(3)优先级控制
(4)interrupt属性设定。例如是level-sensitive还是edge-triggered
(5)interrupt group的设定


CPU interface:将GICD发送的中断信息,通过IRQ,FIQ管脚,传输给core

GIC对中断的处理包括以下4种状态:

  • inactive:中断处于无效状态

  • pending:中断处于有效状态,但是cpu没有响应该中断

  • active:cpu在响应该中断

  • active and pending:cpu在响应该中断,但是该中断源又发送中断过来

其转换过程如下:

发生中断信号走向:

至此,关于GIC相关的介绍基本可以满足阅读Linux内核关于中断处理的相关code

以下源代码基于ssd20x官方kernel为例,cortexA7,ARMv7架构,32位

中断向量入口位于:arch/arm/kernel/entry-armv.S

/*
 * Interrupt handling.
 */
	.macro	irq_handler
#ifdef CONFIG_MULTI_IRQ_HANDLER
	ldr	r1, =handle_arch_irq
	mov	r0, sp
	badr	lr, 9997f
	ldr	pc, [r1]
#else
	arch_irq_handler_default
#endif

关于宏CONFIG_MULTI_IRQ_HANDLER,表示"允许每台机器在运行时指定它自己的IRQ处理程序",因为kernel一般支持多种平台,多种处理器,所以此选项一般开启

进入irq_handler有两种情况

一个是用户模式下发生了中断

	.align	5
__irq_usr:
	usr_entry
	kuser_cmpxchg_check
	irq_handler
	get_thread_info tsk
	mov	why, #0
	b	ret_to_user_from_irq
 UNWIND(.fnend		)
ENDPROC(__irq_usr)

 另一个是内核态时发生了中断

	.align	5
__irq_svc:
	svc_entry
	irq_handler

#ifdef CONFIG_PREEMPT
	ldr	r8, [tsk, #TI_PREEMPT]		@ get preempt count
	ldr	r0, [tsk, #TI_FLAGS]		@ get flags
	teq	r8, #0				@ if preempt count != 0
	movne	r0, #0				@ force flags to 0
	tst	r0, #_TIF_NEED_RESCHED
	blne	svc_preempt
#endif

	svc_exit r5, irq = 1			@ return from exception
 UNWIND(.fnend		)
ENDPROC(__irq_svc)
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值