土法炼钢兴趣小组的算法知识备份

【操作系统百科】中断架构

文章导航

分类入口
os
标签入口
#interrupt#apic#msi#irq-desc#idt

目录

网卡收到包、磁盘完成 I/O、键盘按键——都通过中断通知 CPU。中断是 OS 与硬件对话的核心通道。

一、先看图

flowchart TD
    DEV[硬件设备] -->|MSI-X| APIC[Local APIC<br/>per-CPU]
    DEV -->|legacy INTx| IOAPIC[I/O APIC]
    IOAPIC --> APIC
    APIC --> IDT[IDT<br/>中断描述符表]
    IDT --> HANDLER[irq_desc → handler<br/>handle_irq]
    HANDLER --> HARDIRQ[hardirq 处理<br/>最小化工作]
    HARDIRQ --> SOFTIRQ[softirq / threaded<br/>延迟处理]

    classDef hw fill:#388bfd22,stroke:#388bfd,color:#adbac7;
    classDef sw fill:#3fb95022,stroke:#3fb950,color:#adbac7;
    class DEV,APIC,IOAPIC hw
    class IDT,HANDLER,HARDIRQ,SOFTIRQ sw

二、x86 中断路径

2.1 IDT(Interrupt Descriptor Table)

256 个条目:

2.2 Local APIC

每 CPU 一个 Local APIC:

2.3 I/O APIC

外部设备的 legacy 中断 → I/O APIC → 路由到目标 CPU 的 Local APIC。

三、MSI/MSI-X

现代设备(NVMe、网卡)使用 MSI/MSI-X:

优势:

四、irq_desc

struct irq_desc {
    struct irq_data irq_data;
    irq_flow_handler_t handle_irq;  // 控制器级 handler
    struct irqaction *action;        // 设备驱动 handler 链
    const char *name;
    // ...
};

每个 IRQ 号对应一个 irq_desc → 串联设备驱动注册的 handler。

五、中断处理流程

  1. 硬件触发 → APIC → CPU 跳转到 IDT entry
  2. 保存寄存器 → 调用 do_IRQ() / handle_domain_irq()
  3. 查找 irq_desc → 调用 handle_irq()(如 handle_fasteoi_irq
  4. 遍历 action 链 → 调用每个设备 handler
  5. handler 返回 IRQ_HANDLED / IRQ_WAKE_THREAD
  6. ACK 中断 → 恢复

六、IRQ affinity

# 查看 IRQ 分布
cat /proc/interrupts

# 设置 IRQ 23 只在 CPU 0-3 上处理
echo 0f > /proc/irq/23/smp_affinity

# irqbalance 自动平衡
systemctl status irqbalance

NVMe 多队列:每个 queue 绑定到不同 CPU → 避免跨核中断。

七、IPI

CPU 间通信用 IPI:

IPI 是最高优先级中断。

八、中断风暴

设备持续产生中断 → CPU 100% 在 hardirq 中 → 应用无法运行。

缓解:

九、ARM 中断

ARM 用 GIC(Generic Interrupt Controller):

设备树描述中断拓扑。

十、小结


参考文献

工具


上一篇形式化验证 下一篇softirq/tasklet/workqueue

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-04-27 · os

【操作系统百科】内存回收

Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。

2026-04-28 · os

【操作系统百科】交换

swap 还值得开吗?本文讲 swap area 基础、swap cache、zram 压缩内存、zswap 前端压缩池、swappiness 的真实含义、容器里的 swap 策略,以及为什么现代 Android 全靠 zram 不靠磁盘。

2026-05-03 · os

【操作系统百科】Slab/SLUB 分配器

buddy 只管页粒度(4K+),内核大多数对象只有几十到几百字节。slab/SLUB 在 buddy 之上做对象级缓存。本文讲 slab 历史、SLUB 接手、SLOB 退场、kmem_cache、per-CPU cache、KASAN 集成。

2026-05-07 · os

【操作系统百科】用户态分配器

glibc malloc、tcmalloc、jemalloc、mimalloc 各有哲学。本文讲 arena、thread cache、size class、madvise 返还策略、碎片与 RSS 膨胀、如何根据负载选分配器。


By .