linux中断

一 Linux中断原理

Linux中断(Interrupt)是指在计算机执行过程中,由于某些事件发生(例如硬件请求、错误、异常等),CPU暂停当前正在执行的程序,转而执行相应的处理程序的过程。中断是计算机多任务环境下的一种重要机制,它可以保证不同任务之间的公平访问 CPU 时间,以及及时响应外部事件。

    中断提供了一种及时响应硬件故障和外部事件的方式,从而确保系统能够及时处理这些事件并保持正常运行。在Linux系统中,中断被广泛应用,从底层的驱动程序到高层的分布式系统,中断都扮演着重要的角色。

1 Linux中断的调度方式

在Linux系统中,中断的调度方式有以下几种:

1.硬件调度:当一个中断被触发时,硬件会自动将该中断的上下文信息保存到栈中,并将处理器的状态切换到内核态。然后硬件会发送一个目标中断,通知内核处理该中断。

2.软件调度:在内核中,中断可以通过注册的中断处理函数进行处理。当一个中断被触发时,内核会查找对应的中断处理函数,并调用该函数进行处理。

3.嵌套调度:当一个中断被触发时,内核会保存该处理器的状态并切换到内核态。如果该中断处理函数需要较长的时间才能完成,那么它可能会被更高优先级的中断打断。此时,内核会将高优先级的中断保存到栈中,并在处理完当前中断后再处理高优先级的中断。

2 使用中断解决问题

Linux中断可以用来解决许多硬件和软件问题,例如:

1.实时性应用:通过源中断及时响应外部事件,保证系统能够及时处理并保持正常运行。

2.I/O操作:通过源中断完成数据传输和读取,提高系统的I/O性能。

3.并发处理:通过多线程或多进程实现并发处理,提高系统的吞吐量和响应速度。

4.系统调优:通过调整中断的优先级和掩码来解决中断冲突问题,优化系统的性能和稳定性

3 中断分类

根据中断触发来源

  1. 机器故障中断(Machine check interrupt):当计算机系统发生硬件错误时,比如内存错误、缓存错误等,会触发机器故障中断。
  2. I/O中断(I/O interrupt):当计算机与外部设备进行交互时,比如打印机、键盘、显示器等,会触发I/O中断。
  3. 外部中断(External interrupt):来自计算机系统外部装置的中断,比如门铃、电话、键盘等。
  4. 中断控制器中断(Interrupt controller interrupt):中断控制器负责管理计算机系统中的中断,当需要切换中断优先级或处理中断时,会触发中断控制器中断。
  5. 定时器中断(Timer interrupt):计算机系统中常常使用定时器来产生定时中断,比如系统时钟、计时器等。
  6. 软件中断(Software interrupt):软件中断是由程序员故意引起的一类中断,通常用来实现系统调用或异常处理等。

概括为 硬中断软中断 

根据屏蔽类型 

  • NMI中断,不可屏蔽中断,产生这个中断的时候,表示系统发生了致命的错误。

  • INTR可屏蔽中断。

 NMI 如 watchdog 调试、跨 PE 同步和热补丁 ’操作系统依赖中断来支持性能分析

RAS事件处理

后者的INTR其中就包含了我们的FIQ、IRQ。中断定义宏都会带上INTR。
 

4 中断流程

  1. 保存上下文:在处理中断之前,需要先把当前执行的任务的寄存器状态(包括CPU寄存器和程序计数器等)保存到内核栈上。
  2. 查找中断向量表:根据接收到的中断信号类型,在中断向量表中查找相应的处理函数。
  3. 执行处理函数:执行对应的中断处理函数,对中断进行处理。
  4. 恢复上下文:执行完中断处理函数后,需要把之前保存的上下文恢复到原来的任务中,让程序继续执行。

在Linux系统中,中断处理程序通常由内核编写和实现,外设通常会使用中断机制与CPU进行通信,以请求处理或传递数据。中断处理程序可以看作是一种特殊的系统调用,它由硬件触发,但不同于用户进程的系统调用,它是由硬件或软件引发的紧急事件,要求CPU尽快停止当前工作,转而执行相应的处理程序。

5 中断处理 及优先级

在Linux系统中,中断处理涉及到两个概念:中断优先级中断响应次序。其中,中断优先级是指各个中断源在中断请求和服务之间的优先级别;中断响应次序是指在中断请求和服务之间对于不同中断源的响应顺序。

中断优先级的设置通常涉及到一个优先级计数器或者优先级码,不同的中断源会有不同的优先级计数器或优先级码。当一个中断源发出中断请求时,系统会检查该中断源的优先级计数器或优先级码,如果它的值比其它中断源的高,那么它就会被优先响应。否则,系统会继续检查其它中断源的优先级计数器或优先级码,直到找到一个中断源被优先响应。

