Linux中断 -- 中断路由、优先级、数据和标识

目录

1.中断路由

2.中断优先级

3.中断平衡

4.Linux内核中重要的数据结构

5.中断标识


        承前文,本文从中断路由、优先级、数据结构和标识意义等方面对Linux内核中断进行一步的解析。

1.中断路由

Aset affinity flow

       GIC文中有提到SPI类型中断的路由控制器寄存器为GICD_IROUTER,设置该寄存器即配置了中断的路由方式。内核中irq_set_affinity_hint、__irq_set_affinity、irq_set_affinity_locked等都可以设置对应的中断的路由即affinity,以irq_set_affinity_hint为例来说明affinity设置的过程,对应代码流程中如上图。

        irq_set_affinity_hint 最终会调用到GIC的中的gic_set_affinity函数,通过该函数将系统需要设置的中断的affinity值设置到该中断对应的GICD_IROUTER寄存器;当该中断触发时GIC会根据该中断对应的GICD_IROUTER寄存器值,将该中断路由到指定的PE去处理。

        affinify值即CPU对应的MPIDR_EL1(关于MPIDR_EL1寄存器解释,看一查看另一文章 CSDARM处理器 -- ARM64 MPIDR_EL1寄存器-CSDN博客CSD),Linux系统中有多处记录该中断affinify值对应的cpu number,如上图的三处:

                irq_desc->affinity_hint    系统要设置的该中断可路由到的CPU,可以是某个特定的

                        CPU或者是CPU的集合,该CPU可以是unpluged state。

                irq_data->irq_common_data->effective_affinity    最终设置到该中断

                        GICD_IROUTER寄存器的affnity值对应的CPU,特定某个CPU,该CPU

                        是系统要设置的该中断可以路由的CPU集合的中的一个。

                irq_data->irq_common_data->affinity    同irq_desc->affinity_hint,系统要设

                        置的该中断可路由到的CPU。

        gic_set_affinity函数负责中断对应的GICD_IROUTER寄存器的最终设置。其中有两种设置方式:强制和非强制方式。强制方式时,会取系统要设置的可路由的CPU集合中第一个(有地位到高位)为1的bit所对应CPU的MPIDR_EL1值;非强制时,会取系统要设置的可路由的CPU集合中任意一个online CPU的MPIDR_EL1值。

2.中断优先级

        kernel-5.10内核,除虚拟化相关逻辑外,仅对NMI中断的处理优先级进行了配置,其他如SPI类型的中断都没有设置对应的中断优先级,即这些中断的优先级为GIC寄存器中的默认值0,这些SPI的中断具有相同的优先级,所以这些中断不存在中断竞态问题(关于中断竞态问题查看ARM处理器 -- 中断控制器GICv3_interrupt_routing_mode-CSDN博客 的3.4 运行优先级和竞态)。

                                                        ARM GICD_IPRIORITYn寄存器

3.中断平衡

        中断平衡服务运行在用户态,非内核态,目前高通方案中有此服务。对此不做详细介绍,感兴趣可参考该服务代码:

https://github.com/Irqbalance/irqbalance

4.Linux内核中重要的数据结构

如上图Linux内核中有两个重要的irq相关数据 :

        4.1  struct irq_desc irq_desc[NR_IRQS] 用于存放系统所有irq的中断描述符,该数据在early_irq_init()时被初始化为默认值,在中断控制器和中断在注册时被进一步被设置为中断相关的属性和数据。irq_desc数组的index为linux系统对应的中断号(即软件中断号),struct irq_desc是在表述中断的自身的系统属性。而其irq_desc->irq_data 即struct irq_data更多的是在说明该中断硬件属性(如其对应的硬件中断、其所属的硬件中断控制器等)。irq_data->irq 即为irq_desc数组的index、也就是系统软件中断号;irq_data->hwirq该中断所属的中断控制器的硬件中断号。irq_data->irq 与 irq_data->hwirq在系统是一一对应的、能够相互指正,这种对应关系是中断控制器在注册时通过irq_create_mapping()函数完成的。

        irq_desc中还有一个重要的元素是action,对应的结构是struct  irqaction,该j结构中的数据会通过request_threaded_irq()等类似的中断注册函数进行填充。如图中所以基本与request irq函数中的入参相对应。

      4.2 irq_domain_list是内核中另一个中断相关的重要数据,是一个指向struct irq_domian结构的链表。irq_damain是在中断控制器注册时通过irq_domain_create_tree函数创建,其与系统中注册的中断控制器相对应,故irq_data->domain 与irq_data->chip相对应,irq_data->domain为中断控制器的系统属性,irq_data->chip为中断控制器的硬件特性。

        系统中正式因为有irq_desc数组,所以可以通过系统中断号遍历到该该中断对对对应的所有特性,如对应的中断控制器、硬件中断号、中断处理函数、中断状态等等。

        【从数据的角度看,初始类的函数是在为了完成数据结构的填充,其中数据代表状态;过程函数是在修改结构数据,也是在改变状态。】

