首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 中断机制分析

中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下中断,也就是softirq。之后还会总结一些tasklet、工作队列机制。...1.为什么要中断 编写驱动的时候,一个中断产生之后,内核在中断处理函数中可能需要完成很多工作。但是中断处理函数的处理是关闭了中断的。也就是说在响应中断,系统不能再次响应外部的其它中断。...这样的后果会造成有可能丢失外部中断。于是,linux内核设计出了一种架构,中断函数需要处理的任务分为两部分,一部分在中断处理函数中执行,这时系统关闭中断。...Linux内核就中断方面就必须考虑平衡这三个方面的问题。而下面我要分析的__do_softirq函数就恰似在这三者之间打太极,游刃有余,面面俱到!...重新设置中断标记为0,set_softirq_pending重新设置中断标记为0,这样在之后重新开启中断之后硬件中断中又可以设置软件中断位。 7. 开启硬件中断 8.

8.7K91

Linux内核硬中断 中断的原理和实现

世间上的相遇 都是久别重逢 一、概述 从本质上来讲,中断是一种电信号,当设备有某种事件发生,它就会产生中断,通过总线把电信号发送给中断控制器。...linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。中断不能嵌套,但相同类型的中断可以在不同CPU上并行执行。...等: local_bh_disable(); local_bh_enable(); 需要注意的是,禁止下半部仍然可以被硬中断抢占。...= TASK_RUNNING) wake_up_process(tsk); } 在下列地方,待处理的中断会被检查和执行: a. 从一个硬件中断代码处返回 b.

