事件路由与中断聚合器:数百中断源如何汇聚、映射与绑核
更新时间:2026-09-19。前置:RISC-V PLIC、中断聚合 coalescing、GPIO 复用。外设数量增多后,中断源远多于中断控制器输入和 CPU 中断线,需要中间的事件路由/聚合层。
本文要回答的问题
- 成百上千个事件源如何汇聚到有限的 GIC/PLIC 输入?
- 「聚合(OR 合并)」和「独立映射」如何取舍?
- 怎么把中断路由到指定核、或作为 MSI 写入内存?
- 唤醒、安全分区和「聚合后辨不出源」有哪些坑?
一、层次位置
bash
外设事件源(成百上千)
├─ 每个源: raw status(W1C) / enable / set-clear ─┐
│ │
│ 事件路由/聚合器(Event Router / IRQ Aggregator)
│ ┌────────────────────────────────────────────┐
│ │ latch/同步 → 使能掩码 → 极性/边沿/电平配置 │
│ │ → 聚合(OR/MUX/FIFO) → 映射表(源→输出线/MSI) │
│ │ → 亲和/安全过滤 → 唤醒使能 │
│ └────────────────────────────────────────────┘
└────► GIC/PLIC 有限 SPI 线 或 MSI(写内存触发) ─► CPU 核PLIC/GIC(见 PLIC)解决「优先级+分发到 hart」,事件聚合器解决更前面的「源太多/分布在多个子系统/需要灵活映射与唤醒」。
二、每源的标准寄存器组
和通用 GPIO/中断模块一致(见 GPIO 去抖与中断),每个源通常有:
- RAW/STATUS:原始电平/锁存事件(W1C 清除)。
- ENABLE/MASK:是否参与输出。
- TYPE/POLARITY:电平/边沿、上升/下降/双沿配置。
- DEBOUNCE:低速输入去抖(见 GPIO 去抖)。
外部/跨子系统事件要先经两级同步避免亚稳;边沿事件必须在硬件锁存,否则窄脉冲可能在 CPU 响应前消失。
三、聚合方式
- OR 聚合(merged/汇总线):多个源经使能后「或」到一条输出。省线,但 CPU 被打断后必须遍历该组的 status 寄存器找出谁触发;多个源同时有效也要逐个清,不能漏。适合一组同类、低实时性源。
- 一对一映射(direct):每个(或每组)源独占一条 GIC/PLIC 输入,中断号即身份,响应快、可独立优先级/绑核,但线和控制器输入有限。
- FIFO/带 vector 聚合:事件带编号进入硬件 FIFO,输出一条中断,CPU 读 FIFO pop 出「源 ID + 时间戳」,既省线又能辨源、不丢并发事件,常用于高性能/多事件子系统(与中断聚合减少打断次数目的不同,见 中断 coalescing)。
- 可配置映射表:寄存器选择「源→输出线」,做 MUX/掩码,允许把关键源直连、其余汇总。
四、MSI/消息中断与绑核
- 现代 PCIe/网络/多核能把事件转成 MSI(Message Signaled Interrupt):事件发生时硬件对某内存地址执行一次写(写值=中断向量),由中断控制器或内存写转换成 CPU 中断。优点是无需大量物理中断线、向量多、天然可区分源。
- 亲和路由:映射表里带目标核/目标 cluster 字段,事件送到指定核(配合 GIC/PLIC 的 target/enable),实现网卡队列绑核、低延迟实时核专用等。
- 多个事件经 NoC/总线写入同一个聚合器时,要保证写顺序与状态原子(见 NoC、CHI)。
五、唤醒与安全
- 唤醒使能:低功耗时绝大多数源被门控,只有标记为「唤醒源」的事件经常开域(AON)路由去唤醒(见 低功耗模式);唤醒逻辑必须在常开电源/时钟域,不能被睡眠门控。
- 安全/虚拟化分区:聚合器按 TrustZone/VM 过滤源,安全世界事件不能被非安全软件屏蔽/清除,路由到安全中断(GIC group1/PLIC M-target)。
- 错误事件(ECC、时钟丢失等)常单独聚合到安全中断/不可屏蔽路径(见 时钟监控)。
六、常见的坑
- OR 聚合后不遍历状态:只处理一个源就退出,同组其他事件挂起,反复进中断。
- 边沿事件不锁存:窄脉冲在 CPU 响应前消失,丢中断。
- 清状态方式错:写 0/直接赋值误清并发源;应 W1C 或读清,见状态位约定。
- 跨域输入未同步:异步事件直接进寄存器,亚稳导致误触发/漏触发。
- 使能/清除顺序错:先使能未清旧状态,一开中断就进 ISR(残留事件)。
- 唤醒逻辑在可门控域:睡眠后事件路由本身被关,唤不醒。
- 聚合后无法辨源且高频:多个高频源挤一条线,CPU 大量轮询 status;应 FIFO 或直连。
- MSI 地址/数据配错:写到非中断控制器识别的地址,事件丢失。
- 多事件写竞争丢状态:同周期多源置位与 CPU 清除冲突,需要 set/clear 独立、原子。
- 安全分区泄漏:非安全软件可屏蔽安全源或读到安全事件。
- 电平/边沿配错:电平源未在设备侧撤销就返回,立即重入(对照 PLIC claim/complete)。
- 中断风暴/无节流:未做软件屏蔽或去抖,某源持续触发锁死 CPU。
相关与延伸
优先级分发见 RISC-V PLIC;本地定时见 CLINT;减少打断次数见 中断聚合;输入处理见 GPIO 去抖、CDC 同步。
总结
事件路由/中断聚合器处在成百上千外设源与有限 GIC/PLIC 输入之间,为每源提供同步、电平/边沿配置、W1C 状态和使能,再用 OR 汇总(省线但需遍历状态)、一对一直连(快且可辨但费线)、或带源 ID 的 FIFO/MSI(既省线又不丢并发)把事件经可配置映射表路由到指定输出线、指定核或写成 MSI 内存写;唤醒源必须走常开域、安全源按世界隔离——边沿不锁存、OR 后不遍历全部状态、清除顺序错误和唤醒逻辑被门控是四大丢中断/唤不醒根因。