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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 12:25:11
下一篇 2025年11月8日 12:25:54

相关推荐

  • Asp.net Core应用程序在Linux上部署的图文详解

    快两个月没接触.net,倒是天天在用linux,所以想尝试一下在linux运行喜欢的.net 应用。 安装CentOS 安装.Net core for Linux 创建Asp.net Core应用程序 安装Nginx 配置Nginx代理 1,安装CentOS系统 这个网上教程太多滤过。   2,安装…

    2025年12月17日 好文分享
    000
  • C++多线程编程On Linux

    POSIX多线程模型pthread.h函数: pthread_attr_t attr; //线程属性结构体,创建线程时加入的参数pthread_attr_init( &attr ); //初始化 pthread_attr_setdetachstate( &attr, PTHREAD_…

    2025年12月17日
    000
  • Linux 环境多线程编程基础设施

    本文介绍多线程环境下并行编程的基础设施。主要包括: volatile __thread Memory Barrier __sync_synchronize volatile 编译器有时候为了优化性能,会将一些变量的值缓存到寄存器中,因此如果编译器发现该变量的值没有改变的话,将从寄存器里读出该值,这样…

    好文分享 2025年12月17日
    000
  • XML中如何去除空节点_XML去除空节点的实用方法

    答案:可通过XSLT、Python脚本或命令行工具去除XML空节点。使用XSLT模板递归复制非空节点;Python的lxml库遍历并删除无文本、无子节点、无属性的元素;XMLStarlet命令行工具执行XPath表达式快速清理空标签,处理前需明确定义空节点并备份原文件。            &lt…

    2025年12月17日
    000
  • XML中如何解压XML字符串_XML解压XML字符串的操作方法

    先解压再解析XML。C#用GZipStream解压字节流并转字符串,Java用GZIPInputStream或InflaterInputStream读取压缩数据,结合StreamReader或BufferedReader还原为明文XML后,交由XDocument或DocumentBuilder解析;…

    2025年12月17日
    000
  • XML中如何转换XML编码格式_XML转换XML编码格式的方法与技巧

    正确识别并统一XML文件的编码声明与实际编码是解决解析错误的关键,可通过编辑器、命令行或编程方式(如Python脚本)进行转换,确保内容、声明和保存编码一致,避免乱码。 配合XSLT处理器(如Saxon),可实现内容转换的同时完成编码标准化。 基本上就这些。关键点是确保文件内容、XML声明、保存编码…

    2025年12月17日
    000
  • XML中如何验证XML Schema_XML验证XML Schema的操作方法

    答案:使用编程语言、命令行工具或IDE可验证XML文档是否符合XSD。Java通过JAXP加载Schema并校验;Python用lxml解析并验证;xmllint命令行工具支持快速检查;编辑器如VS Code、Oxygen可实时提示错误;需确保路径、命名空间和版本正确。 在XML中验证XML文档是否…

    2025年12月17日
    000
  • XML Schema数据类型有哪些?如何定义?

    XML Schema提供内置数据类型和自定义类型机制,用于约束XML文档结构。常见内置类型包括xs:string、xs:int、xs:date等,支持通过限制取值范围或枚举,如定义Gender枚举和Age范围;使用定义包含子元素和属性的复杂结构,如Person类型包含FirstName、LastNa…

    2025年12月17日
    000
  • XML中如何处理属性冲突_XML处理属性冲突的方法与技巧

    属性冲突源于多命名空间同名属性、重复定义或默认值与显式赋值矛盾,可通过命名空间前缀区分来源、XSD/Schema约束定义及解析时优先级规则有效避免。 在XML文档中,属性冲突通常发生在多个命名空间或重复定义的属性导致解析困难时。正确处理这些冲突对保证数据完整性和解析效率至关重要。 理解属性冲突的来源…

    2025年12月17日
    000
  • XML与SVG图像格式有何关系?如何嵌入?

    SVG是基于XML的矢量图形格式,使用XML标签定义图形元素,如圆形、矩形等,具有结构清晰、可读性强的特点。例如,一个蓝色圆的SVG代码即为符合XML语法的文本文件。在网页中,SVG可通过多种方式嵌入:1. 直接内联嵌入,便于样式和脚本控制;2. 使用img标签引用外部SVG文件,适用于静态图像;3…

    2025年12月17日
    000
  • RSS订阅如何过滤重复内容

    RSS去重核心是利用guid、link或内容哈希识别唯一性,结合已处理记录实现过滤。主流阅读器如Inoreader和Feedly通过后端比对guid/link进行自动去重;自建方案可用Python脚本解析RSS并以数据库存储条目标识,通过定时任务抓取新内容并生成去重后的输出流。 RSS订阅中遇到重复…

    2025年12月17日
    000
  • XML中如何批量添加属性_XML批量添加属性的方法与技巧

    使用Python脚本、XSLT、正则替换或命令行工具可高效批量添加XML属性。1. Python结合ElementTree遍历元素并用set()添加属性;2. XSLT通过模板匹配插入新属性,保留原格式;3. 文本编辑器正则查找替换适用于简单结构,查找替换为;4. xmlstarlet等命令行工具结…

    2025年12月17日
    000
  • XML标准化组织有哪些?W3C角色是什么?

    W3C是XML标准的源头和主导力量,于1998年发布XML 1.0规范,定义了XML语言基础并推动其发展;OASIS、ISO和IETF等组织在企业应用、国际标准对接和协议支持等方面协同扩展XML应用,共同促进结构化数据在Web和企业系统中的广泛使用。 在XML(可扩展标记语言)的发展和标准化过程中,…

    2025年12月17日
    000
  • XML数据库是什么?如何存储XML数据?

    原生XML数据库如eXist-db和BaseX直接存储XML层次结构,支持XPath/XQuery查询;关系数据库则通过XML字段或分解为表结构来管理XML数据,存储方式包括纯文本、分解、混合型和二进制序列化,选择需根据数据结构稳定性、查询需求和性能权衡。 XML数据库是一种专门设计用来存储、查询和…

    2025年12月17日
    000
  • XML格式的化学分子式标准

    XML格式的化学分子式标准优势在于结构化、可扩展和自描述性,便于数据交换与解析;通过定义XML Schema(XSD)可验证文件有效性,确保元素和属性符合规范;其在化学信息学中广泛应用于分子式、反应、性质及文献元数据的标准化表示与系统间共享。 XML格式的化学分子式标准,简单来说,就是一种用XML来…

    2025年12月17日
    000
  • XML Schema有何作用?如何定义XSD文件?

    XML Schema用于定义XML文档结构、元素、属性及数据类型,支持命名空间和复杂约束,通过XSD文件实现数据校验与规范。 XML Schema(XML 模式)用于定义 XML 文档的结构、元素、属性及其数据类型,确保 XML 内容符合预设规则。相比 DTD,XML Schema 支持数据类型、命…

    2025年12月17日
    000
  • XML中如何比较XML差异_XML比较XML差异的操作方法

    使用专业工具或编程方法可准确比较XML差异。推荐DiffDog、XMLSpy进行图形化对比,WinMerge配合插件实现免费开源比对;Python的ElementTree、Java的DOM解析器适用于自动化代码比对,需先格式化避免空白干扰;命令行可用xmlstarlet结合diff,git可通过.x…

    2025年12月17日
    000
  • XPath如何选择祖先节点? XPath遍历祖先节点的路径表达式详解

    XPath通过ancestor::和ancestor-or-self::轴选择祖先节点,前者选取所有上级节点,后者包含当前节点本身;结合谓词可精确筛选特定类型或层级的祖先,常用于定位深层嵌套元素的容器,但需注意性能开销与结构依赖性。 XPath选择祖先节点主要依赖于ancestor::和ancest…

    2025年12月17日 好文分享
    000
  • 什么是XML Encryption

    XML Encryption通过加密XML数据保障机密性,支持细粒度加密,利用CEK和KEK双重加密机制,结合和结构实现安全封装,并常与XML Signature协同使用以同时确保机密性、完整性和认证。 XML Encryption 是一种由万维网联盟(W3C)定义的技术标准,它允许我们对整个 XM…

    2025年12月17日
    000
  • RSS源如何推广?提交到聚合器方法?

    提交到主流聚合器是推广RSS源的关键,可通过Feedly、The Old Reader、Inoreader等平台增加曝光;确保RSS格式规范以提高收录成功率。在网站显眼位置放置标准RSS图标并链接至订阅地址,有助于用户手动订阅。结合社交媒体、邮件列表和开发者社区(如GitHub)宣传RSS源,可吸引…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信