22.2K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    中断中断_中断和硬中断的优先级

    本文主要内容:硬中断 / 中断的原理和实现 内核版本:2.6.37 Author:zhangskd @ csdn blog 概述 从本质上来讲,中断是一种电信号,当设备有某种事件发生,它就会产生中断...linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间 就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是中断(softirq)来完成。...(3) 中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断 除外。...等: local_bh_disable(); local_bh_enable(); 需要注意的是,禁止下半部仍然可以被硬中断抢占。...= TASK_RUNNING) wake_up_process(tsk); } 在下列地方,待处理的中断会被检查和执行: 1. 从一个硬件中断代码处返回 2.

    2.6K40

    关于中断

    经常有朋友问起中断的问题......话说我干了这么多年,还从未在VxWorks领域见过这个词儿,孤陋寡闻了 上网搜了一下,中断应该是Linux的softirq吧,其典型应用就是中断的bottom half。...关于中断,这是嵌入式领域的一个重点词汇,每个OS都支持,从名字来看,肯定是跟硬件有关的。但ISR执行时间过长,就会带来很多麻烦,所以在使用时都会有很多限制。...除了这些限制,不同的OS还提出了不同的solution,例如Linux的这个中断。既然名字里带个"",就是用软件(内核线程?)...其实VxWorks还把(3)和(4)封装到了一起 - 所以,不管泰山,还是3721,直接使用jobAdd()就可以了 这么简单,还用举个例子吗 (6) 哦,万变不离其宗,截图发现:其实tLogTask

    1.5K40

    中断SOFTIRQ

    中断的引入 中断的出现和linux系统对中断的划分是分不开的。...linux系统将整个中断处理过程分为了两部分,分别为上半部(Top Half)和下半部(Bottom Half),之所以要这样分是因为关闭中断的时间不能过长,也就是在关闭中断期间尽可能少干事,否则影响整个系统的性能...所以linux系统将中断处理分为两部分,在上半部全程关闭中断,下半部打开中断。而在上半部主要干一些和硬件有关的操作,速度快,在下部分做一些耗时的操作。这样一来既能保证系统效率又能处理各种中断。...那linux如何判断中断是否发生呢?...B: 根据注释, 如果当初处于中断上写文中(硬++NMI), 直接返回。 如果不是就调用wakeup_softirqd来唤醒本cpu上的内核线程。

    2.3K21

    Linux内核22-中断和tasklet

    中断是静态分配好的(编译),而tasklet是在运行时分配并初始化的(比如,加载内核模块的时候)。因为中断的实现是可重入的,使用自旋锁保护它们的数据结构。所以中断可以在多个CPU上并发运行。...2 中断 Linux2.6内核中,中断的数量比较少。对于多数目的,这些tasklet足够了。因为不需要考虑重入,所以简单易用。...事实上,只使用了6类中断,如下表所示: 表4-9 Linux2.6中使用的中断 中断 优先级 描述 HI_SOFTIRQ 0 处理高优先级的tasklet TIMER_SOFTIRQ 1 定时器中断...Linux中断处理程序总是从索引0开始执行。 2.1 中断使用的数据结构 中断的主要数据结构是softirq_vec数组,包含类型为softirq_action的32个元素。...如果在第3步切换到IRQ堆栈,则恢复原来的堆栈指针到esp寄存器中,然后切换到之前使用的异常堆栈中。 执行local_irq_restore恢复中断标志。

    1.5K30

    中断异常

    1 基本概念 中断定义:通常被定义为改变CPU指令执行序列的事件。 中断可以分为异步和同步中断: 同步中断,是由CPU在执行指令由CPU控制单元产生的中断。...一般是定时器中断和I/O设备中断异常通常分为2类:一类是编程错误,另外一类就是需要内核处理的异常情况。编程错误,比如程序异常终止,处理这种异常,内核只需要给当前进程发送一个信号即可。...3 中断异常 Intel官方文档将中断异常分类为: 中断: 可屏蔽中断 所有I/O设备发出的IRQ都能产生可屏蔽中断。屏蔽掉的中断中断控制器忽略其存在。...控制单元发出信号,让CPU跳转到异常处理程序。Abort异常处理程序一般都是终止程序的执行。 处理器检测异常 当CPU在执行指令,检测出的异常。...依赖于异常发生,内核态栈中的eip寄存器指令,又可以分为三类: 编程异常 这类异常一般是由程序员故意造成的。

    1.4K20

    linux | 网络数据包softirq 中断与CPU

    Linux 在每个 CPU 上会创建一个 ksoftirqd 内核线程。 softirqs 是在 Linux 内核编译就确定好的,例如网络收包对应的 NET_RX_SOFTIRQ 中断。...-5.15.4/net/core/dev.c 注册网卡收发包(RX/TX)中断处理函数 open_softirq(NET_TX_SOFTIRQ, net_tx_action); open_softirq...硬中断是昂贵的,因为它们不能被中断。即使有中断 合并(稍后详细描述),中断处理程序将独占一个 CPU 内核 完全地。NAPI 的设计允许驱动程序进入轮询模式而不是被 为每个需要的数据包接收硬中断。...在正常操作下,会引发初始硬中断或 IRQ,然后是 SoftIRQ 处理程序 它使用 NAPI 例程轮询卡。轮询例程有一个预算,它决定了 允许代码的 CPU 时间。.../about-linux-smp_affinity https://web.archive.org/web/20200225050436/http://blog.yufeng.info/archives

    2.7K20

    中断和实时性

    中断和实时性 翻译自:Software interrupts and realtime Linux内核的中断("softirq")机制有些奇怪,在早期的Linux和处理机制下比较晦涩,且仅有极少的内核开发人员会直接接触中断...例如,当一个内核子系统调用tasklet_schedule(),会在对应的CPU上设置TASKLET_SOFTIRQ 比特位,当中断处理完毕后(开中断),会运行微线程 (tasklet基于中断)。...读者可能会对系统上运行的ksoftirqd 感到疑惑,该进程主要用于在系统的中断负载过高降低中断的处理。...作为回应,3.6.1-rt1对中断的处理又作了改动。现在,当一个线程触发一个中断,内核会保存特定的中断(如处理接收到的网络报文)。...参考: Linux中断 - softirq

    2.1K20

    有种中断

    Workqueue 工作队列是利用内核线程来异步执行工作任务的通用机制,利用进程上下文来执行中断处理中耗时的任务,因此它允许睡眠。而 Softirq 和 Tasklet 在处理任务不能睡眠。...; CPU 中断状态描述,当某个中断触发,__softirq_pending 会置位对应的 bit。...每个CPU维护 irq_cpustat_t 状态结构,当某个中断需要进行处理,会将该结构体中的 __softirq_pending 字段或上 1UL << XXX_SOFTIRQ。...下面我们看下什么时候进行中断函数回调? 处理中断 中断执行的入口就是 invoke_softirq。...什么是中断线程化处理?上面我们讲到 Linux 内核会为每个 CPU 都创建一个内核线程 ksoftirqd,当需要中断线程化处理的时候,会通过 wakeup_softirqd 唤醒内核线程来执行。

    86140

    中断通信简介

    中断通信简介中断通信是进程间通信的一种常见方式,它基于信号机制,允许不同进程之间进行通信。在中断通信中,一个进程向另一个进程发送特定的信号,接收进程捕获信号并执行相应的处理。...中断通信的实现步骤如下:信号发送:发送进程使用kill()函数向接收进程发送信号,信号类型可以自行指定。...signal()函数概述signal()函数是UNIX/Linux系统中用于注册信号处理程序的系统调用。...信号是操作系统中的一种通知机制,用于通知进程发生了某些事件,如接收到外部中断或其他进程发送的信号。...\n"); while (1) { // Do nothing } return 0;}SIGTERMSIGTERM是进程终止发送给进程的终止信号。

    14710

    进程通信 中断 signal()解读

    中断通信 进程间通信方式有多种,其中中断通信是一种常见的方式,它基于信号机制,可以在不同进程之间进行通信。...中断通信的实现方式是,一个进程向另一个进程发送一个特定的信号,该信号被接收进程捕获,并进行相应的处理。...中断通信的步骤如下: 1)发送进程通过kill()函数向接收进程发送信号,信号类型可以自行指定。...需要注意的是,中断通信是一种异步通信方式,即发送进程和接收进程之间并不存在直接的同步机制。...因此,在设计使用中断通信的系统,需要充分考虑这种异步机制所带来的影响。 signal() 概述 signal()函数是UNIX/Linux中的一个系统调用,用于注册信号处理程序。

    19930

    中断通信及signal()解读

    中断通信 进程间通信方式有多种,其中中断通信是一种常见的方式,它基于信号机制,可以在不同进程之间进行通信。...中断通信的实现方式是,一个进程向另一个进程发送一个特定的信号,该信号被接收进程捕获,并进行相应的处理。...中断通信的步骤如下: 1)发送进程通过kill()函数向接收进程发送信号,信号类型可以自行指定。...需要注意的是,中断通信是一种异步通信方式,即发送进程和接收进程之间并不存在直接的同步机制。...因此,在设计使用中断通信的系统,需要充分考虑这种异步机制所带来的影响。 signal() 概述 signal()函数是UNIX/Linux中的一个系统调用,用于注册信号处理程序。

    41720

    CPU中断概念与案例

    2 概念 2.1 中断概念 linux中断会打断CPU当前的工作,中断一般都设计的短小精悍。...但是也为了解决中断处理程序执行时间过长和中断丢失的问题,Linux中断分为两个阶段: 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理硬件相关和时间敏感的工作 下半部用来延迟处理上半部未完成的工作...不过要注意的是,中断不只包括了刚刚所讲的硬件设备中断处理程序的下半部,一些内核自定义的事件也属于中断,比如内核调度和RCU 锁(Read-Copy Update 的缩写,RCU是 Linux 内核中最常用的锁之一...运行下面的命令,查看 /proc/softirqs 文件的内容,你就可以看到各种类型中断在不同 CPU 上的累积运行次数 在查看 /proc/softirqs 文件内容,你要特别注意以下这两点。...另外,刚刚提到过,中断实际上是以内核线程的方式运行的,每个 CPU 都对应一个中断内核线程,这个中断内核线程就叫做 ksoftirqd/CPU 编号。那要怎么查看这些线程的运行状况呢?

    1.4K20

    Linux内核18-中断异常的嵌套处理

    所以,内核态程序被激活的方式有: 系统调用(异常的一种) 异常 中断 内核线程 上面的任意一种方式,都可以让CPU执行内核态的代码。...使用内核控制路径的好处就是,它是从英语直译过来的,可能会更好地表达程序代码执行的顺序性,是一个过程;这样在描述中断嵌套更有意义。...而页错误异常发生在内核态,它是内核在访问物理地址不存在引发的异常。处理这样的异常,内核挂起当前进程,切换到新进程,直到该请求页可用。...所以,中断的执行不会引起进程的切换,也就可以无限嵌套处理。 中断处理程序可以打断中断异常处理程序执行,但是反过来,异常不能打断中断处理程序。...中断处理程序绝对不能包含页错误的操作,因为这会诱发进程切换。 Linux嵌套执行中断异常处理程序的两个主要原因是: 为了提高可编程中断控制器和设备控制器的吞吐量。

    2.1K20

    中断异常和系统调用

    思维导图 中断的作用 CPU上会有两种程序 操作系统内核程序 应用程序 中断是让操作系统内核夺回CPU使用权的唯一途径 内核态 —-> 用户态: 执行一条特权指令,—修改PSW的标志位为”用户态“, 这个动作意味着操作系统主动让出...CPU使用权 用户态 —-> 内核态: 由中断引发, 硬件自动完成变态的过程 ,触发中断信号意味着操作系统将强行夺回CPU的使用权。...中断的类型 内中断异常) 与当前执行的指令有关, 中断信号来源于CPU内部 陷阱、 陷入(trap ) 由陷入指令引发的, 是应用程序故意引起的 故障 ( fault ) 由错误条件引起的 , 可能被内核程序修改...外中断 与当前执行的指令无关, 中断信号来源于CPU外部 中断机制的基本原理 不同的中断信号 ,需要用不同的中断处理程序来处理, 当cpu检测到中断信号后, 会根据中断信号的类型去查询”中断向量表“ ,...以此来找到相应的中断处理程序在内存中的存放位置。

    11410

    5-中断异常

    中断异常 本质 发生中断就意味着需要操作系统介入,开展管理工作。由于操作系统的管理工作(如进程切换,分配I/O设备等)需要使用特权指令,所以需要CPU由用户态切换到核心态。...有了中断,才能实现多道程序并发执行 概念 中断发生,CPU立即进入核心态 中断发生后,当前进程暂停运行,并由操作系统内核对中断进行处理 对于不同的中断信号,会进行不同的处理 用户态切换到核心态是通过中断实现的...,并且中断是唯一的实现方式 核心态到用户态的切换只需要执行一个特权指令,将程序状态字(PSW)的标志位设置为“用户态”即可 中断的分类 内中断 也称为异常,例外,陷入 信号来源:CPU内部,与当前执行的指令有关...内中断还细分为 自愿中断:指令中断,如系统调用时的访管指令(陷入指令,trap指令) 强迫中断:硬件故障(如缺页中断),软件中断(如除0) 内中断另一种分类方式: 陷阱,陷入(trap):有意而为之的异常...也称为中断(狭义上的中断) 信号来源:CPU内部,与当前执行的指令无关 外中断还可以分为 外设请求:如I/O操作完成发出的中断信号 人工干预:如用户强行停止一个进程 外中断处理过程 CPU在用户态下逐条执行指令

    45410

    中断异常概念详解

    有些事情会使你想起在前一章描述的上下文切换,这发生在内核用一个进程替换另一个进程。但是,中断处理与进程切换有一个明显的差异:由中断异常处理程序执行的代码不是一个进程。...可以进一步分为三组,这取决于CPU控制单元产生异常保存在内核态堆栈eip寄存器中的值。...故障(fault):通常可以纠正; 陷阱(trap):在陷阱指令执行后立刻报告; 异常终止(abort):发生了一个严重的错误; 编程异常 在编程者发出请求发生。...编程异常通常也叫做中断(software interrupt),这样的异常由两种常用的用途:执行系统调用及给调试程序通报一个特定的事件。 每个中断异常是由0~255之间的一个数来标识。...非屏蔽中断的向量和异常的向量是固定的,而可屏蔽中断的向量可以通过对中断控制器的编程来改变。 参考资料: 《深入理解LINUX内核》

    1.5K10

    10_异常中断

    R14_svc,R14_irq,R14_fiq,R14_abt和R14_und同样用于在发生中断异常,或者执行转移和链接指令,备份R15的返回值。 ​...当发生异常,此预定的执行顺序将中断,并暂时切换到异常处理程序以处理该异常。 ​...发生异常,内核将保存当前状态和返回地址,进入特定模式,并可能禁用硬件中断。特定的异常程序处理从一个称为该异常异常向量的固定内存地址开始执行。...Linux通常不使用FIQ。由于内核与体系结构无关,因此它不具有多种形式的中断的概念。...某些运行Linux的系统仍可以使用FIQ,但是由于Linux内核从不禁用FIQ,因此它们比系统中的其他任何事物都具有优先权,因此需要格外小心。

    1.3K10
    领券