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

Linux 中断机制分析

中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下中断,也就是softirq。之后还会总结一些tasklet、工作队列机制。...这样的后果会造成有可能丢失外部中断。于是,linux内核设计出了一种架构,中断函数需要处理的任务分为两部分,一部分在中断处理函数中执行,这时系统关闭中断。...只有在进入了中断处理过程中之后才会开启硬件中断,如果在软件中断处理过程中有硬件中断嵌套,也不会再次调用中断,because硬件中断是软件中断处理过程中再次进入的,此时preempt_count已经记录了软件中断...Linux内核就中断方面就必须考虑平衡这三个方面的问题。而下面我要分析的__do_softirq函数就恰似在这三者之间打太极,游刃有余,面面俱到!...重新设置中断标记为0,set_softirq_pending重新设置中断标记为0,这样在之后重新开启中断之后硬件中断中又可以设置软件中断位。 7. 开启硬件中断 8.

8.7K91

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

linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。中断不能嵌套,但相同类型的中断可以在不同CPU上并行执行。...(4)中断指令 int是中断指令。 中断向量表是中断号和中断处理函数地址的对应表。 int n -- 触发软中断n。相应的中断处理函数的地址为:中断向量表地址 + 4 * n。...(5)硬中断中断的区别 中断是执行中断指令产生的,而硬中断是由外设引发的。 硬中断中断号是由中断控制器提供的,中断中断号由指令直接指出,无需使用中断控制器。...但一个中断不会抢占另一个中断,唯一可以抢占中断的是硬中断

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

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

    linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间 就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是中断(softirq)来完成。...(3) 中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断 除外。...中断不能嵌套,但相同类型的中断可以在不同CPU上并行执行。 (4) 中断指令 int是中断指令。 中断向量表是中断号和中断处理函数地址的对应表。 int n – 触发软中断n。...硬中断中断号是由中断控制器提供的,中断中断号由指令直接指出,无需使用中断控制器。 硬中断是可屏蔽的,中断不可屏蔽。...但一个中断不会抢占另一个中断,唯一可以抢占中断的是硬中断

    2.7K40

    中断SOFTIRQ

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

    2.4K21

    Linux内核22-中断和tasklet

    这对于时间苛刻的应用来说,这是一个很重要的属性,尤其是那些要求中断请求必须在毫秒级别响应的应用。 Linux2.6内核使用两种手段满足这项挑战:中断和tasklet,还有工作队列。...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个元素。...这在Linux内核中是禁止的,因为其可延时函数的执行都是串行的。所以,在此需要禁止中断。 清除正在执行的中断对应掩码位。 执行local_irq_enable()使能中断

    1.6K30

    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.8K20

    中断和实时性

    中断和实时性 翻译自:Software interrupts and realtime Linux内核的中断("softirq")机制有些奇怪,在早期的Linux和处理机制下比较晦涩,且仅有极少的内核开发人员会直接接触中断...在很早以前,Linux存在32个硬中断向量,并为每个向量分配一个设备驱动或相关的任务。...一旦线程退出,内核会禁用该中断的上下文,并运行下一个中断,使用这种方式可以减小处理中断的延迟(由于会立即运行下一个中断)。同样重要的是,这种方式将中断和产生该中断的进程绑定到了一起。...TIPS: linux中断按照等级分为了top half和buttom half,在执行top half的时候是关中断的,而在执行buttom half的时候是开中断的(此时可以再次处理中断) softirq...参考: Linux中断 - softirq

    2.1K20

    中断通信简介

    中断通信简介中断通信是进程间通信的一种常见方式,它基于信号机制,允许不同进程之间进行通信。在中断通信中,一个进程向另一个进程发送特定的信号,接收进程捕获信号并执行相应的处理。...中断通信的实现步骤如下:信号发送:发送进程使用kill()函数向接收进程发送信号,信号类型可以自行指定。...signal()函数概述signal()函数是UNIX/Linux系统中用于注册信号处理程序的系统调用。...信号是操作系统中的一种通知机制,用于通知进程发生了某些事件,如接收到外部中断或其他进程发送的信号。...signal()与常见信号SIGINTSIGINT是由键盘生成的中断信号,通常由用户按下Ctrl + C组合键发送给前台进程组的所有进程。

    15510

    进程通信 中断 signal()解读

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

    22930

    中断通信及signal()解读

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

    46420

    CPU中断概念与案例

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

    1.4K20

    中断会吃掉你多少CPU?

    我们没必要啃明白中断的所有原理,但从一名追求性能的开发者的角度来看,我们有必要了解以下问题: 1、一次中断的开销到底多大? 2、你的服务器上被中断吃掉了多少CPU时间?...所以现代的Linux又发明了软件中断,配合硬中断来处理网络IO。硬中断你可以理解只是个收包的,把包收取回来放到“家里”就完事,很快就能完成,这样不耽误CPU响应其它外部高优先级的中断。...中断消耗的CPU周期相对比硬中断要多不少,所以我们本文来重点关注中断的开销。 2 中断的开销估算 前面大致介绍了中断的来龙去脉,好了直接进入本文的主题上,中断开销到底多大。...让我们将他们进行一个简单的对比: 1)和系统调用开销对比 《深入理解Linux内核-第五章》开头的一句话,很形象地把中断和系统调用两个不相关的概念联系了起来,巧妙地找到了这二者之间的相似处。...大家感兴趣的,可以继续阅读《深入理解Linux内核》的-第五章。 根据前文的实验结果,进程上下文切换开销是3us-5us。

    1.3K20

    记录一个中断问题

    前些天发现XEN虚拟机上的Nginx服务器存在一个问题:中断过高,而且大部分都集中在同一个CPU,一旦系统繁忙,此CPU就会成为木桶的短板。...在问题服务器上运行「top」命令可以很明显看到「si」存在异样,大部分中断都集中在 1 号CPU上,其它的CPU完全使不上劲儿: shell> top Cpu0: 11.3%us, 4.7%sy,...了解了这些基本知识,我们可以尝试换一个CPU试试看会发生什么: echo 7 > /proc/irq/45/smp_affinity_list 再通过「top」命令观察,会发现处理中断的CPU变成了...好消息是Linux支持RPS,通俗点来说就是在软件层面模拟实现硬件的多队列网卡功能。...最后,推荐看看香草总结的一些关于中断方面的资料和工具,很全面。

    78830

    Linux内核中的中断、tasklet和工作队列具体解释

    [TOC] 本文基于Linux2.6.32内核版本号。...引言 中断、tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的“下半部”(bottom half)演变而来。 下半部的机制实际上包含五种,但2.6版本号的内核中。...中断运行函数 do_softirq-->__do_softirq 运行中断处理函数__do_softirq前首先要满足两个条件: (1)不在中断中(硬中断中断和NMI) 。...中断内核线程 之前我们分析的触发软件中断的位置事实上是中断上下文中,而在中断的内核线程中实际已经是进程的上下文。...详细流程图例如以下所看到的: ---- 是否处于中断中在Linux中是通过preempt_count来判断的,详细例如以下: 在linux系统的进程数据结构里,有这么一个数据结构: #define

    2.1K30

    Linux中断处理

    中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断的处理过程。...中断处理 - 下半部(中断) 由于中断处理一般在关闭中断的情况下执行,所以中断处理不能太耗时,否则后续发生的中断就不能实时地被处理。...鉴于这个原因,Linux中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 的执行。...softirq机制 中断下半部 由 softirq(中断) 机制来实现的,在Linux内核中,有一个名为 softirq_vec 的数组,如下: static struct softirq_action...NET_TX_SOFTIRQ 和 NET_RX_SOFTIRQ 特定用于网络子模块的中断(不作介绍)。

    6.6K20

    Linux中断 - IDT

    [toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...pre-cpu的中断栈,还是使用IST的中断栈; type表示所中断是何种类型,目前有以下四种: enum { GATE_INTERRUPT = 0xE, //中断门 GATE_TRAP...传统系统调用相关 IDT 的设置 Linux系统启动过程中内核压解后最终都调用到start_kernel, 在这里会调用trap_init, 然后又会调用idt_setup_traps: void...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int

    6.6K10

    点个外卖,我把「中断」搞懂了

    Linux 系统为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分成了两个阶段,分别是「上半部和下半部分」。...在 Linux 系统里,我们可以通过查看 /proc/softirqs 的 内容来知晓「中断」的运行情况,以及 /proc/interrupts 的 内容来知晓「硬中断」的运行情况。...---- 总结 为了避免由于中断处理程序执行时间过长,而影响正常进程的调度,Linux中断处理程序分为上半部和下半部: 上半部,对应硬中断,由硬件触发中断,用来快速处理中断; 下半部,对应中断,...由内核触发中断,用来异步处理上半部未完成的工作; Linux 中的中断包括网络收发、定时、调度、RCU 锁等各种类型,可以通过查看 /proc/softirqs 来观察中断的累计中断次数情况,如果要实时查看中断次数的变化率...如果在 top 命令发现,CPU 在中断上的使用率比较高,而且 CPU 使用率最高的进程也是中断 ksoftirqd 的时候,这种一般可以认为系统的开销被中断占据了。

    1.2K31

    LWN:把中断锁放到更底层去!

    最初,Linux 内核是在单处理器系统上开发的 —— 当然可以理解,因为那时我们手头只有这种系统 —— 因此,代码在很大程度上基于这样的假设:它在 CPU 上运行,完全不存在其他的 CPU。...于是 BKL 最终需要被引入,才能让 Linux 能够运行在那些产业分析师向我们保证的未来将会大行其道的多处理器机器上。...总之,与 BKL 一样,中断反映了几十年前很适用但是现在存在问题的一种设计。 其中一个设计上的决策是,中断处理程序需要互斥;在任何给定的 CPU 上,只能执行一个中断处理程序。...因此,如果块设备的中断处理程序运行时间很长,那么网络和定时器处理程序可能就会被无限期地延迟。即使不同类型的中断处理程序之间很少出现竞争,情况仍然是如此。...第一步是允许单个中断向量在不完全禁用中断处理的情况下被禁用。这个 patch set 的目的是允许定时器函数与其他中断并发运行,但它们仍然不会跟彼此并发运行。

    22020
    领券