中断子系统 -- 中断通用框架

news2024/10/7 7:28:33

目录

通用数据结构

中断注册

中断线程化

中断处理

获取hwirq号

irq_enter

preempt_count

generic_handle_irq

irq_exit


通用数据结构

内核提供了两种中断描述符组织形式:

  • 打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix-tree来组织,用户在初始化时进行动态分配,然后再插入radix-tree中;
  • 关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的形式组织,并且已经分配好;
  • 不管哪种形式,最终都可以通过linux irq号来找到对应的中断描述符;
  1. 图的左侧灰色部分,主要在中断控制器驱动中进行初始化设置,包括各个结构中函数指针的指向等,其中struct irq_chip用于对中断控制器的硬件操作,struct irq_domain与中断控制器对应,完成的工作是硬件中断号到Linux irq的映射;
  2. 在设备申请注册中断的过程中进行设置,比如struct irqaction中handler的设置,这个用于指向我们设备驱动程序中的中断处理函数;irqaction以链表的形式组织,Irq_desc中存的是irqaction链表的头结点

中断注册

  1. irq:要申请中断的中断号。
  2. handler:中断处理函数,当中断发生以后就会执行此中断处理函数。
  3. flags:中断标志。比如按键按下后为低电平,那么可以设置为下降沿触发
  4. name:中断名字,设置以后可以在/proc/interrupts 文件中看到对应的中断名
  5. dev: 对于共享中断,通常通过dev_id来查询寄存器,确定哪个外设产生的中断,一般情况下将dev 设置为设备结构体, dev 会传递给中断处理函数 irq_handler_t 的第二个参数。

  • request_irq也是调用request_threaded_irq,只是在传参的时候,线程处理函数thread_fn函数设置成NULL

Tips

  1. 共享中断:多个设备共享一个中断号,需要硬件支持以区分哪个设备发生的中断
  1. 中断共享,每个中断号有一个中断描述符,每个设备有自己的中断处理函数。所以irqaction会形成链表。old指向irqaction链表头节点,old不为空说明已经有中断添加到中断描述符irq_desc中,说明这是一个共享中断。shared=1。
  2. 对于ONESHOT的解释:对于共享中断,如果某个中断处理程序设置了ONESHOT标志,则此中断的thread mask (每个irqaction有一个thread_mask位图)将被设置。每个中断处理程序完成后unmask一位,表示解除对中断的屏蔽,从而允许其他中断处理程序处理该中断。当所有中断处理程序完成后,中断线程掩码才被清零,从而允许下一次的中断被触发。
  3. 解释:为什么是电平触发?如果是高电平触发,则电平由低到高后,中断触发,然后电平会维持高电位直到中断处理过程中(irq_activate用于激活一个中断,从而允许中断响应和处理),软件写入外设中的状态寄存器时,电平才会下降。而边沿触发,中断触发后,电平就会恢复

实验:去掉IRQF_ONESHOT的判定,结果手机开机卡在vivo界面,不断重启。

分析:因为没有了这处判断,导致使用默认中断处理函数并且没设置ONESHOT标志的中断注册成功。当发生中断时,中断就会连续不断触发,

中断线程化

好处:

  1. 降低内核中的延迟:中断线程化后进一步压缩了上半部的工作量,上半部的工作仅仅需要完成 “快速检查”,譬如确保中断的确来自期望的设备;如果检查通过,它将对硬件中断完成确认并通知内核唤醒中断处理线程完成中断处理的下半部。
  2. 由于中断线程化后简化乃至避免了整个中断处理流程中 “关中断处理(术语上称之为 “hard” 部分)” 和 “开中断处理(术语上称之为 “soft” 部分)” 两个阶段之间可能涉及的锁同步机制,从而降低了整体实现上的复杂性。中断处理线程化还有助于内核的调试。
  3. 内核线程运行时,发生中断,当前线程的内核栈仍然会被用作中断栈

__setup_irq函数的一部分

对于非嵌套中断,如果可以线程化,则默认对其强制线程化(将上半部处理函数线程化),之后如果存在thread_fn,则也会将其线程化

通过这种方式,使用当前的irqaction和它的secondary将handler和thread_fn均线程化处理,而真正放在中断上半部处理的只是irq_default_primary_handler

通过这种方式,大大减少了上半部处理的工作量。

中断处理

获取hwirq号

当进入异常处理程序时,软件不知道它所接受的是哪个中断。处理程序必须读取一个Interrupt Acknowledge Registers(IARs)来获取中断的INTID

有两个IAR

中断号1023表示无效中断。

irq_enter

首先,irq_enter主要执行为

整个过程主要操作可抽象成

