Linux中断 -- 中断应答、嵌套、

接上文,本文继续介绍Linux软件部分逻辑。

参考内核版本:kernel-4.19

目录

1.中断信号在各级中断控制器中的应答

2.supports_deactivate_key意义

3.中断嵌套


1.中断信号在各级中断控制器中的应答

        本章主要从内核软件层面来看各中断控制器对中断信号处理&应答(关于硬件层面的处理硬件过程可以参考前文)。同样使用前文中GICv3 & PIO 中断控制器为硬件框架,介绍PIO接受到外部中断时软件层各控制器的应答(文中设定supports_deactivate_key 为false)。

        如下图触发中断(EL1 、SPI类型)后软件通过操作硬件中断控制器对中断应答操作(卷尺框图):

        #1.读取GICv3中断控制器的IAR(中断应答寄存器)获取GIC的硬件中断号

        #2.通过PIO中断控制器mask&ack对应中断;

        #3.通过PIO中断控制器unmask对应中断;

        #4.操作GICv3中断控制器EOI寄存器,标记该GIC中断为deactivted并回退GIC的中优先级

从 #2、#3代码上逻辑上看一推出:

        a.因在执行该中断的处理handle时,PIO中断控制器上mask该中断故认为该中断在该CPU不               能实现中断嵌套;

        b.对于GIC已经通过IAR寄存器响应了来自PIO的中断,则处理该中断的CPU不能相应低于PIO            中断优先级的中断;

2.supports_deactivate_key意义

        supports_deactivate_key 是用指示GIC采用 ICC_CTLR_ELn.EOImode的形式(mode0或者mode1),值为true时表示采用mode1即EOI寄存器被置位时只是回退到该中断处理的前的优先级、需要再操作DIR寄存器将当前中断状态切换到非激活状态,值为false时表示采用mode0即操作EOI寄存器就会完成优先级回退和切换该中断到非激活状态。GICv3的驱动代码可以明确体现上述逻辑:

static void gic_cpu_sys_reg_init(void)
{…if (static_branch_likely(&supports_deactivate_key)) {/*当supports_deactivate_key使能时配置为EOI为mode1形式*/gic_write_ctlr(ICC_CTLR_EL1_EOImode_drop);} else {/*当supports_deactivate_key使能时配置为EOI为mode0形式*/gic_write_ctlr(ICC_CTLR_EL1_EOImode_drop_dir);}…
}

        supports_deactivate_key的值与hyp mode(Arm的虚拟化模式),默认值为ture当判定hyp mode未使能时则设置该置为false。代码逻辑如下:

static int __init gic_init_bases(void __iomem *dist_base,struct redist_region *rdist_regs,u32 nr_redist_regions,u64 redist_stride,struct fwnode_handle *handle)
{…/*hyp mode未使能,设置supports_deactivate_key为false*/if (!is_hyp_mode_available())static_branch_disable(&supports_deactivate_key);/*supports_deactivate_key值为true时,表示EOL & Deactivate 分开处理*/if (static_branch_likely(&supports_deactivate_key))pr_info("GIC: Using split EOI/Deactivate mode\n");…
}
3.中断嵌套

         据说是从kernel-2.6.34开始不支持。其实内核中有很多代码都可以证明不支持中断嵌套处理逻辑,如下便是一例作证:

