首页 > 运维 > linux运维 > 正文

Linux 中断子系统(三):中断处理知识点大全

星夢妙者
发布: 2025-06-25 11:34:01
原创
513人浏览过

linux 中,中断相关的节点和处理机制是系统管理中非常关键的一部分。以下是对这些节点和机制的详细说明:

/proc/interrupts

cat 这个节点会打印出系统中所有的中断信息。如果系统是多核 CPU,每个核的中断信息都会显示出来。具体信息包括:

  • 中断的名字
  • 中断号(IRQ number)
  • 每个中断的触发次数
  • 在哪个 CPU 核上处理的
  • 中断是边沿触发还是电平触发
  • 所属的中断控制器

/proc/irq/...

进入这个目录,你会看到以中断号命名的文件夹。每个中断号文件夹下包含几个节点,存储了该中断的相关信息,例如:

  • smp_affinity
  • affinity_hint
  • spurious

其中,smp_affinity 表示中断号与 CPU 之间的亲缘绑定关系。如果某个中断号绑定到一个特定的 CPU 核,那么这个中断就会一直在这个 CPU 上处理。

SMP IRQ Affinity

在 Linux 内核 2.4 及以后的版本中,支持将不同的硬件中断请求(IRQs)分配到特定的 CPU 上,这种绑定技术被称为 SMP IRQ Affinity。更多详细信息可以参考 Linux 内核源代码中的文档:linux-4.14/Documentation/IRQ-affinity.txt。

/proc/irq/{IRQ}/smp_affinity 和 /proc/irq/{IRQ}/smp_affinity_list

  • /proc/irq/{IRQ}/smp_affinity 指定给定的 IRQ 中断号允许哪些 CPU 执行。它是一个掩码位,例如 ff 代表 11111111,表示这个中断可以在 8 个 CPU 上执行,具体在哪个 CPU 执行由分配器决定。
  • 如果将 /proc/irq/{IRQ}/smp_affinity 设置为 00000001,则表示这个 IRQ 只能在最后一个 CPU 核上处理,其他 CPU 不允许处理。

手动设置的串口值在重启后会消失,可以通过代码中的 irq_set_affinity 函数,指定中断的掩码,以达到将某个中断固定在某个 CPU 处理的需求。

中断分发机制

对于 GIC-V2 而言,SPI(Shared Peripheral Interrupt)的分发是根据 Distributor 中的 Interrupt Processor Targets Registers 来决定的。对于任何一个 SPI,其在某个 GICD_ITARGETSRn 寄存器中有 8 个 bit 标识送达的 processor。如果只有一个 bit 被 set,那么 Distributor 就会将中断送到对应的 CPU interface,该中断最终会送达指定的 CPU。

如果该中断对应的 Interrupt Processor Targets Registers 中的那 8 个 bit 有多个 bit 被 set,Distributor 不会进行任何判断,而是根据这些 bit 的设定情况,将中断送往指定的一个或多个 processors。

可以参考 gic_set_affinity 函数,该函数确保一个中断的 Interrupt Processor Targets Registers 中的那 8 个 bit 只有一个 bit 被设定。

中断状态机

对于 GIC-V2,中断的状态机由 Distributor 维护,每个中断都有一个状态机:

  • Inactive:中断未激活(未发生)。
  • Pending:中断到达 GIC,等待 CPU 的处理。
  • Active:中断得到 CPU 的应答,中断被 CPU 处理。
  • Active and pending:某个中断正在被 CPU 处理,这时候该中断又来了。

示例

一个示例展示了两个外设中断 N 和 M 的处理过程,详细说明了中断状态机的变化和中断优先级的处理。

Linux 抢占机制

GIC 中断控制器支持中断优先级抢占,一个高优先级中断可以抢占一个低优先级且处于 active 状态的中断。GIC 仲裁单元会记录和比较当前优先级最高的 pending 状态,然后去抢占当前中断,并且发送这个最高优先级的中断请求给 CPU。

然而,CPU 不一定响应,因为在中断处理过程中,CPU 处于关中断状态,需要等低优先级中断处理完毕,直到发送 EOI 给 GIC,CPU 才会响应 pending 状态中优先级最高的中断进行处理。

在 Linux 中:

  1. 高优先级中断无法抢占正在执行的低优先级中断。
  2. 同处于 pending 状态的中断,优先响应高优先级中断进行处理。
  3. 同优先级且同是 pending 状态的中断,选择硬件中断号 ID 最小的一个发给 CPU。

Linux 中中断不允许嵌套,以防止中断大量爆发导致栈溢出。

中断与进程

中断可以打断进程的运行,任意一个中断的优先级都比所有的进程高。在中断处理过程中,主要是 GIC 和 CPU 的交互,即使 GIC 支持高优先级中断抢占正在执行的低优先级中断,但 CPU core 可以不处理,因为 Linux 中当 CPU core 执行中断处理时,是关中断和关抢占的状态,不再响应中断信号。

中断不允许休眠

中断上下文中不允许调用 schedule 函数,因为:

  1. 如果在中断上下文中调用 schedule,获取的 struct thread_info 数据结构是发生中断时该进程栈信息,而不是中断上下文调用 schedule 时的信息,导致无法返回中断上下文。
  2. 中断上下文处于关中断状态,需要发送 EOI 通知 GIC 中断处理结束,如果中途调用 schedule,整个系统的中断都会被屏蔽。

unhandled interrupt 和 spurious interrupt

在中断处理的最后,总会有一段代码来处理未处理中断和虚假中断。Linux 内核有一套复杂的机制来处理这类中断,可以通过命令行参数 noirqdebug 来控制开关该功能。

如果一个中断触发了 100,000 次,但有 99,900 次未被处理,Linux 内核会禁用该中断线。

相关的控制数据在中断描述符中,如下:

struct irq_desc {
    ...
    unsigned int        irq_count;        // 记录发生的中断的次数,每100,000则回滚
    unsigned long        last_unhandled;  // 上一次没有处理的IRQ的时间点
    unsigned int        irqs_unhandled;   // 没有处理的次数
    ...
}
登录后复制

中断的生命周期

中断的生命周期包括从中断触发到处理完成的整个过程,涉及中断的状态变化和处理机制。

Linux 中断子系统(三):中断处理知识点大全Linux 中断子系统(三):中断处理知识点大全Linux 中断子系统(三):中断处理知识点大全Linux 中断子系统(三):中断处理知识点大全Linux 中断子系统(三):中断处理知识点大全

以上就是Linux 中断子系统(三):中断处理知识点大全的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号