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

news2024/9/30 21:28:29

目录

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.coloradmin.cn/o/1413483.html

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

相关文章

01 Redis的特性+下载安装启动+客户端连接

1.1 NoSQL NoSQL(“non-relational”, “Not Only SQL”),泛指非关系型的数据库。 键值存储数据库 : 就像 Map 一样的 key-value 对。如Redis文档数据库 : NoSQL 与关系型数据的结合,最像关系…

南昌市青山湖、滕王阁、洛阳路隧道FM调频广播集群通信调度系统应用案例

一、用户需求 青山湖隧道,是南昌市一条东西走向的城市主干道,隧道为双向6车道,长1070米,其中湖底暗埋段为550米,净高5.45米,两孔每孔净宽12.4米。 滕王阁隧道是南昌市沿江北大道与沿江中大道连通工程&#…

智能分析网关V4智慧机房:视频AI智能安全监管方案

一、背景分析 随着互联网的迅猛发展,机房及其配套设施的数量持续攀升,它们的运行状况对于企业运营效率和服务质量的影响日益显著。作为企业信息化的基石,机房的安全监测与管理的重要性不容忽视。它不仅关乎企业的稳定运营,同时也直…

Redis6基础知识梳理~

初识NOSQL: NOSQL是为了解决性能问题而产生的技术,在最初,我们都是使用单体服务器架构,如下所示: 随着用户访问量大幅度提升,同时产生了大量的用户数据,单体服务器架构面对着巨大的压力 NOSQL解…

ctf-idea调试jar包

0.拿到jar包并解压 进入解压出来的目录,然后以该目录打开项目 1.设置maven 设不设置都行 2.添加依赖 添加两个依赖, boot-inf下的 classes和lib 3.配置调试器 添加 remote jvm debug 1.根据jdk版本选择调试参数 2.选择module classpath为解压后的文件夹名 如图,运行jar包的…

【Deeplabv3+】Ubutu18.04中使用pytorch复现Deeplabv3+第三步)-----CityscapesScripts生成自己的标签

本文是在前面两篇文章的基础上,讲解如何更改训练数据集颜色,需要与前面两篇文章连起来看。 本文用于修改cityscapes数据集的标签颜色与Semankitti数据集的标签一致,对修改后的数据集进行训练。需要下载两个开发工具包和一个数据集&#xff0…

免费交互式大模型在线图像去除水印.擦除.替换和增强照片项目代码(免费在线图像修复工具)

图像修复工具:基于SOTA人工智能模型的应用 原始图: 擦出不想要区域 结果展示 并继续擦除 怎么样神奇把,水印也同样神奇的效果!!! 想要了解更多,请看下文! ! 基于S…

安全小记-ngnix负载均衡

目录 一.配置ngnix环境二.nginx负载均衡 一.配置ngnix环境 本次实验使用的是centos7,首先默认yum源已经配置好,没有配置好的自行访问阿里云镜像站 https://developer.aliyun.com/mirror/ 接着进行安装工作 1.首先创建Nginx的目录并进入: mkdir /soft &…

Qt编写手机端视频播放器/推流工具/Onvif工具

一、视频播放器 同时支持多种解码内核,包括qmedia内核(Qt4/Qt5/Qt6)、ffmpeg内核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6)、vlc内核(vlc2/vlc3)、mpv内核(mpv1/mp2)、…

淘宝扭蛋机小程序:新时代的互动营销与娱乐体验

随着科技的快速发展,小程序已经成为人们日常生活中不可或缺的一部分。在众多的小程序中,淘宝扭蛋机小程序以其独特的互动性和趣味性,吸引了大量用户。本文将深入探讨淘宝扭蛋机小程序的特色、用户体验以及未来发展。 一、淘宝扭蛋机小程序的…

【深度学习】【AutoDL】【SSH】通过VSCode和SSH使用AutoDL服务器训练模型

身边没有显卡资源或不足以训练模型时,可以租赁服务器的显卡。 1、注册AutoDL并配置环境 首先打开AutoDL官网,注册账号并租赁自己期望的显卡资源 点击“租赁”之后,我们要继续选择基础环境。此处,我们让其自动配置好基础的pytor…

用Visual Studio Code创建JavaScript运行环境【2024版】

用Visual Studio Code创建JavaScript运行环境 JavaScript 的历史 JavaScript 最初被称为 LiveScript,由 Netscape(Netscape Communications Corporation,网景通信公司)公司的布兰登艾奇(Brendan Eich)在 …

【C/C++】详解程序环境和预处理(什么是程序环境?为什么要有程序环境?如何理解程序环境?)

目录 一、前言 二、 什么是程序环境? 三、 为什么要有程序环境? 四、如何理解程序环境? 🍎 ANSI C 标准 🍐 翻译环境和执行环境 五、详解翻译环境和执行环境 🍇翻译环境(重点&#xff01…

【K12】tk窗口+plt图像功能-学习物理中的串并联研究【附源码说明】

程序源码 import tkinter as tk import matplotlib.pyplot as plt# 初始化 matplotlib 的字体设置 plt.rcParams[font.family] SimHei# 计算串联电路的函数 def calculate_series():try:# 获取用户输入的电阻值并转换为浮点数r1 float(entry_r1.get())r2 float(entry_r2.ge…

Kotlin Multiplatform项目推荐 | 太空人分布图

Kotlin Multiplatform项目推荐 | 太空人分布图 项目简介 Kotlin Multiplatform项目是一种跨平台开发技术,它可以同时使用SwiftUI、Jetpack Compose、Compose for Wear OS、Compose for Desktop、Compose for Web、Kotlin/JS React等客户端框架,并且使…

【Linux】-cp模型

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

IDEA 安装阿里Java编码规范插件

1.File>Settings 2.安装之后重启 开发过程中如果有不符合规范的地方,会自动出现提示

单片机学习笔记---独立按键控制LED状态

上一节学习的是独立按键控制LED亮灭 这一节我们先来讲一下按键的抖动: 对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以…

go slice 基本用法

slice(切片)是 go 里面非常常用的一种数据结构,它代表了一个变长的序列,序列中的每个元素都有相同的数据类型。 一个 slice 类型一般写作 []T,其中 T 代表 slice 中元素的类型;slice 的语法和数组很像&…

网络分层和网络原理之UDP和TCP

温故而知新 目录 网络分层 应用层 http协议 传输层 介绍 UDP协议 TCP协议 网络层 数据链路层 物理层 网络分层 一. 应用层 应用程序 现成的应用层协议有超文本协议http(不仅仅有文本). http协议 http://t.csdnimg.cn/e0e8khttp://t.csdnimg.cn/e0e8k 自定义应…