持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
外围设备不是把中断请求直接发给处理器,而是发给中断控制器,由中断控制器转发给处理器。ARM公司提供了一种标准的中断控制器,称为通用中断控制器(Generic Interrupt Controller,GIC)。目前GIC架构规范有4个版本:v1~v4。GIC v2最多支持8个处理器,GIC v3最多支持128个处理器,GIC v3和GIC v4只支持ARM64处理器。
GIC硬件的实现形态有两种。
(1)厂商研发自己的ARM处理器,向ARM公司购买GIC的授权,ARM公司提供的GIC型号有:GIC-400、GIC-500和GIC-600。GIC-400遵循GIC v2规范,GIC-500和GIC-600遵循GIC v3规范。
(2)厂商直接向ARM公司购买处理器的授权,这些处理器包含了GIC。
从软件的角度看,GIC v2控制器有两个主要的功能块。
(1)分发器(Distributor):系统中所有的中断源连接到分发器,分发器的寄存器用来控制单个中断的属性:优先级、状态、安全、转发信息(可以被发送到哪些处理器)和使能状态。分发器决定哪个中断应该通过处理器接口转发到哪个处理器。
(2)处理器接口(CPU Interface):处理器通过处理器接口接收中断。处理器接口提供的寄存器用来屏蔽和识别中断,控制中断的状态。每个处理器有一个单独的处理器接口。
软件通过中断号识别中断,每个中断号唯一对应一个中断源。 中断有以下4种类型。 (1)软件生成的中断(Software Generated Interrupt,SGI):中断号0~15,通常用来实现处理器间中断(Inter-Processor Interrupt,IPI)。这种中断是由软件写分发器的软件生成中断寄存器(GICD_SGIR)生成的。
(2)私有外设中断(Private Peripheral Interrupt,PPI):中断号16~31。处理器私有的中断源,不同处理器的相同中断源没有关系,比如每个处理器的定时器。
(3)共享外设中断(Shared Peripheral Interrupt,SPI):中断号32~1020。这种中断可以被中断控制器转发到多个处理器。
(4)局部特定外设中断(Locality-specific Peripheral Interrupt,LPI):基于消息的中断。GIC v1和GIC v2不支持LPI。 中断可以是边沿触发(edge-triggered),也可以是电平触发(level-triggered)。边沿触发是在电压变化的一瞬间触发,电压由高到低变化触发的中断称为下降沿触发,电压由低到高变化触发的中断称为上升沿触发。电平触发是在高电压或低电压保持的时间内触发,低电压触发的中断称为低电平触发,高电压触发的中断称为高电平触发。 中断有以下4种状态。
(1)Inactive:中断源没有发送中断。
(2)Pending:中断源已经发送中断,等待处理器处理。
(3)Active:处理器已经确认中断,正在处理。
(4)Active and pending:处理器正在处理中断,相同的中断源又发送了一个中断。
中断的状态转换过程如下。
(1)Inactive -> Pending:外围设备发送了中断。
(2)Pending -> Active:处理器确认了中断。
(3)Active -> Inactive:处理器处理完中断。