持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
一、GIC功能模块
GIC的两个主要功能模块:分配器和CPU接口。
(一)分配器
在系统中所有的中断源都被分配器控制。分配器有相应的寄存器控制每个中断优先级、状态、安全,路由信息的属性并启用状态。分配器确定哪些中断通过所连接的CPU接口转发到核心。
分配器提供如下功能:
- 使能挂起中断是否传递到CPU接口
- 使能和禁用任意中断
- 设定任意中断优先级
- 设置任意目标处理器
- 设置中断为电平触发或者边沿触发
- 设置中断为组别
- 传递任意SGI到一个或者多个目标处理器
- 查看任意中断的状态
- 提供软件方式设置或清除任意中断的挂起状态
- 中断使用中断号来标识
- 每个CPU接口可以处理多达1020个中断
(二)CPU接口
通过这些核心收到中断。该CPU接口主机寄存器屏蔽,识别和控制中断转发到内核。每个核心都有一个单独的CPU系统接口。
每个CPU接口提供如下编程接口:
- 使能通知ARM核中断请求
- 应答中断
- 指示中断处理完成
- 设置处理器的中断优先级屏蔽
- 定义处理器中断抢占策略
- 为处理器决定最高优先级的挂起中断
二、GIC中断控制器中断类型
GIC中断控制器中断类型分为三种:
(1)软中断(SGI)
软件生成的中断,软中断的产生是通过软件写入到一个专门的寄存器:软中断产生中断寄存器(ICDSGIR)。它常用在核间通信。软中断能以所有核为目标或选定的一组系统中的核心为目标。中断号0-15为SGI保留。
(2)专用外设中断(PPI):
这是由外设产生的,是专由特定核心处理的中断。中断号码16-31为PPI保留。这些中断源对核心是私有的,并且独立于其他核上相同的中断源,例如每个核上的定时器中断源。
(3)共享外设中断(SPI)
这是由外设产生的可以发送给一个或多个核心处理的中断源。中断号32-1020用于共享外设中断。
三、GIC中断控制器中断状态
GIC中断在不同的状态间切换:
(1)Inactive(无效) 中断没有发生。
(2)Pending(待处理) 这意味着中断已经发生,但等待核心来处理。待处理中断都作为通过CPU接口发送到核心处理的候选者。
(3)Active(正在处理) 中断发送给了核心,目前正在进行中断处理。
(4)Active and pending(处理和待处理) 一个中断源正进行中断处理而GIC又接收到来自同一中断源的中断触发信号。
四、GIC中断处理流程
当ARM核心接收到中断时,它会跳转到异常向量表中,PC寄存器获得对应异常向量并开始执行中断处理函数。 在中断处理函数中,先读取GIC控制器CPU接口模块内的中断响应寄存器(ICCIAR),一方面获取需要处理的中断ID号,进行具体的中断处理,另一方面作为ARM核心对GIC发来的中断信号的应答,GIC接收到应答信号,GIC分配器会把对应中断源的状态设置为Active状态。 当中断处理程序执行结束后,中断处理函数需要写入相同的中断ID号到GIC控制器CPU接口模块内的中断结束寄存器(ICCEOIR),作为给GIC控制器的中断处理结束信号。GIC分配器会把对应中断源的状态由Active设置为Inactive(如果在次中断处理过程中,又有相同中断触发,状态设置为Inactive and Pending)。同时GIC控制器CPU接口模块就可以继续提交一个优先级最高的状态为Pending的中断到ARM核心进行中断处理。一次完整的中断处理就此完成。