这个过程就是将抢占计数(默认为0)加上HARDIRQ_OFFSET,HARDIRQ_OFFSET可知操作的是硬件中断计数器。所以irq_enter就是通过preempt_count告诉系统,现在正在处理中断的上半部分工作(irq_enterirq_exit函数之间,不可以进行抢占。

preempt_count

preempt_count这个成员被用来判断当前进程是否可以被抢占。如果preempt_count不等于0,说明当前不能进行抢占,如果preempt_count等于0,说明已经具备了抢占的条件(当然具体是否要抢占当前进程还是要看看thread info中的flag成员是否设定了_TIF_NEED_RESCHED这个标记,可能是当前的进程的时间片用完了,也可能是由于中断唤醒了优先级更高的进程)。

  1. preemption count:用来记录当前被显式的禁止抢占的次数,也就是说,每调用一次preempt_disablepreemption count就会加一,调用preempt_enable,该区域的数值会减去一。preempt_disablepreempt_enable必须成对出现,可以嵌套,最大嵌套的深度是255
  2. hardirq count:描述当前中断handler嵌套的深度。hardirq count占用了4bit,说明硬件中断handler最大可以嵌套15层(实际上中断的嵌套已经不会发生了。因此,理论上,hardirq count要么是0,要么是1。不过呢,万一有人在handler中打开中断,那么这时候中断嵌套还是会发生的。但是,应该不会太多,因此,目前hardirq count占用了4bit,应付15个奇葩driver是妥妥的)preempt_count_add(HARDIRQ_OFFSET)preempt_count_sub(HARDIRQ_OFFSET)用于操作此段
  3. softirq count:与hardirq count类似。kernel提供了local_bh_enablelocal_bh_disable这样的接口函数来加减此段

Tips:为什么中断不能嵌套?

  1. 防止栈空间不够用。

因为每个中断被执行,都要先保存现场。一个中断栈空间有限

  1. 中断上半部的处理应当越快越好。否则无法及时响应一些紧急任务

generic_handle_irq

  1. 硬件中断号小于32,说明是SGI或者PPI,handle_irq设置为handle_percpu_devid_irq
  2. 硬件中断号大于等于32,说明是SPI,handle_irq设置为handle_fasteoi_irq,在此函数中会判断是否设置了ONESHOT标志,如果设置,则会屏蔽此中断请求。

中断处理程序有三种可能的返回值。

  1. 唤醒内核线程后,执行irq_thread 函数在一个循环中调用thread_fn
  2. 有两种情况会返回IRQ_WAKE_THREAD,一种是没有提供上半部处理函数handler,使用默认的处理函数,直接返回IRQ_WAKE_THREAD。一种是自定义了handler,则如果线程化,返回值必须是IRQ_WAKE_THREAD
  3. 在thread_fn中,如果中断被正确处理,返回值是IRQ_HANDLED

irq_exit

irq_exit()函数在每次中断处理程序(上半部)完成后调用,以便退出中断上下文,重新启用中断(cpu此时相当于空闲了,可以去处理其他中断了)并处理softirq

核心功能代码:

  1. preempt_count_sub:preempt_count的硬中断位减一,表示退出硬中断上下文。
  2. in_interrupt:判断当前是否处于硬中断上下文,如果处于返回一个非零值。
  3. local_softirq_pending :判断__softirq_pending的值是否为0,如果不为0表示软中断pending__softirq_pending的不同bit位表示不同的软中断,在触发软中断时会设置。
  4. invoke_softirq:对软中断进行处理

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

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

相关文章

android h5 共享停车系统myeclipse开发mysql数据库编程服务端java计算机程序设计

一、源码特点 java android h5 共享停车系统APP是一套完善的WEBandroid设计系统,对理解JSP java,安卓app编程开发语言有帮助(系统采用web服务端APP端 综合模式进行设计开发),系统具有 完整的源代码和数据库&#xf…

MySQL架构介绍与说明

1、MySQL架构介绍 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上, 插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的…

机器学习 day33(误差分析、添加数据)

误差分析 我们可以手动查看分类错误的子集样本(通常为100个),并统计他们的错误类型在所有错误类型中,选择一种或几种最常见的错误,进行改进。这可以最高效的改进你的模型误差分析的一个限制是:它只能很好…

基于Python+tkinter实现一个简易计算器桌面软件

你是否想过自己能够开发一个桌面小工具?如果答案是“是”,那么你来对地方了!今天,我们要一起使用Python中的tkinter库,来创建一个简易的桌面计算器。 1. 为什么选择tkinter? tkinter是Python的标准GUI库。…

Tokenview X-ray功能:深入探索EVM系列浏览器的全新视角

Tokenview作为一家领先的多链区块浏览器,为了进一步优化区块链用户的使用体验,我们推出了X-ray(余额透视)功能。该功能将帮助您深入了解EVM系列浏览器上每个地址的交易过程,以一种直观、简洁的方式呈现地址的进出账情况…

基于注解和jwt实现权限管理

第一步&#xff1a;创建项目 添加Maven依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version> </dependency> <dependency><groupId>org.s…

2023 Google 开发者大会|Mobile开发专题追踪

文章目录 前言大会介绍涉及内容MobileWebAICloud Mobile开发专题多终端应用的开发适配大屏视频流可穿戴设备电视新的设计中心 构建高质量的应用高级相机和媒体功能用户的安全和隐私更精细的视觉体验 小结 前言 哈喽大家好&#xff0c;我是阿Q。近期&#xff0c;【2023 Google …

TVS二极管的小知识

TVS二极管的小知识 文章目录 TVS二极管的小知识1、工作原理2、TVS二极管参数详解3、选型指南4、TVS二极管选型注意事项 1、工作原理 TVS&#xff08;Transient Voltage Suppressors&#xff09;二极管&#xff0c;即瞬态电压抑制器&#xff0c;又称雪崩击穿二极管&#xff0c;…

LabelEdit DLSample

LabelEdit改成true SelectedNode.Text"" 关于图像和数据集的信息在字典DLDataset中表示&#xff0c;DLDataset充当一个数据库。更准确地说&#xff0c;它存储关于数据集和在关键样本下收集的单个样本的字典的一般信息。当需要实际的图像数据时&#xff0c;将为每个…

ClickHouse进阶(十六):clickhouse优化-表优化

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_大数据OLAP体系技术栈,Apache Doris,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

AD20多层板设计中的平电层设计规则

一般情况下的多层板设计非常复杂&#xff0c;尤其层叠的次序以及平电层的电源层设计&#xff0c;Gnd层的设计比较简单&#xff0c;不需要过多的关注&#xff0c;但是电源层的设计非常关键&#xff0c;常常让人感到无法下手的感觉&#xff0c;这里介绍一个简单的防盲很快的让你上…

云流化:XR扩展现实应用发展的一个新方向!

扩展现实的发展已经改变了我们工作、生活和娱乐的方式&#xff0c;而且这才刚刚开始。扩展现实 (Extended reality, XR) 涵盖了沉浸式技术&#xff0c;包括虚拟现实、增强现实和混合现实。从游戏到虚拟制作再到产品设计&#xff0c;XR 使人们能够以前所未有的方式在计算机生成的…

解决方案 | 法大大电子签加速高校七大场景全面实现数字化

随着互联网技术的普及和发展&#xff0c;数字化校园建设在各高校正如火如荼地开展。无纸化办公是数字化校园建设中非常重要的一项内容&#xff0c;如何更好地在高校实现无纸化办公&#xff0c;为学校的教学、科研及管理服务提高工作效率、规范工作流程&#xff0c;是各高校都应…

window server事件ID说明

重启&#xff1a;1074 6013&#xff1a;系统运行时间 6008&#xff1a;非正常关机或者意外关机 WindowsServer2012R2事件id6008什么意思&#xff1f; 在Windows Server 2012 R2中&#xff0c;事件ID 6008是一个系统事件&#xff0c;它通常表示系统的非正常关机或意外关机。当系…

阿里镜像站下载Centos7

CentOS主流版本有7和8&#xff0c;我们这里选择centos7进行安装&#xff0c;因为现在8已经不更新了&#xff0c;CentOS 8 是一个介于实验性版本和稳定商业版本之间的产物&#xff0c;是最后一个版本&#xff0c;一般情况下&#xff0c;我们更追求稳定性&#xff0c;以我们选择 …

幸福里基于 Flink Paimon 的流式数仓实践

摘要&#xff1a;本文整理自字节跳动基础架构工程师李国君&#xff0c;在 Streaming Lakehouse Meetup 的分享。幸福里业务是一种典型的交易、事务类型的业务场景&#xff0c;这种业务场景在实时数仓建模中遇到了诸多挑战。本次分享主要介绍幸福里业务基于 Flink & Paimon …

常用数据库的 API - 开篇

API API 这个词在大多数人看来可能和 CNS 差不多&#xff0c;前者天天听说就是用不上&#xff0c;后者天天读就是发不了。 不过&#xff0c;通过今天的一个简短介绍&#xff0c;今后 API 这个东西你就用上了&#xff0c;因为在文章最后我将会展示一个最最基础且高频的 API 使…

小白如何选择阿里云服务器配置?CPU内存带宽系统盘选择

阿里云服务器配置选择_CPU内存/带宽/存储配置_小白指南&#xff0c;阿里云服务器配置选择方法包括云服务器类型、CPU内存、操作系统、公网带宽、系统盘存储、网络带宽选择、安全配置、监控等&#xff0c;阿小云分享阿里云服务器配置选择方法&#xff0c;选择适合自己的云服务器…

4.3 IAT Hook 挂钩技术

IAT&#xff08;Import Address Table&#xff09;Hook是一种针对Windows操作系统的API Hooking 技术&#xff0c;用于修改应用程序对动态链接库&#xff08;DLL&#xff09;中导入函数的调用。IAT是一个数据结构&#xff0c;其中包含了应用程序在运行时使用的导入函数的地址。…

左神高级提升班1 很重要的题目

【案例1】 【题目描述 难度非常高】 【思路解析】 因为要求额外空间复杂度为O(1)&#xff0c;所以我们只能使用有限几个变量&#xff0c;来得到整个数组所在的城市距离首都的距离。因为数组paths[i]表示&#xff0c;i城市指向paths[i]城市&#xff0c;我们可以利用这个指向关…