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

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

/proc/interrupts

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

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

/proc/irq/...

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

smp_affinityaffinity_hintspurious

其中,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。

百度文心百中 百度文心百中

百度大模型语义搜索体验中心

百度文心百中 22 查看详情 百度文心百中

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

在 Linux 中:

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

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

中断与进程

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

中断不允许休眠

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

如果在中断上下文中调用 schedule,获取的 struct thread_info 数据结构是发生中断时该进程栈信息,而不是中断上下文调用 schedule 时的信息,导致无法返回中断上下文。中断上下文处于关中断状态,需要发送 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 中断子系统(三):中断处理知识点大全的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/483362.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何在 Java 中测试异常处理代码?
上一篇 2025年11月8日 12:25:38
一起学习Swoole的简单运用实现例子
下一篇 2025年11月8日 12:25:43

相关推荐

  • 如何解决MySQL安装时配置不生效的处理方法?

    如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?

    配置mysql时遇到配置不生效的问题,常见原因包括配置文件路径错误、语法问题、命令行参数覆盖及数据目录权限或初始化问题。1. 配置文件路径是否正确?mysql只会读取特定路径的配置文件,建议使用命令mysql –help | grep “default options&#82…

    2026年9月24日 用户投稿
    000
  • Linux如何搜索文件内容 grep命令实战技巧

    Linux如何搜索文件内容 grep命令实战技巧Linux如何搜索文件内容 grep命令实战技巧Linux如何搜索文件内容 grep命令实战技巧Linux如何搜索文件内容 grep命令实战技巧

    grep是linux中搜索文件内容的常用命令,掌握技巧可大幅提升效率。1.基本语法为grep “内容” 文件名,支持通配符和 -i 忽略大小写;2.使用 -r 可递归搜索目录内容,配合 –include、–exclude-dir 和 -l 能精准定位文…

    2026年9月24日 用户投稿
    200
  • VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧

    VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧

    vscode通过集成语言服务协议(lsp)、内置quick fixes和refactoring actions,并结合扩展如eslint、prettier等,实现代码自动修复与智能重构;2. 启用editor.formatonsave和editor.codeactionsonsave设置可在保存时自…

    2026年9月24日 用户投稿
    100
  • VSCode如何运行终端命令 VSCode内置终端的使用指南

    在VSCode里运行终端命令,最直接、最核心的方式就是利用它内置的集成终端。这玩意儿简直是开发者工作流的“心脏”,你可以在不离开编辑器界面的情况下,直接敲入并执行各种命令行操作,无论是跑测试、安装依赖,还是启动项目,都方便得要命。它把代码编辑和命令执行无缝衔接起来,大大减少了上下文切换的开销。 解决…

    2026年9月24日
    200
  • 解决AWS S3 PHP SDK中SSL连接失败问题:证书验证与文件句柄限制

    本文旨在帮助开发者解决在使用AWS S3 PHP SDK时遇到的SSL连接失败问题,错误信息包括“fopen(): SSL operation failed with code 5”和“certificate verify failed”。文章将深入分析错误原因,并提供修改php.ini配置,指定证…

    2026年9月24日
    200
  • 前端的设计模式系列-基本原则

    在完成对二十三个经典设计模式的讲解后,我们再来回顾一下一些基本原则,以便在日常开发中更好地理解和应用这些概念。 单一职责原则(SRP,Single Responsibility Principle)定义:一个类或模块应该有且仅有一个改变的原因。在 JavaScript 中,这更多地应用于对象和函数。…

    2026年9月24日
    200
  • 升级Windows 10/11出现0xC1900101错误怎么办?

    错误代码0xC1900101通常由驱动冲突、磁盘空间不足或系统文件损坏引起。1、通过设备管理器更新过时驱动;2、确保C盘有20GB以上空间并清除SoftwareDistribution文件夹;3、使用SFC和DISM命令修复系统文件;4、重置Windows Update相关服务为自动启动并重启服务。…

    2026年9月24日
    200
  • 宝塔面板使用`Navicat`或其他工具连接数据库

    宝塔面板使用`Navicat`或其他工具连接数据库宝塔面板使用`Navicat`或其他工具连接数据库宝塔面板使用`Navicat`或其他工具连接数据库宝塔面板使用`Navicat`或其他工具连接数据库

    在linux系统上配置环境确实可能有些复杂,因此许多用户选择安装一个可视化面板,如宝塔面板。然而,当使用sql管理工具如navicat连接数据库时,可能会遇到连接问题。以下是如何解决这些问题的详细步骤,以navicat为例。 果不其然,直接无法连接上。 首先,我们需要检查服务器是否开放了3306端口…

    2026年9月24日 用户投稿
    900
  • 基于属性配置动态创建 Spring Boot Bean

    本文介绍了如何在 Spring Boot 应用中基于配置属性的值动态创建 Bean。通过使用 @ConditionalOnProperty 注解,可以根据指定的属性是否存在以及其值来决定是否创建某个 Bean,从而实现灵活的配置和 Bean 的动态加载。本文将提供详细的代码示例和使用说明,帮助开发者…

    2026年9月24日
    100
  • Linux SSH配置文件sshd_config详解

    修改SSH配置可提升安全性与连接体验。1. Port 2222减少攻击;2. ListenAddress指定监听IP;3. Protocol 2禁用不安全的SSH-1;4. PermitRootLogin no禁止root直连;5. PasswordAuthentication no关闭密码登录;6…

    2026年9月24日
    100
  • 如何在Linux中处理只读文件系统?

    文件系统变只读主因是硬件故障或文件系统错误触发保护机制,需先用mount命令检查挂载状态,若显示ro则尝试remount,rw;2. 若失败应排查dmesg日志中的I/O错误,并在未挂载时用fsck修复文件系统;3. 使用smartctl检测磁盘健康,若硬盘已损坏需及时更换;4. 检查/etc/fs…

    2026年9月23日
    600
  • 如何在mysql中使用数值函数计算

    答案:MySQL数值函数用于执行数学运算,如ABS、ROUND、FLOOR、CEIL、MOD、POWER、SQRT等,可对数据直接计算。例如用ROUND四舍五入价格,TRUNCATE截断小数,FLOOR取整,MOD求余判断奇偶,SQRT开方,还可结合AVG、MAX等聚合函数使用,提升查询效率并减少应…

    2026年9月23日
    100
  • 如何在mysql中优化存储引擎参数

    优化MySQL存储引擎需根据业务场景调整参数。1. InnoDB:设innodb_buffer_pool_size为内存50%~70%,合理配置日志参数提升I/O性能,选用O_DIRECT减少缓存冲突,按磁盘性能设置io_capacity;2. MyISAM:分配足够key_buffer_size,…

    2026年9月23日
    100
  • 如何检测Linux网络丢包率 ping统计信息分析技巧

    如何检测Linux网络丢包率 ping统计信息分析技巧如何检测Linux网络丢包率 ping统计信息分析技巧如何检测Linux网络丢包率 ping统计信息分析技巧如何检测Linux网络丢包率 ping统计信息分析技巧

    使用ping命令检测linux网络丢包率时,应先看“% packet loss”数值,再分析rtt和mdev变化;排查问题需按步骤进行:1. ping 127.0.0.1确认系统是否正常;2. ping网关检查局域网或路由器问题;3. ping外网ip判断isp或中间路由问题;结合mtr/trace…

    2026年9月23日 用户投稿
    800
  • 如何在Linux中配置SELinux进行安全控制?

    SELinux通过强制访问控制提升Linux安全性,需掌握主体、客体、安全上下文和策略等概念;使用ls -Z和ps -Z查看上下文,通过/etc/selinux/config设置enforcing、permissive或disabled模式,临时切换用setenforce命令;管理文件上下文时可用r…

    2026年9月23日
    200
  • 如何预防单点故障?VIP高可用搭建解决步骤

    如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤

    单点故障是系统稳定性最大威胁,因为其一旦发生将导致服务瞬间瘫痪。解决核心在于消除“唯一”组件,通过构建高可用集群实现冗余备份。具体步骤包括:1. 使用虚拟ip(vip)配合keepalived工具实现自动漂移;2. 配置至少两台服务器组成集群并通过心跳机制监测状态;3. 设置track_script…

    2026年9月23日 用户投稿
    500
  • 为什么硬盘数据恢复不完整?如何提高数据完整性?

    硬盘数据恢复不完整主要因数据覆盖、物理损伤、文件系统损坏、加密问题及恢复软件局限所致;一旦发生数据丢失且伴随异响、无法识别等情况,应立即停止操作并寻求专业服务,因其具备无尘环境、专用设备与技术经验,可最大限度避免二次损伤并提升恢复成功率。 硬盘数据恢复不完整,这事儿说起来挺让人沮丧的,往往是数据在丢…

    2026年9月23日
    700
  • 检测 RecyclerView 列表末尾:实现滑动到底部触发事件

    本教程详细讲解如何在 Android 应用中准确检测 RecyclerView 是否已滑动到列表的末尾。通过利用 LinearLayoutManager 的 findLastVisibleItemPosition() 方法,结合列表总项数,可以有效判断用户是否已浏览至列表底部,从而触发加载更多数据或…

    2026年9月23日
    600
  • 如何查看Linux磁盘SMART信息 smartctl健康检测

    如何查看Linux磁盘SMART信息 smartctl健康检测如何查看Linux磁盘SMART信息 smartctl健康检测如何查看Linux磁盘SMART信息 smartctl健康检测如何查看Linux磁盘SMART信息 smartctl健康检测

    使用smartctl工具可有效查看linux系统下磁盘的smart信息。首先安装smartmontools包,在debian/ubuntu上用apt命令,在centos/rhel上用yum命令安装;接着检查磁盘smart状态,若未启用则手动开启;然后通过sudo smartctl -h /dev/s…

    2026年9月23日 用户投稿
    1100
  • 如何使用Flax训练AI大模型?JAX生态下的深度学习训练指南

    答案是使用Flax结合JAX的自动微分与XLA加速能力构建和训练大模型,通过Flax.linen定义模块化网络,利用JAX的jit、vmap、pmap实现高效训练,并借助optax优化器和orbax检查点工具完成完整训练流程。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 D…

    2026年9月23日
    300

发表回复

登录后才能评论
关注微信