5.中断标识

        中断注册时可设置的中断flag,这些flag影响中断chip及该中断irq_desc的属性。

中断注册标识意义
IRQF_SHARED多个外设共享一个中断信号;注册共享中断时,1.必须要传入注册设备的信息、否则无法设备哪个设备触发的中断; 2. 所有共享中断的中断触发类型必须相同; 3.共享同一硬件中断,如果有中断设置IRQF_ONESHOT/IRQF_PERCPU则共享该中断的其他中断也需要设置IRQF_ONESHOT/IRQF_PERCPU属性。 4.共享中断最好具有自动使能功能(即该中断不具备__IRQ_NOAUTOEN属性),否则该中断的使能可能不平衡;5.共享中断不能通过try_one_irq函数从秘书rounted状态恢复IRQF_COND_SUSPEND 仅对共享中断有意义,另IRQF_NO_SUSPEND 和 IRQF_COND_SUSPEND时不能同时存在的。
  
IRQF_PROBE_SHARED用于在IRQF_SHARED注册失败时打印异常的中断注册信息
__IRQF_TIMER用于标记为时钟中断
IRQF_PERCPU表示该中断可路由到任意CPU, 该标识的中断不能被强制设置为thread处理形式
IRQF_NOBALANCING表示该中断不支持 irq balancing
IRQF_ONESHOT用于支持thread的中断,当该中断的handler处理完成是不能使能的,直到该中断的thread_fn运行。
IRQF_NO_SUSPEND系统suspend时不会关闭此中断,但是并不保证此中断可以唤醒系统
IRQF_FORCE_RESUME当系统唤醒时,强制使能该中断;

        中断描述符的状态irq_desc -> status_use_accessors表示该该中的状态属性。

中断描述符的状态意义
IRQ_PER_CPU与注册中断时IRQF_PERCPU flag相对应,表示该中断可路由到任意CPU
IRQ_NOPROBE表示该中断不能被autoprobing,指设备自动探测中断号
IRQ_NOREQUEST标识该中断不能被 requst_irq() 申请
IRQ_NOAUTOEN表示该中断不具有自动使能能力,自动使能中断在完成注册后主动调用irq_startup(IRQ_RESEND)处理中断;IRQF_SHARED 共享中断要支持自动使能
IRQ_NO_BALANCING与注册中断时IRQF_NOBALANCINGflag对应,表示该中断不支持中断平衡、不能通过irq_set_affinity函数设置其亲和性。支持平衡也有另一个前提即支持 per cpu
IRQ_MOVE_PCNTXT支持migrated中断处理器上下文到其他处理器
IRQ_NESTED_THREAD表示该中断支持嵌套处理,当前Linux内核不支持中断嵌套
IRQ_NOTHREAD该中断不能通过thread处理
IRQ_PER_CPU_DEVID为PPI类型中断标识,具有该标识的中断有没有CPU独立变量percpu_dev_id,该类型中断通过request_precpu_irq函数进行注册
IRQ_IS_POLLED有此标识的中断会从suprious中断检测机制&core polling检测中剔除
IRQ_DISABLE_UNLAZY此标识时表示该中断控制器可能没有实现irq_disable函数,通过标识该中断desc中的中断状态来表示该中断disable

        中断要设置的或者反应中断对应的irqchip状态标识。

