Linux 中断会产生嵌套吗?

文章目录

  • 1. 前言
  • 2. Linux 中断是否会嵌套?
    • 2.1 分析背景
    • 2.2 中断处理抢占、嵌套可能性分析
    • 2.3 中断处理抢占、嵌套小结
  • 3. 参考资料

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. Linux 中断是否会嵌套?

2.1 分析背景

本文基于 ARMv7 架构,Linux 4.14 内核进行分析。

2.2 中断处理抢占、嵌套可能性分析

ARMv7 架构下的 IRQ 中断处理流程概要如下(使用 GICv2 中断芯片):

/* arch/arm/kernel/entry-armv.S *//** Interrupt dispatcher*/
vector_stub irq, IRQ_MODE, 4 /* vector_irq */.long __irq_usr   @  0  (USR_26 / USR_32).......long __irq_svc   @  3  (SVC_26 / SVC_32).......align 5
__irq_svc:// 保存被中断的上下文,切换到 SVC 模式复用内核栈svc_entry// 中断处理irq_handler...// 恢复被中断的上下文, 使能 CPU 中断,同时从中断返回svc_exit r5, irq = 1   @ return from exception
ENDPROC(__irq_svc)/** Interrupt handling.*/
.macro irq_handler
#ifdef CONFIG_MULTI_IRQ_HANDLER// GICv2 芯片中断处理接口ldr r1, =handle_arch_irq /* r1 = gic_handle_irq() */mov r0, spbadr lr, 9997fldr pc, [r1]
#elsearch_irq_handler_default
#endif
9997:.endm

在一进步描述之前,必须先说明一个很重要的事实:ARMv7 架构 CPU ,在进入中断模式的时候,会自动禁用当前 CPU 上中断,这是硬件自动完成的,无需软件干预。也就是说,当前的代码时工作在 CPU 中断禁用的状态下。继续看后续中断处理流程:

