1. 中断机制基础概念解析
计算机系统中,中断(Interrupt)是处理器与外部设备通信的核心机制之一。当某个事件发生时,硬件或软件会向处理器发送信号,促使处理器暂停当前任务,转而执行与该事件相关的特定程序(中断服务例程)。这种机制极大地提高了系统对突发事件的响应效率。
中断按照触发源可分为两大类:硬件中断和软件中断。硬件中断由外部设备触发,如键盘输入、磁盘I/O完成等;软件中断则通过特定指令(如x86的INT指令)主动发起。我们今天要重点讨论的SGI、PPI、SPI、LPI四种中断类型,是现代ARM架构中对于硬件中断的细化分类。
在ARM体系结构中,通用中断控制器(GIC)负责管理和分发所有中断。GICv2之后的版本将中断分为以下几类:
- 共享外设中断(SPI)
- 私有外设中断(PPI)
- 软件生成中断(SGI)
- 基于消息的中断(LPI)
每种类型在系统中有明确的定位和使用场景,理解它们的区别对系统编程和驱动开发至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SGI(Software Generated Interrupt)详解
2.1 SGI的基本特性
软件生成中断(SGI)是ARM架构中唯一完全由软件触发的中断类型,其ID范围为0-15。SGI的主要特点包括:
- 多核间通信:SGI最常见的用途是在多核处理器中实现核间中断(IPI)
- 无硬件依赖:完全通过写GICD_SGIR寄存器触发
- 目标核可选:可指定单个、多个或除自己外的所有核
- 边沿触发:所有SGI都是上升沿触发
在Linux内核中,SGI被广泛用于调度器唤醒、TLB刷新、RCU回调等需要核间协作的场景。例如当某个CPU需要通知其他CPU执行缓存一致性操作时,就会发送特定的SGI。
2.2 SGI的编程实践
通过GICD_SGIR寄存器发送SGI时,需要配置三个关键字段:
-
Target List Filter(目标核过滤):
- 0b00:发送给寄存器中指定的目标核
- 0b01:发送给除当前核外的所有核
- 0b10:发送给当前核自己
- 0b11:发送给所有核
-
CPU Target List(目标CPU列表):当Filter=00时,每个bit对应一个CPU(bit0=CPU0)
-
SGI INTID(中断号):0-15之间的数值
典型的内核代码示例(以GICv2为例):
c复制static void send_ipi(unsigned int cpu, unsigned int irq)
{
writel_relaxed((1 << (cpu + 24)) | (irq << 16),
gic_data_dist_base() + GIC_DIST_SOFTINT);
}
注意:SGI的中断处理程序必须设计为可重入的,因为多个
