ARM架构中断机制详解:SGI、PPI、SPI与LPI对比

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时,需要配置三个关键字段:

  1. Target List Filter(目标核过滤):

    • 0b00:发送给寄存器中指定的目标核
    • 0b01:发送给除当前核外的所有核
    • 0b10:发送给当前核自己
    • 0b11:发送给所有核
  2. CPU Target List(目标CPU列表):当Filter=00时,每个bit对应一个CPU(bit0=CPU0)

  3. 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的中断处理程序必须设计为可重入的,因为多个

内容推荐

已经到底了哦
已经到底了哦