中断irqchip状态标识意义
IRQD_ACTIVATED表示该中断为active状态,代表该中断的irqchip链路已经OK;是 IRQD_IRQ_STARTED 的前一个状态。
IRQD_WAKEUP_STATE表示该中断具有唤醒系统能力
IRQD_IRQ_DISABLED与IRQD_IRQ_MASKED表示一致:代表该中断被关闭或者掩住;对应的函数为irq_disable/irq_enable
IRQD_IRQ_MASKED与IRQD_IRQ_DISABLED表示一致:代表该中断被关闭或者掩住;对应的函数为irq_mask/irq_unmask
IRQD_IRQ_INPROGRESS该中断正在被处理,即正执行该中断的处理函数
IRQD_WAKEUP_ARMED支持IRQD_WAKEUP_STATE属性的中断在系统待机时,该中中断会被IRQD_WAKEUP_ARMED标记表示该中不可休眠、该中断可以唤醒系统,
IRQD_AFFINITY_MANAGEDaffinity 是由kernel自动管理
IRQD_IRQ_STARTED表示该中断是started

        至此,对内核中断的学习、介绍就告一段落。

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

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

相关文章

Python基础语法:代码规范、判断语句与循环语句

目录 一、代码规范 二、判断语句 三、循环语句 总结: Python是一种高级、动态类型的编程语言,其语法清晰、简洁,易于学习。本文将介绍Python基础语法中的代码规范、判断语句和循环语句。 一、代码规范 良好的代码规范可以提高代码的可读…

element-ui 树形控件 实现点击某个节点获取本身节点和底下所有的子节点数据

1、需求&#xff1a;点击树形控件中的某个节点&#xff0c;需要拿到它本身和底下所有的子节点的id 1、树形控件代码 <el-tree:data"deptOptions"node-click"getVisitCheckedNodes"ref"target_tree_Speech"node-key"id":default-ex…

Unity - gamma space下还原linear space效果

文章目录 环境目的环境问题实践结果处理要点处理细节【OnPostProcessTexture 实现 sRGB 2 Linear 编码】 - 预处理【封装个简单的 *.cginc】 - shader runtime【shader需要gamma space下还原记得 #define _RECOVERY_LINEAR_IN_GAMMA】【颜色参数应用前 和 颜色贴图采样后】【灯…

tee漏洞学习-翻译-1:从任何上下文中获取 TrustZone 内核中的任意代码执行

原文&#xff1a;http://bits-please.blogspot.com/2015/03/getting-arbitrary-code-execution-in.html 目标是什么&#xff1f; 这将是一系列博客文章&#xff0c;详细介绍我发现的一系列漏洞&#xff0c;这些漏洞将使我们能够将任何用户的权限提升到所有用户的最高权限 - 在…

WEB安全渗透测试-pikachuDVWAsqli-labsupload-labsxss-labs靶场搭建(超详细)

目录 phpstudy下载安装 一&#xff0c;pikachu靶场搭建 1.下载pikachu 2.新建一个名为pikachu的数据库 3.pikachu数据库配置 ​编辑 4.创建网站 ​编辑 5.打开网站 6.初始化安装 二&#xff0c;DVWA靶场搭建 1.下载DVWA 2.创建一个名为dvwa的数据库 3.DVWA数据库配…

13、Kafka ------ kafka 消费者API用法(消费者消费消息代码演示)

目录 kafka 消费者API用法消费者API使用消费者API消费消息消费者消费消息的代码演示1、官方API示例2、创建消费者类3、演示消费结果1、演示消费者属于同一个消费者组2、演示消费者不属于同一个消费者组3、停止线程不适用4、一些参数解释 代码生产者&#xff1a;MessageProducer…

flutter设置windows是否显示标题栏和状态栏和全屏显示

想要让桌面软件实现全屏和不显示状态栏或者自定义状态栏&#xff0c;就可以使用window_manager这个依赖库&#xff0c;使用起来还是非常方便的&#xff0c;可以自定义显示窗口大小和位置&#xff0c;还有设置标题栏是否展示等内容&#xff0c;也可以设置可拖动区域。官方仓库地…

万界星空科技可视化数据大屏的作用