在Linux系统中,中断优先级的设置通常涉及到抢占优先级响应优先级两个概念。抢占优先级决定了一个中断源能否抢占其它中断源的服务,而响应优先级则决定了一个中断源在等待服务时的优先级别。在STM32(Cortex-M3)中,每个中断源都需要被指定这两种优先级。

6 中断向量表

中断向量号是指计算机系统中的中断类型号(也称中断矢量号),每个中断类型都有一个对应的编号(或者向量),用于指示硬件或者操作系统在处理该中断时需要跳转到的地址。

在早期的微机系统中,中断向量号通常指的是硬件产生的中断入口地址或存放中断服务程序的首地址。例如,在Intel 8086微处理器中,每个中断类型都有一个16位的向量号,这些向量号被存储在中断向量表中,可以通过设置中断标志位来响应不同类型的中断。

在现代的计算机系统中,中断向量号通常由操作系统或者设备驱动程序动态分配,并通过中断向量表或者中断描述符表进行管理。这些表中存储了中断向量号、中断处理程序的地址以及其他相关信息,供硬件在处理中断时使用。

二 中断嵌套与同步

软中断可以抢占线程,硬中断可以抢占软中断也可以抢占线程,而返回来则不能抢占。

中断嵌套是中断技术中的一种非常重要的同步机制。所谓中断嵌套,是指当CPU执行某个中断服务程序时,如果收到更高级别的中断请求,CPU会立即暂停当前的中断服务程序,转而去处理新的更高级别的中断请求。等处理完新的中断请求后,CPU会重新回到原来的中断服务程序,从暂停的地方继续执行。

中断嵌套在操作系统中起着非常重要的作用,例如,当用户线程执行时,操作系统会通过中断机制来管理调度其他线程,实现多线程并发执行。在这种情况下,中断嵌套可以保证操作系统能够及时响应更高级别的中断请求,从而使整个系统的并发性能得到提升。

需要注意的是,不同类型的中断可能有不同的优先级,因此中断嵌套在实现时需要考虑优先级调度问题。在Linux内核中,如果驱动在申请注册中断时没有特别的指定,do_irq函数在处理中断时是开启中断的。如果在驱动的中断处理函数正在执行的过程中,出现同种类型的中断或者不同种类的中断,这时候新的中断会被立即处理。对于同种类型的中断,由于其使用同样的IDT表项,通过其状态标志(IRQ_PENDINGIRQ_INPROGRESS)可以防止同种类型中断函数的执行。对于不同种类的中断,则可以自由的嵌套。( linux下的不同类型硬中断处理是可以嵌套的)

  中断线程和工作队列

中断里不宜调用会阻塞、休眠的函数,这对软中断函数的编程是很不利的,为此内核开发了两种方法,中断线程和工作队列。

threaded_irq 是一种内核支持的中断处理机制,用于在中断处理函数中处理重要紧急的任务,然后使用线程来处理耗时复杂的任务。它支持在中断处理函数中设置IRQF_ONESHOT标记,这样内核会自动帮助我们在中断上下文中屏蔽对应的中断号,而在内核调度线程执行后,重新使能该中断号。

workqueue 是内核中使用最广泛的线程化中断处理机制。系统中有一些默认的工作队列,你也可以创建自己的工作队列,工作队列背后对应的是内核线程。你可以创建一个work,然后push到某个工作队列,然后这个工作队列背后的内核线程就会去执行这些work。下面我们来看一下工作队列的接口。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flask+表格静态展示

Python网页开发(持续更新ing…) 诸神缄默不语-个人CSDN博文目录 本文的需求场景是:我现在有一个JSON格式的表格,这个具体格式不重要相信你们能看懂其他格式的表格怎么改。总之我想用PythonFlask提取这个表格,并展示在…

【网络编程一】初识网络:IP与端口号 网络模型

目录 🌟需要知道 一、基础概念 🌈1、IP地址与端口号 🌈2、五元组 二、协议分层 🌈1、OSI七层网络网络模型 🌈2、TCP/IP五层(四层)模型 🌈3、封装和分用(重点!) &…

软件测试基础篇

文章目录 一、软件测试的生命周期二、BUGBUG的描述BUG的级别BUG生命周期产生争执怎么办?如何开始第一次测试测试的执行和BUG的管理 一、软件测试的生命周期 软件测试的生命周期: 1.需求分析:需求是否完整,需求是否正确 2.测试计划&#xff…

串口屏-迪文10寸T5串口屏数据交互