static int __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
{/**  request_irq() -> __setup_irq()*  如下当irq设置 IRQ_NESTED_THREAD 支持嵌套中断属性时,如果注册的中断处理无thread_fn*  函数时支持返回中断注册EINVAL错误.*  如果有注册thread_fn则将中断handle处理函数设置为irq_nested_primary_handler,*  因为irq_nested_primary_handler函数直接返回IRQ_NONE,则thread_fn也无法得到执行。*  故支持中断嵌套处理的函数不能得到处理,所以Linu内核不支持嵌套中断。*//** Check whether the interrupt nests into another interrupt* thread.*/nested = irq_settings_is_nested_thread(desc);if (nested) {if (!new->thread_fn) {ret = -EINVAL;goto out_mput;}/** Replace the primary handler which was provided from* the driver for non nested interrupt handling by the* dummy function which warns when called.*/new->handler = irq_nested_primary_handler;...
}

        另外从处理器硬件层面也限制了中断嵌套处理的可能。如下ARM异常处理的文档中描述:当处理器捕获到异常并进入异常处理状态时,该处理器的PSTATE.DAIF中断掩码被自动设置,也是说该处理不能再响应对应的异常处理。当完成异常处理时,系统通过调用eret指令完成PSTATE状态和被中断指令地址的恢复,即同时恢复了PSTATE.DAIF状态,可能把当前处理器从异常中断状态恢复出来。

        在系统进行IRQ异常处理的过程中,可能有局部使能或者关闭(local_irq_enable/local_irq_disable)当前CPU IRQ的行为,如:bottom half处理的softirq& tasklet处理过程,会使能当前CPU的IRQ但也会进行成对的关闭行为(这点符合局部对称的设计要要求);但因为softirq阶段有短暂的使能本地中断行为,所以在中断的bottom half阶段可能有高优先级的中断被路由到当前CPU导致中断嵌套。

        总结:当前内核不支持top half阶段的中断的嵌套,支持bottom half阶段的中断嵌套。

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

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

相关文章

【python,机器学习,nlp】RNN循环神经网络

RNN(Recurrent Neural Network),中文称作循环神经网络,它一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之间的关系特征,一般也是以序列形式进行输出。 因为RNN结构能够很好利用序列之间的关系,因此针对自…

面试算法119:最长连续序列

题目 输入一个无序的整数数组,请计算最长的连续数值序列的长度。例如,输入数组[10,5,9,2,4,3],则最长的连续数值序列是[2,3,4,5],因此…

【信息安全】hydra爆破工具的使用方法

hydra简介 hydra又名九头蛇,与burp常规的爆破模块不同,hydra爆破的范围更加广泛,可以爆破远程桌面连接,数据库这类的密码。他在kali系统中自带。 参数说明 -l 指定用户名 -L 指定用户名字典文件 -p 指定密码 -P 指…

Jenkins 问题

从gitlab 仓库拉去代码到Jenkins本地报错 ERROR: Couldn’t find any revision to build. Verify the repository and branch configuration for this job. 问题原因: 创建条目》配置的时候,gitlab仓库不存在master分支 修复后:

x-cmd pkg | czg - git commit 智能生成工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 czg 源于 commitizen/cz-cli 交互插件中 cz-git 的延伸项目,重新使用 TypeScript 编写的零依赖独立的 Node.js 命令行工具。旨在使用交互友好的方式,辅助用户生成规范的 git commit message 约…

如何解决NAND系统性能问题?-- NAND接口分类

三、NAND接口 NAND闪存接口是连接主机控制器与NAND存储芯片的通信桥梁,负责命令、地址和数据的传输。典型的NAND闪存接口包括一组I/O线(通常为8条或更多)用于数据传输,以及若干控制信号线。 基本接口信号: Chip Enable…

如何一键添加引号和英文逗号,然后可以放入SQL中使用 → WHERE USER_NAME IN (‘张三‘,‘李四‘,‘王五‘)

如何一键添加引号和英文逗号,然后可以放入SQL中使用 → WHERE USER_NAME IN(张三,李四,王五) 一、背景二、解决方法三、一键添加引号和英文逗号的教程 一、背景 在日常开发中,当处理VARCHAR或VARCHAR2类型的字段时,很…

【自控实验】3. 带有饱和非线性环节控制系统相平面分析

本科课程实验报告,有太多公式和图片了,干脆直接转成图片了 仅分享和记录,不保证全对 实验内容: 有无非线性环节的相轨迹对比,并求超调量。 在输入单位阶跃信号Xsr时,用示波器观察和记录系统输入饱和非线…

电子学会C/C++编程等级考试2020年12月(三级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:完美立方 形如 a^3= b^3 + c^3 + d^3的等式被称为完美立方等式。例如 12^3= 6^3 + 8^3 + 10^3 。 编写一个程序,对任给的正整数 N (N≤100),寻找所有的四元组 (a, b, c, d),使得 a^3= b^3 + c^3 + d^3 ,其中 a,b,c,d均大于 11, …

NVMe-oF 1.1规范:多路径、非对称命名空间和NVMe/TCP

提到NVMe over Fabric,我就会想到它的几种应用场景: 1、 存储阵列到主机的网络连接(替代FC、iSCSI等); 2、 服务器、本地NVMe存储解耦(跨机箱/JBOF),SSD存储资源池化共享&#xff…

高压消防泵:科技与安全性的完美结合

在现代社会,随着科技的不断发展,各种高科技设备层出不穷,为我们的生活带来了极大的便利。在森林火灾扑救领域,恒峰智慧科技研发的高压消防泵作为一种高效、节能、绿色、环保的优质设备,将科技与安全性完美地结合在一起…

科技云报道:“存算一体”是大模型AI芯片的破局关键?

科技云报道原创。 在AI发展历史上,曾有两次“圣杯时刻”。 第一次发生在2012年10月,卷积神经网络(CNN)算法凭借比人眼识别更低的错误率,打开了计算机视觉的应用盛世。 第二次是2016年3月,DeepMind研发的…

20240112-【UNITY 学习】实现第一人称移动教程

1、创建一个空物体,挂载Rigidbody组件,并设置相应参数 2、在上述空物体下创建一个胶囊体,两个空物体,一个用来控制朝向,另一个用来控制摄像机 3、给摄像机创建一个父物体,并挂载脚本MoveCamera_01.cs using…

MySQL面试题 | 03.精选MySQL面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

DNS域名解析以及操作流程

dns:将域名转化为IP地址的过程,域名方便人们记忆,ip地址过长,且都是数字,不方便记忆,所以才出现了域名。 怎么实现访问域名等于访问ip地址 1.老方法:写入文件里 /etc/hosts 左边 IP地址 右边域名 格式例…

Jenkins配置发邮件

Jenkins配置发邮件 账号设置 首先这个邮箱账号要支持发邮件,QQ邮箱开通SMTP即可之后要认证 企业微信邮箱 开启IMAP/SMTP服务开启POP/SMTP服务 无论是企业微信邮箱还是QQ邮箱都是SSL协议,在下面的配置中我都会勾选上!!&#xff0…

深入理解UML中的继承关系

深入理解UML中的继承关系 在面向对象的设计中,继承关系是构建清晰、可维护系统的关键。统一建模语言(UML)提供了一种标准化的方法来可视化这些关系。本文将深入探讨UML中的继承关系,并探讨它如何在代码中体现。 什么是继承关系&a…

sqlilabs第五十一五十二关

Less-51(GET - Error based - ORDER BY CLAUSE-String- Stacked injection) 手工注入 源码 单引号闭合用注释(没有后续输出只能堆叠注入) 自动注入 和上一关一样 Less-52(GET - Bind based - ORDER BY CLAUSE-numeric- Stacked injection) 手工注入 数字类型 不用注释直接…

iOS UI掉帧和卡顿优化解决方案记录

UI卡顿原理 在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行…

C#核心--实践小项目(贪吃蛇)

C#核心实践小项目 -- 贪吃蛇 必备知识点--多脚本文件 (可观看CSharp核心--52集进行了解) 必备知识点--UML类图 必备知识点--七大原则 贪吃蛇 项目展示 控制方向的是:WSAD 确定键是:J 需求分析(UML类图&#xff09…