当前位置: 首页 > news >正文

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

相关文章:

Linux 中断会产生嵌套吗?

文章目录 1. 前言2. Linux 中断是否会嵌套&#xff1f;2.1 分析背景2.2 中断处理抢占、嵌套可能性分析2.3 中断处理抢占、嵌套小结 3. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. …...

嵌入式ARM版本银河麒麟操作系统V10SP1安装OPenGauss数据库

前言&#xff1a; 官网提供了非常完整的openGauss安装步骤。 https://opengauss.org/zh/download/archive/列举一下个人的使用环境&#xff1a; 麒麟V10 rk3588工控板&#xff08;ARM&#xff09; openGauss-3.0.5&#xff08;极简版&#xff09;浏览一下官网&#xff0c;可以…...

深度学习八股文

Bert旨在通过联合左侧和右侧的上下文&#xff0c;从未标记文本中预训练出一个深度双向表示模型。因此&#xff0c;BERT可以通过增加一个额外的输出层来进行微调&#xff0c;就可以达到为广泛的任务创建State-of-the-arts 模型的效果&#xff0c;比如QA、语言推理任务。Bert的构…...

jquery 自整理

echarts官方&#xff1a;Documentation - Apache ECharts 1、CheckBox复选框 //选中事件&#xff08;页面点击&#xff09; $(#operateExit).on(ifChecked, function(){ $(input[name"operateExit"]).val(1); }); //非选中事件&#xff…...

MySQL | 加索引报错

报错信息 1170 - BLOB/TEXT column user_name used in key specification without a key length解决方案 分析 这个错误通常是因为尝试在一个包含BLOB或TEXT类型列的列上创建索引时没有指定键的长度。MySQL要求在使用BLOB或TEXT类型列作为索引键时&#xff0c;必须指定键的长…...

前端:自制年历

详细思路可以看我的另一篇文章《前端&#xff1a;自制月历》&#xff0c;基本思路一致&#xff0c;只是元素布局略有差异 ①获取起始位startnew Date(moment().format(yyyy-01-01)).getDay() ②获取总的格子数numMath.ceil(365/7)*7,这里用365或者366计算结果都是一样的371 …...

9.手写JavaScript大数相加问题

一、核心思想 找到两个字符串中最长的长度&#xff0c;对两个字符串在头位置补0达到相等的长度&#xff0c;相加时注意进位和类型转换&#xff0c;特别考虑当相加到第一位是如果仍然有进位不要忽略。此外&#xff0c;js中允许使用的最大的数字为 console.log("最大数&qu…...

FPGA开源项目分享——基于 DE1-SOC 的 String Art 实现

导语 今天继续康奈尔大学FPGA课程ECE 5760的典型案例分享——基于DE1-SOC的String Art实现。 &#xff08;更多其他案例请参考网站&#xff1a; Final Projects ECE 5760&#xff09; 1. 项目概述 项目网址 ECE 5760 Final Project 项目说明 String Art起源于19世纪的数学…...

通过 CLI 和引入的方式使用 React:基础入门

使用React 有两种使用方式&#xff0c;主要有以下几个原因: 灵活性和适应性: 引入的方式可以让开发者在现有的 HTML 页面中快速引入 React,无需设置完整的项目环境。这适合小型或原型项目。 CLI 方式则更适合用于构建大型复杂的 React 应用程序,因为它提供了更完整的项目结构和…...

第三资本:铸就辉煌非凡的资历

第三资本香港有限公司在在金融投资领域一直以专业精神和不懈追求获得良好名声,近几年在国际资本市场上更是写下了辉煌的章节。针对第三资本而言,专业是基本,也是成功的唯一途径。投资总监刘国海解释道:“金融从业者务必深入把握专业能力,对行业现状敏感,重视风险管控,才能在这个…...

基于激光雷达的袋装水泥智能装车系统有哪些优势?

激光雷达技术在水泥机械智能化中发挥着举足轻重的作用&#xff0c;特别在袋装水泥智能装车系统的应用中表现得尤为突出。 由因泰立科技精心打造的基于激光雷达的袋装水泥智能装车系统&#xff0c;不仅大幅缩短了装车码垛的时间&#xff0c;降低了工人的劳动强度&#xff0c;还显…...

实战自动化修改主机名

一、主程序 #!/bin/bash# 设置主机名为node01 set_hostname() {local new_hostname$1echo "正在设置主机名为 $new_hostname ..."# 使用hostnamectl设置主机名hostnamectl set-hostname $new_hostname# 检查主机名是否更改成功if [ "$(hostname)" "…...

无人机GB42590接收端 +接收端,同时支持2.4G与5.8G双频WIFI模组

严格按照GB42590的协议开发的发射端&#xff0c;通过串口和模块通讯&#xff0c;默认波特率 921600。 http://www.doit.am/首页-深圳四博智联科技有限公司-淘宝网https://shop144145132.taobao.com/?spma230r.7195193.1997079397.2.71f6771dJHT2r0 二、接口文档 单片机和模…...

PVE系统的安装

一.PVE系统的安装 前置准备环境:windows电脑已安装Oracle VM VirtualBox,电脑支持虚拟化,且已经开启,按住ctrl+shift+ESC打开任务管理器查看是否开启,如果被禁用,可进入BIOS开启虚拟化,重启电脑后再进行后续操作。本步骤选用windows10安装VirtualBox,版本为7.0.8。 …...

一辆汽车的节拍时间是怎样的?

节拍时间&#xff0c;又称 takt time&#xff0c;是德语中“节奏”的意思。在汽车制造业中&#xff0c;它指的是按照客户需求和生产计划&#xff0c;生产一辆汽车所需的时间。这个时间是固定的&#xff0c;它决定了生产线上每个工序的操作速度和节奏&#xff0c;是生产线上所有…...

