0

0

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

星夢妙者

星夢妙者

发布时间:2025-06-25 11:34:01

|

616人浏览过

|

来源于php中文网

原创

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。

迅易年度企业管理系统开源完整版
迅易年度企业管理系统开源完整版

系统功能强大、操作便捷并具有高度延续开发的内容与知识管理系统,并可集合系统强大的新闻、产品、下载、人才、留言、搜索引擎优化、等功能模块,为企业部门提供一个简单、易用、开放、可扩展的企业信息门户平台或电子商务运行平台。开发人员为脆弱页面专门设计了防刷新系统,自动阻止恶意访问和攻击;安全检查应用于每一处代码中,每个提交到系统查询语句中的变量都经过过滤,可自动屏蔽恶意攻击代码,从而全面防止SQL注入攻击

下载

然而,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 中断子系统(三):中断处理知识点大全

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

5

2025.12.22

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

366

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

559

2023.08.10

go中interface用法
go中interface用法

本专题整合了go语言中int相关内容,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1345

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

698

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

293

2023.06.30

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
c语言项目php解释器源码分析探索
c语言项目php解释器源码分析探索

共7课时 | 0.3万人学习

Vue.js 微实战--十天技能课堂
Vue.js 微实战--十天技能课堂

共18课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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