效果演示 为了便于理解 建议先看上篇博客 点击跳转到上一篇博客 正式开始 1 打开DGUS 2 如图点击文本显示 数据变量 3 填写数据地址 按步骤操作 3-1 先点击框选1处 3-2 再点击框选2处改地址 我改的1000 3-3 设置完直接导出 插入U盘替换DWSET文件夹文件(这一步不理解去看上一…

C++ set类成员函数介绍 (set和multiset)

目录 🤔set模板介绍: 🤔特点: 🤔set的成员函数: 😊set构造函数: 🔍代码实例: 🔍运行结果: 😊 set赋值函数&#xf…

Linux——线程的同步与互斥

目录 模拟抢火车票的过程 代码示例 thread.cc Thread.hpp 运行结果 分析原因 tickets减到-2的本质 解决抢票出错的方案 临界资源的概念 原子性的概念 加锁 定义 初始化 销毁 代码形式如下 代码示例1: 代码示例2: 总结 如何看待锁 申…

【C++】STL中stack的用法及模拟实现

目录 一、stack的简介二、stack的使用三、stack的模拟实现 一、stack的简介 stack是一种容器适配器,专门用在后进先出操作的上下文中环境中,其中的元素只允许从容器固定的一端进行插入和删除操作。stack是作为容器适配器来实现的,容器适配器…

信息安全实践1.3(HTTPS)

前言 做这个实验对Tomcat的版本有要求,最好是使用Tomcat8。因为我之前使用Tomcat10,然后一直做不出来。 要求 部署Web服务器端HTTPS功能,通过网络嗅探分析HTTPS通过SSL实施安全保护的效果 关键步骤 首先要给tomcat配置https,也…

Unity3D安装:离线安装 Unity

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 在没有 Hub 的情况下离线安装 Unity Unity 下载助手 (Download Assistant) 支持离线部署。在这种部署方式中,可下载用于安装 Unity 的所有文件,然后生成脚本…

采购申请审批测试

采购申请审批的配置并不难,但是总会有原因导致业务无审批策略,而且这个配置也比较脆弱,有时同步也会出现问题,小编利用这篇操作记录下测试结果。 1、项目类别的审批策略分类 下图是审批策略分类-项目类别不给值,测试…

(浙大陈越版)数据结构 第三章 树(上) 3.4 小白专场:树的同构(PTA编程题讲解)

题意理解和二叉树表示 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换变成T2,则称两棵树是“同构”的。 eg1:现请你判断如下两棵树(左侧为T1,右侧为T2)是否为同构树? 显然T1可以通过有限次左右孩子…

如何利用IDEA将Git分支代码回退到指定历史版本

一、背景 作为一名后端开发,相信大家一定遇到过这样的情景,代码开发人员过多,并且开发分支过多,导致代码版本管理困难,这样就难免遇到一些代码合并出错,比如,当我提交了本次修改到本地和远程分…

jsp页面调试

现象: 访问jsp页面, 页面为空, 网络请求显示失败, 控制台打印错误net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 分析: 错误描述:编码模块不完整,返回浏览器的流不完整 可能得原因: 1、网络是否稳定 2、服务器端是否有对响应数据做限制,比如…

photoshop矫正扫描图片的倾斜问题以及修改图片内容

由于工程原因,资料需要重新梳理 1.扫描工程表格到电脑中 2.在ps中导入表格内容(表格有时候是倾斜的) 需要修正为正常状态,即垂直状态 设置步骤: 1.调整ps的背景颜色与所在图片的背景颜色一致 用吸管工具&#xff…

【thingsboard+NodeRed+chirpstack】实现Lora节点设备的数据上下行通讯

本文主要实现基于 thingsboard+NodeRed+chirpstack 实现 lora设备的数据上下行通讯。 NodeRed作为mqtt桥接器,在开源的社区版 thingsboard上实现 这里写目录标题 LoRa 设备上下行通讯方案数据上行数据下行Device 层面创建设备时,要添加 relation规则链层面灯控模块规则链规则…

Sentinel降级规则

1.降级规则简介 官方文档 熔断降级概述 除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的…

华为OD机试之处理器问题(Java源码)

处理器问题 题目描述 某公司研发了一款高性能AI处理器。每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。 编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中的处理器不能通信。 如下图所示。…

基于html+css的图展示97

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

安装Arch Linux后要做的十件事

Arch Linux 是一款轻量级、灵活且高度可定制的Linux发行版,被广泛用于个人电脑和服务器。一旦您成功安装了Arch Linux,接下来有一些重要的任务需要完成,以确保系统的稳定性和安全性,并为您的需求做好准备。 本文将详细介绍安装Ar…

【Android】配置不同的开发和生产环境

目录 前言 配置build.gradle(Module级别) 创建对应环境的目录 切换不同环境 ​编辑选择打包的环境 前言 在web开发中不同的环境对应的配置不一样,比如开发环境的url是这样,测试环境的url是那样的,在app中也会涉…
最新文章