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.mzph.cn/news/617645.shtml

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

相关文章

Android开发基础(三)

Android开发基础(三) 本篇将介绍Android权限管理。 Android权限管理 Android权限管理主要是为了保护用户的隐私和设备的安全性; 在Android系统中,应用在请求权限时必须进行明确的申请,根据权限的保护级别&#xff0…

软件测试最新项目合集【商城、外卖、银行、金融等等.......】

​项目一:ShopNC商城 项目概况: ShopNC商城是一个电子商务B2C电商平台系统,功能强大,安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城,系统PC后台是基于ThinkPHP MVC构架开发的…

NAND新一代接口Separate Command Address (SCA) 简介

通过NAND Flash总线传输的信号分为三种类型:命令(Commands)、地址(Addresses)和数据(Data)。这些信号利用DQ[7:0]时间分时复用技术,在不同的时间段分别进行传输。其中,数…

BikeDNA(五)参考数据的内在分析1

BikeDNA(五)参考数据的内在分析1 该笔记本分析用户提供的给定区域的参考自行车基础设施数据集的质量。 质量评估是“内在的”,即仅基于一个输入数据集,并且不使用数据集外部的信息。 对于将参考数据集与相应 OSM 数据进行比较的外…

redis — redis cluster集群模式下如何实现批量可重入锁?

一、redis cluster 集群版 在Redis 3.0版本以后,Redis发布了Redis Cluster。该集群主要支持搞并发和海量数据处理等优势,当 Redis 在集群模式下运行时,它处理数据存储的方式与作为单个实例运行时不同。这是因为它应该准备好跨多个节点分发数据,从而实现水平可扩展性。具体能…

Java内存结构

前文: 《Java8之类的加载》 《Java8之类加载机制class源码分析》 写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数…

Ubuntu server配置ssh远程登录

使用如下命令进行安装 apt-get install ssh 安装好后启动 service ssh start 然后查看运行状态 然后用本机ping虚拟机 关闭本机和虚拟机防火墙 ufw disable 然后打开Xshell进行连接

14、MySQL高频面试题

1、内连接和外连接的区别 内连接和外连接都是数据库进行多表联查时使用的连接方式,区别在于二者获取的数据集不同 内连接指的是使用左表中的每一条数据分别去连接右表中的每一条数据,仅仅显示出匹配成功的那部分 外连接有分为左外连接和右外连接 左外…

重磅!OpenAI正式发布,自定义ChatGPT商店!

1月11日凌晨,OpenAI在官网正式发布了,自定义GPT商店,可以帮助用户找到目前最好用、流行的自定义ChatGPT助手。 在2024年第一季度,OpenAI将启动GPT 开发者收入计划。首先,美国地区的开发者将根据用户对其 GPT 的使用情…

day-07 统计出现过一次的公共字符串

思路 用哈希表统计words1和words2中各个字符串的出现次数&#xff0c;次数皆为1的字符串符合题意 解题方法 //用于存储words1中各个字符串的出现次数 HashMap<String,Integer> hashMap1new HashMap<>(); //用于存储words2中各个字符串的出现次数 HashMap<Stri…

小程序系列-5.WXML 模板语法

一、数据绑定 1、在 data 中定义页面的数据 动态绑定内容&#xff1a; 动态绑定属性&#xff1a; 2. Mustache 语法的格式 3. Mustache 语法的应用场景 4. 三元运算 5.算数运算 二、 事件绑定 1. 什么是事件&#xff1f; 2. 小程序中常用的事件 3. 事件对象的属性列表 4.…

Linux基础工具的使用(yum,vim,gcc,g++,gdb,make/makefile)【详解】

目录 linux软件包管理器-yum什么是软件包&#xff1f;查找软件包如何安装软件卸载软件 linux编辑器 - vimvim的基本概念vim模式之间的切换vim命令模式各命令汇总vim底行模式各命令汇总 Linux编译器 - gcc/ggcc/g的作用gcc/g选项预处理编译汇编链接静态库与动态库 Linux调试器 -…

详细分析Java中的@Transactional注解

目录 前言1. 基本知识2. 常用属性3. Demo4. 总结 前言 Transactional 是 Spring 框架中用于管理事务的注解。 该注解来源于Spring&#xff0c;对于Spring的基础知识可看我之前的文章&#xff1a; Spring框架从入门到学精&#xff08;全&#xff09; 该注解也可用在xxl-job框架…

自动化测试框架pytest系列之8个常用的装饰器函数

自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客 自动化测试框架pytest系列之21个命令行参数介绍(二)-CSDN博客 自动化测试框架pytest系列之强大的fixture功能&#xff0c;为什么fixture强大&#xff1f;一文拆解它的功能参数。(三)-CSDN博客 接上文 3.5 pytest的8…

Vant4在Vue3.3中如何按需导入组件和样式

前言 最近我在Vue 3.3的项目中对Vant4做按需导入时&#xff0c;尽管按照Vant4的官方指南进行操作&#xff0c;但样式仍然无法正确加载。经过深入研究和多篇文章的比较&#xff0c;我终于找到了在Vue3中如何正确的按需导入Vant 4组件和样式的方法。由于Vue3.3和Vant4相对较新&am…

多无人机编队避障(人工势场法)

matlab2020正常运行&#xff0c;预设编队类型&#xff0c;目标位置&#xff0c;障碍物 多无人机编队避障&#xff08;人工势场法&#xff09;资源-CSDN文库

浅析链表结构

一、单向链表 C语言中数组是常用的一种数据类型&#xff0c;但可惜数组长度是固定大小的&#xff0c;不能动态扩展&#xff0c;使用起来有时不是很方便。然后就有了自定义的动态数组结构&#xff0c;动态数组就比较好用了&#xff0c;长度可以任意扩展&#xff0c;但还有一个问…

easyexcel 3.0.x 版本实现指定列 锁定以及指定列隐藏

1&#xff1a;效果示例 2&#xff1a;代码示例&#xff1a; UnLockCell.java package com.example.juc.zhujie;/*** Author * Date Created in 2023/12/19 10:09* DESCRIPTION:* Version V1.0*/import java.lang.annotation.*;/*** 用于标记锁定哪些列不需要锁定* author 12…

【LangChain学习之旅】—(7) 调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?

【LangChain学习之旅】—&#xff08;7&#xff09; 调用模型&#xff1a;使用OpenAI API还是微调开源Llama2/ChatGLM&#xff1f; 大语言模型发展史预训练 微调的模式用 HuggingFace 跑开源模型申请使用 Meta 的 Llama2 模型通过 HuggingFace 调用 LlamaLangChain 和 Hugging…

若依在表格中如何将字典的键值转为中文

文章目录 一、需求&#xff1a;二、问题解决步骤1、给需要转换的列绑定formatter属性2、获取字典项3、编写formatter属性绑定的方法 一、需求&#xff1a; 后端有时候返回的是字典的键值&#xff0c;在前端展示时需要转成中文值 后端返回的是dictValue&#xff0c;现在要转换…