数据结构-合并两个有效数组

题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;…...

华为2024年校招实习硬件-结构工程师机试题(四套)

华为2024年校招&实习硬件-结构工程师机试题&#xff08;四套&#xff09; &#xff08;共四套&#xff09;获取&#xff08;WX: didadidadidida313&#xff0c;加我备注&#xff1a;CSDN 华为硬件结构题目&#xff0c;谢绝白嫖哈&#xff09; 结构设计工程师&#xff0c;结…...

使用Pandas解决问题:对比两列数据取最大值的五种方法

目录 一、使用max方法 二、使用apply方法结合lambda函数 三、使用np.maximum函数 四、使用clip方法 五、使用where方法结合条件赋值 总结&#xff1a; 在数据处理和分析中&#xff0c;经常需要比较两个或多个列的值&#xff0c;并取其中的最大值。Pandas库作为Python…...

rk3588 安卓13 应用安装黑名单的接口

文章目录 概述一、app应用安装黑名单核心代码二、app应用安装黑名单核心功能分析三、代码实战1.先导入所需要的包2.添加获取黑名单方法3.添加限制黑名单方法4.上层使用PS:查看当前黑名单 总结 概述 在13.0系统rom定制化开发中&#xff0c;客户需求要实现应用安装黑名单功能&am…...

Grafana数据库为MySQL

一、Grafana是一款流行的开源监控和数据可视化平台&#xff0c;它默认使用SQLite作为数据库引擎。然而&#xff0c;对于大型项目或者需要更高性能的场景&#xff0c;我们通常会选择使用MySQL作为Grafana的数据库。在本文中&#xff0c;我将向你介绍如何将Grafana的数据库从SQLi…...

【计算机考研】数据结构都不会,没有思路,怎么办?

基础阶段&#xff0c;并不需要过于专门地练习算法。重点应该放在对各种数据结构原理的深入理解上&#xff0c;也可以说先学会做选择题、应用题。 因为在考试中&#xff0c;大部分的算法题目&#xff0c;尤其是大题&#xff0c;往往可以通过简单的暴力解决方案得到较高的分数。…...

word文档显示异常,mac安装word字体:仿宋gb2312

因为mac没有gb2312字体&#xff0c;windows上word里显示的gb2312字体与排版&#xff0c;在mac上显示为黑体、排版也错乱了&#xff0c;得不到想要打印格式。 需要安装gb2312字体 下载&#xff1a;仿宋GB2312.zip 解压后双击安装得到&#xff1a;仿宋GB2312.ttf 放入word&…...

【运维】Ubuntu 配置DNS服务器

背景 异常表现 部分域名无法解析&#xff0c;表现为 ping ***.com 提示 ping: ***.com: No address associated with hostname尝试解决方案 采用 sudo vim /etc/resolv.conf编辑的形式&#xff0c;指定DNS解析服务器 原始内容如下&#xff1a; nameserver 127.0.0.53 opti…...

头歌-机器学习实验 第8次实验 决策树

第1关&#xff1a;什么是决策树 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务&#xff0c;你需要掌握决策树的相关基础知识。 引例 在炎热的夏天&#xff0c;没有什么比冰镇后的西瓜更能令人感到心旷神怡的了。现…...

Spring和Spring MVC和MyBatis面试题

面试题1&#xff1a;请简述Spring、Spring MVC和MyBatis在整合开发中的作用&#xff1f; 答案&#xff1a; Spring&#xff1a;是一个轻量级的控制反转&#xff08;IoC&#xff09;和面向切面&#xff08;AOP&#xff09;的容器框架。它提供了强大的依赖注入功能&#xff0c;…...

用vue3写一个AI聊天室

效果图如下&#xff1a; 1、页面布局&#xff1a; <template><div class"body" style"background-color: rgb(244, 245, 248); height: 730px"><div class"container"><div class"right"><div class"…...

photomaker:customizing realistic human photos via stacked id embedding

PhotoMaker: 高效个性化定制人像照片文生图 - 知乎今天分享我们团队最新的工作PhotoMaker的技术细节。该工作开源5天Githubstar数已过6千次&#xff0c;已列入Github官方Trending榜第一位&#xff0c;PaperswithCode热度榜第一位&#xff0c;HuggingFace Spaces趋势榜第一位。项…...

FFmpeg - 如何在Linux上安装支持CUDA的FFmpeg

FFmpeg - 如何在Linux(Ubuntu)上安装支持CUDA的FFmpeg 笔者认为现在的很多“xx教程”只讲干什么不讲为什么&#xff0c;这样即使报错了看官也不知道如何解决。 在安装过程的探索部分会记录我的整个安装过程以及报错和报错的解决办法。 在省流之一步到位的方法部分会省去安装过…...

新火种AI|商汤发布下棋机器人元萝卜,率先深入家庭场景。

作者&#xff1a;小岩 编辑&#xff1a;彩云 如今提及生成式AI&#xff08;AIGC&#xff09;&#xff0c;已经不算什么新鲜产物了。自2014年GAN神经网络出现&#xff0c;2017年Transformer架构演进&#xff0c;再加上2023年ChatGPT的大火&#xff0c;无不说明生成式AI正在有条…...

CSS实现三栏自适应布局(两边固定,中间自适应)

绝对定位的元素会脱离文档流&#xff0c;它们是相对于包含块&#xff08;通常是最近的具有相对定位、绝对定位或固定定位属性的父元素&#xff09;进行定位的。当你把一个绝对定位的元素的高度设置为100%时&#xff0c;它会相对于其包含块的高度来确定自己的高度。如果包含块是…...