随着科技的不断发展和进步&#xff0c;当前各种数据化的设备也是如同雨后春笋般冒了出来&#xff0c;并且其可以说是给我们带来了极大的便利的。在这其中&#xff0c;数据大屏就是非常具有代表性的一个例子。 数据大屏的主要作用包括&#xff1a; 数据分析&#xff1a;数据大屏…

【mongoDB】文档 CRUD

目录 1.插入文档 批量插入&#xff1a; 2.查询文档 3.更新文档 4.删除文档 deleteOne() deleteMany() findOneAndDelete() 1.插入文档 可以使用 insert () 方法或者 save() 方法向集合中插入文档 语法如下&#xff1a; db.collection_name.insert(document) collectio…

软考培训机构哪家比较好?各软考培训机构排名如何?

先放上机构测评图 一、机构情况 &#xff08;1&#xff09;主营业务 大多数软考培训机构主要致力于IT培训或者软件行业。这些机构的课程更加专业&#xff0c;因为他们起源于该行业。我相信报考软考的同学大部分也是从事这个行业的。个人认为选择这类机构进行培训会有更多好处…

[C#]winform部署yolov5实例分割模型onnx

【官方框架地址】 https://github.com/ultralytics/yolov5 【算法介绍】 YOLOv5实例分割是目标检测算法的一个变种&#xff0c;主要用于识别和分割图像中的多个物体。它是在YOLOv5的基础上&#xff0c;通过添加一个实例分割模块来实现的。 在实例分割中&#xff0c;算法不仅…

C++输入输出流

输入/输出流类&#xff1a;iostream---------i input&#xff08;输入&#xff09; o output&#xff08;输出&#xff09; stream&#xff1a;流 iostream&#xff1a; istream类&#xff1a;输入流类-------------cin&#xff1a;输入流类的对象 ostre…

Cesium加载地图-高德影像

废话不多说&#xff0c;直接上代码 整体代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><…

爬虫(一)

1. HTTP协议与WEB开发 1. 什么是请求头请求体&#xff0c;响应头响应体 2. URL地址包括什么 3. get请求和post请求到底是什么 4. Content-Type是什么1.1 简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于万维网&#xff08;…

【Python】02快速上手爬虫案例二:搞定验证码

文章目录 前言1、不要相信什么验证码的库2、以古诗文网为例&#xff0c;获取验证码1&#xff09;code_result.py2&#xff09;gsw.py 前言 提示&#xff1a;以古诗文网为例&#xff0c;获取验证码&#xff1a; 登录&#xff1a;https://so.gushiwen.cn/user/login.aspx 1、不…

牛刀小试 - C++ 推箱子小游戏

参考文档 C笔记&#xff1a;推箱子小游戏 copy函数 memcpy()函数用法&#xff08;可复制数组&#xff09; 使用memcpy踩出来的坑&#xff0c;值得注意 完整代码 /********************************************************************* 程序名:推箱子小游戏 说明&#x…

无状态应用管理Deployment

无状态应用管理Deployment 1、Deployment介绍 Deployment一般用于部署公司的无状态服务。 格式&#xff1a; apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx …

2024亚马逊开店教程:开店准备与注册流程指南

随着新一年的到来&#xff0c;亚马逊开启了新一轮的卖家入驻&#xff0c;并且针对新卖家优化了入驻流程&#xff0c;下面为大家简单整理一下最新亚马逊入驻教程&#xff0c;有想要入驻开店的小伙伴速速看过来&#xff01; 一、开店前准备 1、账号环境准备 为了防止账号由于网…

k8s实例

k8s实例举例 &#xff08;1&#xff09;Kubernetes 区域可采用 Kubeadm 方式进行安装。 &#xff08;2&#xff09;要求在 Kubernetes 环境中&#xff0c;通过yaml文件的方式&#xff0c;创建2个Nginx Pod分别放置在两个不同的节点上&#xff0c;Pod使用动态PV类型的存储卷挂载…

Python 数据分析实战——为什么销售额减少?酒卷隆治_案例1

# 为什么黑猫游戏的销售额会减少&#xff1f; # 数据集 DAU : 每天至少来访问一次的用户数据 数据内容 数据类型 字段名 访问时间 string&#xff08;字符串&#xff09; log_data 应用名称 string&#xff08;字符串&#xff09; app_name 用户 ID int&#xff08;数值&…