gic_handle_irq() /* drivers/irqchip/irq-gic.c */.../** 这个循环试图一次处理多个中断, 而不是每次中断都从 CPU 的* 中断向量地址重新开始执行, 这是 GIC 对中断处理的一个优化。*/do {/** 读取硬件中断号.* 从寄存器 GIC_CPU_INTACK 读取硬件中断号, GIC 认为 CPU 响应了中断.*/irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK);...if (likely(irqnr > 15 && irqnr < 1020)) { /* 处理 PPI, SPI */if (static_key_true(&supports_deactivate))// EOI mode 1: Priority drop 和 Deactive 分离// 这里 GIC 做 Priority drop,目的是允许同等优先级的中断进来writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);handle_domain_irq(gic->domain, irqnr, regs);isb();continue; /* 继续处理下一中断, 可以避免反复的中断上下文切换 */}if (irqnr < 16) { /* 处理 SGI */// 这里不细表,不影响本文分析的主题......}}  while (1);;
handle_domain_irq(gic->domain, irqnr, regs);__handle_domain_irq(domain, hwirq, true, regs)irq_enter();__irq_enter();...// 标示在硬件中断处理过程中,即 top halfpreempt_count_add(HARDIRQ_OFFSET);...#ifdef CONFIG_IRQ_DOMAINif (lookup)irq = irq_find_mapping(domain, hwirq); /* 查找 硬件中断号 @hwirq 对应的 Linux 中断号 */#endifgeneric_handle_irq(irq); /* 中断处理 */struct irq_desc *desc = irq_to_desc(irq);...generic_handle_irq_desc(desc);desc->handle_irq(desc);handle_fasteoi_irq(desc) // 处理 SPI 中断......irq_exit(); /* 软中断, RCU 等等处理 */
handle_fasteoi_irq(desc) // 处理 SPI 中断...handle_irq_event(desc); // 调用具体的中断 handler, 我们不关注这里的细节...cond_unmask_eoi_irq(desc, chip);...chip->irq_eoi(&desc->irq_data);gic_eoimode1_eoi_irq()...// 这里是关注的重点。// 在前面 gic_irq_handler() 的处理逻辑里面,已经做了 // Priority drop,使得同等优先级的中断可以进来;在这里,// 做 Deactive interrupt,使得中断状态由 Active 转为// Idle 状态。到此,GIC 将能够重新向 CPU 发送中断信号了。// 从前面的分析中,我们了解到,CPU 的中断此时处于禁用状态,// 只等 CPU 重新启用中断,就能够收到 GIC 发给它的中断信号。writel_relaxed(gic_irq(d), gic_cpu_base(d) + GIC_CPU_DEACTIVATE);......

handle_fasteoi_irq() 的流程告诉我们,在调用完中断 handler 后,GIC 已经能够发送中断信号给 CPU 了,只等 CPU 重新启用中断,就可以接收中断信号了。接着看 handle_fasteoi_irq() 之后的中断退出流程,主要是 irq_exit()

irq_exit() /* kernel/softirq.c */...// 标示退出硬件中断处理过程,即退出 top halfpreempt_count_sub(HARDIRQ_OFFSET);// 这里 !in_interrupt() 判定,在 ARMv7 下,实际等同于 !in_softirq(),// 防止在 中断抢占、嵌套下的 softirq 处理过程 (bottom half) 的重入.if (!in_interrupt() && local_softirq_pending())invoke_softirq(); // 处理 softirq ,即进入 bottom half...

这里的 !in_interrupt() 判定要重点关注下,先看下它的定义:

#define softirq_count() (preempt_count() & SOFTIRQ_MASK)
#define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \| NMI_MASK))#define in_softirq()  (softirq_count())
#define in_interrupt()  (irq_count())

看到了吧,在不支持 NMI 的 ARMv7 架构下,随着 preempt_count_sub(HARDIRQ_OFFSET);HARDIRQ 的计数归 0,此处的 !in_interrupt() 已经等同于 !in_softirq(),目的是防止在中断抢占、嵌套下的 softirq 处理过程 (bottom half) 的重入。这里提前做出结论会发生 中断抢占、嵌套,有点提前,后面会分析原因。继续看中断退出接下来的流程:

invoke_softirq(); // 处理 softirq ,即进入 bottom half...__do_softirq();...pending = local_softirq_pending(); /* 读取当前 CPU 挂起的 softirq 事件 */...__local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); /* 禁用 softirq (禁用 bottom half) */...restart:	set_softirq_pending(0); /* 清除当前 CPU 挂起的 softirq *//* * 重点来了,CPU 中断启用了,同时从前面分析看到,GIC 也准备好了, * 所以 CPU 可以接收中断了;同时,别忘记,我们此时还处在当前中断* 处理上下文中!!! 如果在处理 softirq 期间 CPU 上发生了中断,是* 会产生中断抢占、嵌套的。*/local_irq_enable();h = softirq_vec;while ((softirq_bit = ffs(pending))) {// softirq 处理,不是本文重点,不做细表...}// 处理完 softirq 后,重新禁用 CPU 中断,这和汇编代码中重启 CPU 中断对应local_irq_disable();...__local_bh_enable(SOFTIRQ_OFFSET); /* 使能 softirq (使能 bottom half) */...

2.3 中断处理抢占、嵌套小结

从上面分析我们知道,中断抢占、嵌套,在 Linux 内核下是可能发生的,不过这些 中断抢占、嵌套 的发生大概率是合理且无害的。为什么呢?首先,中断的抢占、嵌套,是不可能发生在中断处理 top half 部分的,因为 top half 的处理期间,CPU 中断都是处于禁用状态,中断的抢占、嵌套只可能发生在 bottom half(即 softirq 处理期间);其次,通过 !in_interrupt() 限制了抢占、嵌套的中断,无法在前一中断处理 bottom half 期间,再次进入 bottom half,这样就避免中断内核栈溢出的风险;最后,由于 CPU 进入中断处理时自动禁用了中断,所以抢占、嵌套的中断处理期间,在有前一中断处理 bottom half(即 softirq) 前提下,不会在中途使能 CPU 中断,这样就避免了中断反复嵌套的问题。发生嵌套后,后续中断必定是一个接一个的串行处理,简单来讲,中断嵌套最多只会有两重:第一个中断 bottom half 期间被中断,第二个抢占、嵌套中断进来。当然,这一切的前提是,中断内核栈空间能够满足这两重中断嵌套的使用。另外,说大概率无害,是因为中断的抢占、嵌套,仍然有可能导致 bottom half(即 softirq) 处理的延迟,毕竟它们中断了正在处理 softirq

3. 参考资料

[1] Interrupts

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/809603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拥塞控制相关总结

拥塞控制概念 网络拥塞&#xff1a;当某个阶段&#xff0c;网络中涌入大量数据包时&#xff0c;可能会导致路由器的转发不及时&#xff0c;大量数据包会陆续填满路由器的缓冲区&#xff0c;缓冲区满了&#xff0c;再涌入数据时就会造成数据的丢失&#xff0c;这时网络发生了拥塞…

hexo接入github Discussions评论系统

评论存储仓 可以是你的博客项目的(github)仓库&#xff0c;也可以单独新建一个评论存储仓库。 我的博客项目在gitee上&#xff0c;就以新建存储仓为例&#xff1a; 使用Discussions评论系统必须开通Discussions模块&#xff01; 安装giscus插件 https://github.com/apps/…

如何在香橙派AIpro开发板升级CANN软件包

香橙派AIpro开发板是香橙派联合昇腾精心打造的高性能AI开发板&#xff0c;开发者可以基于昇腾CANN软件栈能力&#xff0c;快速构建AI应用和业务&#xff0c;实现图像、视频等多种数据分析与推理计算。在之前的文章中&#xff0c;我们已经了解了如何搭建开发环境&#xff0c;并基…

通过调用Vcenter-Api获取Vcenter中服务器信息

通过调用Vcenter-Api获取Vcenter中服务器信息 文章目录 通过调用Vcenter-Api获取Vcenter中服务器信息1. 获取Vmware API帮助文档2. 获取访问凭证3. 获取服务器清单4. 获取服务器更多信息5. 获取虚机更多信息6. 获取磁盘信息7. 获取操作系统相关 1. 获取Vmware API帮助文档 htt…

SHAP安装问题

一、安装 pip install shap -i https://pypi.tuna.tsinghua.edu.cn/simple 二、遇到问题 1、提示报错如下&#xff1a; ModuleNotFoundError: No module named numba.core 安装numba&#xff1a; pip install numba -i https://pypi.tuna.tsinghua.edu.cn/simple 提示已经…

FPGA核心板在声呐系统中的应用

前言 声纳系统使用声脉冲来探测、识别和跟踪水下物体。一个完整的声纳系统是由一个控制和显示部件、一个发射器电路、一个接收器电路和同时能作为发射装置&#xff08;扬声器&#xff09;和探测装置&#xff08;高灵敏度麦克风&#xff09;的传感器组成。 声纳系统图 技术挑战…

python爬虫----BeautifulSoup(第二十天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

Python初级笔记4 排序

冒泡排序 1. 算法步骤 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对。这步做完后&#xff0c;最后的元素会是最大的数。 针对所有的元素重复以上的步骤&#xff0c;除了最后一个。…

Linux/October

October Enumeration Nmap 扫描发现对外开放了22和80端口&#xff0c;使用nmap详细扫描这两个端口 ┌──(kali㉿kali)-[~/vegetable/HTB/October] └─$ nmap -sC -sV -p 22,80 -oA nmap 10.10.10.16 Starting Nmap 7.…

基于Springboot的笔记记录分享网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的笔记记录分享网站&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

华为OD技术面试-有序数组第K最小值

背景 2024-03-15华为od 二面&#xff0c;记录结题过程 有序矩阵中第 K 小的元素 - 力扣&#xff08;LeetCode&#xff09; https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/submissions/512483717/ 题目 给你一个 n x n 矩阵 matrix &#xff0c;其…

基于spring boot的班级综合测评管理系统

基于spring boot的班级综合测评管理系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开…

总分410+专业130+国防科技大学831信号与系统考研经验国防科大电子信息与通信工程,真题,大纲,参考书。

好几个学弟催着&#xff0c;总结一下我自己的复习经历&#xff0c;希望大家复习少走弯路&#xff0c;投入的复习正比换回分数。我专业课831信号与系统130&#xff08;感觉比估分要低&#xff0c;后面找Jenny老师讨论了自己拿不准的地方也没有错误&#xff0c;心里最近也这经常回…

蓝桥备赛——组合数、其他技巧

对字符串进行permutations排列组合 from itertools import permutations a abc #对字符串进行permutations排列组合 for i in permutations(a,3):x .join(i)print (x,end ) print (\n------------------------------------) permutations后面的参数&#xff0c;第一个表示…

【Python】探索 FunNLP:让自然语言处理更有趣

夜深了 我还为你不能睡 黎明前的心情 最深的灰 左右为难的你 不知怎样去面对 我能做的 只剩沉默 体会 爱情是让人沉溺的海洋 孤单的时候 想要去逃亡 转身的一瞬间 你出现在我身旁 你的眼泪 让我不敢开口讲 &#x1f3b5; 樊凡《我想大声告诉你》 简介&…

有趣的css - 动态雷达扫描

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是使用 css 实现一个动态的雷达扫描&#xff0c;快学起来吧&#xff01; 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码…

AI Safety与AI Security:探索共同点和差异(下)

上篇&#xff08;详细&#xff09;中&#xff0c;我们探讨了人工智能生态系统的完整性、保密性、可用性以及关于AI safety的一些热门话题&#xff0c;接下来我们将继续探讨AI Safety究竟是什么&#xff1f;以及AI Safety与AI Security的同、异。 1 AI Safety究竟是什么&#x…

[2024最新]MySQL-mysql 8.0.11安装教程

网上的教程有很多&#xff0c;基本上大同小异。但是安装软件有时就可能因为一个细节安装失败。我也是综合了很多个教程才安装好的&#xff0c;所以本教程可能也不是普遍适合的。 安装环境&#xff1a;win 10 1、下载zip安装包&#xff1a; MySQL8.0 For Windows zip包下载地…

.Net Core/.Net 6/.Net 8,一个简易的消息队列

.Net Core/.Net 6/.Net 8,一个简易的消息队列 身份验证接口身份验证接口实现program.cs通过api调用 做着玩的&#xff0c; 只实现了消息入队出队功能&#xff0c;没有持久化&#xff0c;也没有其它任何高级功能 直接上代码 public class AMQBase//:ISingleton {/// <summary…

ARM v8 Cortex R52内核 06 初始化 Initialization

ARM v8 Cortex R52内核 06 初始化 Initialization 6.1 初始化 Initialization Cortex-R52 处理器提供了一种机制&#xff0c;可以在复位时初始化所有程序员可见的复位&#xff0c;包括没有被架构定义重置值的寄存器。 在Cortex-R52处理器大多数架构寄存器&#xff0c;例如r0…