1.GICV3详解
本小节来自ARM手册
1.1 gic in architecture
GIC一般不是一个PE有一个,也不是一个簇有一个,而是一个SOC有一个。
1.2 GIC架构简史
特性 | GICv2手册 | GICv3手册 | GICv4手册 |
---|---|---|---|
支持的核心数 | 8 | 高达2 ^ 16 | 高达2 ^ 16 |
中断数量 | 支持1020个中断ID | 高达24位的中断ID | 高达24位的中断ID |
虚拟化支持 | 是 | 是 | 是 |
MSI | 是,带GICv2m | 是 | 是 |
系统寄存器支持 | 否 | 是 | 是 |
- GICv2:适用于较小规模的多核系统,支持基本的虚拟化和中断管理功能。gic400支持gicv2架构版本
- GICv3:大幅度提升了中断处理能力和核心支持数量,适用于更大规模的多核系统,增强了虚拟化支持。gic500和gic600支持gicv3架构版本
- GICv4:在 GICv3 的基础上进一步提升,支持虚拟中断的直接注入,优化了虚拟化性能,适用于高性能和高扩展性的虚拟化环境。gic700支持gicv4.1架构版本
2 中断基础
2.1 中断类型
GICv3定义了以下4种类型的中断:
- SPI(Shared Peripheral
Interrupt,共享外设中断),这是一个全局外设中断,可以路由到指定的PE,或一组PE中的一个。可传递给任何连接内核的外设中断。 - PPI(Private Peripheral Interrupt),私有外围中断)这是针对单个特定PE的外围中断。通用定时器的中断是
PPI的一个例子。 - SGI(Software Generated
Interrupt,软件生成中断)SGI通常用于处理器间通信,并通过写入GIC中的SGI寄存器产生。 - LPI(Locality-specific Peripheral
Interrupt,本地特定外设中断)LPI在GICv3中是新的,其编程模型与其他三种中断类型截然不同。特别是,LPI总是基于消息的中断,它们的配置保存在内存中的表中,而不是寄存器中。
2.1.1 中断标识符——中断号
每个中断源由一个ID号标识,称为INTID。可用的intid被分成不同的组,每个组被分配给一个特定类型的中断。
软件必须为每个 INTID 配置以下内容:优先级、安全模式、边缘触发或电平敏感、使能和不可屏蔽(Non-maskable)
2.1.2 中断是如何向中断控制器发出信号的
传统上,中断是用专用硬件信号从外设发送到中断控制器的,如下图所示。
GICv3 支持以上这种模式,另外还支持消息信号中断:消息信号中断(MSI)。如下图所示,MSI 基于消息的中断是通过写入中断控制器中的寄存器来设置和清除的中断。
在GICv3中,SPI可以是传统中断也可以是消息信号中断(MSI),但LPI始终是消息信号中断(MSI)。
不同的中断类型使用不同的寄存器,如表4所示。
表4
中断类型 | 寄存器 |
---|---|
SPI | GICD_SETSPI_NSR asserts an interrupt 、GICD_CLRSPI_NSR deasserts an interrupt |
LPI | GITS_TRANSLATER |
MSI vs 传统
传统的引脚中断方式
1、专用信号线:
每个中断源(外设)需要一根专用的信号线连接到中断控制器。
当外设产生中断时,通过这根信号线发送一个电信号(如电平变化)到中断控制器。
中断控制器通过检测这些信号线的状态变化来识别哪个中断源产生了中断。
2、硬件复杂性:
每增加一个中断源,需要额外的信号线。
对于具有大量中断源的系统,硬件设计变得非常复杂,因为需要大量的信号线和连接引脚。
消息传递方式(MSI)
1、基于消息的中断:
外设通过在主机内存中写入特定的数据来触发中断,这种写操作是通过标准的总线(如 PCIe 总线)进行的。
每个中断源不需要专用的物理信号线,只需要能够通过总线访问内存即可。
2、总线共享:
多个中断源可以共享同一条总线,通过写入不同的内存地址来区分不同的中断源。
消息传递方式利用了内存映射和总线通信,减少了对物理引脚的需求。
2. 2 中断状态机
中断控制器为每个SPI、PPI和SGI中断源维护一个状态机。这个状态机由四种状态组成:
- Inact