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

Linux中断下半部实现机制

中断上、下半部产生背景 由于内核中中断不允许嵌套,在程序进入中断后,系统会关闭中断接收,这段时间内,其他中断都无法处理导致中断无法响应,因此需要当前进入的中断子服务函数越快越好。...但是在一些特殊情况下,中断要处理的事情可能是复杂且冗长的,为解决这种问题, 中断下半部的概念顺势而生。将中断拆成两部分,上半部用来处理紧急的事情;下半部用来处理不紧急的事情。 2....此时选择内核线程来处理下半部:在中断上半部将下半部处理函数放入工作队列,且唤醒工作队列线程,然后退出中断。包含下半部的工作队列与APP都有机会执行,不会造成卡顿。...下半部实现 void my_func() { } c....(3) 线程中断:由于工作队列每次只能处理一个中断下半部,但是内核支持多线程,因此出现为每一个中断下半部开辟一个线程处理。将多个中断下半部线程分配给多个CPU上执行,提高效率。

3.2K10

Linux 网络中断下半部处理

为了避免这种情况出现,Linux 内核把中断处理分为:中断上半部 和 中断下半部,上半部在关闭中断的情况下进行,而下半部在打开中断的情况下进行。...由于中断上半部在关闭中断的情况下进行,所以必须要快速完成,从而避免中断丢失的情况。而中断下半部处理是在打开中断的情况下进行的,所以可以慢慢进行。...对于 Linux 内核的中断处理机制可以参考我们之前的文章 Linux中断处理,这里就不详细介绍了。在本文中,我们只需要知道网络中断下半部处理例程为 net_rx_action 函数即可。...网络中断下半部处理 上面说了,网络中断下半部处理例程为 net_rx_action 函数,所以我们主要分析 net_rx_action 函数的实现: static void net_rx_action(...总结 本文主要介绍了网络中断下半部的处理,从分析可知,网络中断下半部主要工作是从待处理队列中获取数据包,并且根据数据包的网络层协议类型来找到相应的处理接口,然后把数据包交由网络层协议处理接口进行处理。

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

    Linux中断下半部机制的对比

    Linux有以下几种下半部机制: 软中断 tasklet workqueue threaded irq  中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。...因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟。...因此,内核把中断处理分为两部分:上半部(tophalf)和下半部(bottomhalf),上半部(就是中断服务程序)内核立即执行,而下半部(就是一些内核函数)留着稍后处理。   ...下半部运行时是允许中断请求的,而上半部运行时是关中断的,这是二者之间的主要区别。   但是,内核到底什时候执行下半部,以何种方式组织下半部?...中断线程(threaded_irq) 前面讲的硬中断,它是外设中断处理中必不可少的一部分

    26910

    高并发的中断下半部tasklet实例解析

    类似中断下半部的tasklet机制对中断处理函数的延迟处理,下半部tasklet也可以应用到tracepoint回调函数上,从而提升回调函数blk_add_trace_rq_insert1的并发处理能力...查阅国内外各种kernel的经典教材中的中断下半部tasklet部分内容,在介绍使用tasklet时,都需要静态或动态创建一个全局tasklet全局变量。...三、丢失tasklet的原因 针对这个部分下半部tasklet丢失的问题,再次查阅kernel的经典教材,在《Linux Kernel Development 3rd Edition》的8.3.2小节中发现了...按照这样的思路,我们不难从内核usb驱动部分找到一段中断下半部tasklet的经典使用场景。...从usbatm的代码实例中,我们可以了解到tasklet也是使用了tasklet_init的第三个参数实现了中断上半部和下半部之间的参数传递。

    1.5K40

    Linux中断处理

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

    6.6K20

    Linux中断 - IDT

    [toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...传统系统调用相关 IDT 的设置 Linux系统启动过程中内核压解后最终都调用到start_kernel, 在这里会调用trap_init, 然后又会调用idt_setup_traps: void...ENDPROC(entry_INT80_32) 我们略去了中间的一些细节部分,可以看到首先将中断向量号压栈,再保存所有当前的寄存器值到pt_regs, 保存当前栈指针到%eax寄存器,最后再调用 do_int80...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int

    6.6K10

    xv6(4) 中断理论部分

    ,以什么方式触发中断,传送的方式状态,管脚极性等等,这是 $ZX_WING$ 大佬在他的 $Interrupt\ in\ Linux$ 中总结出来的,很全面也很复杂,只说几点: $destination...如果优先级别设置为 15,则不会接受任何中断,如果优先级别设置为 0,表示接受所有中断,这也是 $Linux$ 设置的默认值。...OS 部分 中断服务程序我也分为了三部分中断入口程序,中断处理程序,中断退出程序。...中断完成,接着原任务执行 软件中断 最后这一部分简单说说软件中断($Software$-$Generated$ $Interrupts$),注意软件中断和 $Linux$ 里面上下半部分中的软中断机制是两个不同的概念...这里软件中断指的就是 $INT$ $n$ 指令来模拟一个 $n$ 号中断。以前 $Linux$ 中系统调用就是使用 $int$ 0x80 来实现的。

    29700

    xv6(5) 中断代码部分

    不多说废话了,来看 $xv6$ 的中断机制 环境准备(APIC部分) 中断机制要正确运行,得有个正确的环境,这一部分就来说说中断需要哪些,这也是启动的一部分。...关于 Arb,引用 $Interrupt in Linux$ 中的解释: Arb,Arbitration Register,仲裁寄存器。...环境准备(OS部分) 这部分继续来说环境准备 $OS$ 部分,主要就是构建中断描述符表 $IDT$,注册中断服务程序。构建 $IDT$ 就是构建一个个门描述符,它们集合起来就是 $IDT$。...中断入口程序主要就是要保存上下文,上下文可分为两部分,一部分是 $CPU$ 自动压入的,另一部部分是 $OS$ 来完成的。所以我们的中断入口也分为两部分,分别处理这两部分上下文。...中断流程 上述就是中断机制的环境配置,也简要的说了部分中断流程,这儿来详细说明,还是那三个大步骤: 保存上下文,分为两部分,一部分 $CPU$ 自动压入,一部分执行中断入口程序压入 执行中断处理程序 恢复上下文

    28100

    Linux 中断处理浅析

    最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想....把不可重入的一部分中断处理程序中(关中断)去完成, 然后调用raise_softirq设置一个软中断, 中断处理程序结束. 后面的工作将放在soft_irq里面去做....于是, 一个中断处理过程被分成了两部分, 第一部分中断处理函数里面关中断的进行, 第二部分在软中断处理函数里面开中断的进行....据说在montavista(一种嵌入式实时linux)中, 将内核的中断机制做了修改. (某些中断的)中断处理过程被赋予了task结构, 能够被内核调度. 解决了上述两个问题....工作队列 linux基线版本的内核在解决上述问题上, 提供了workqueue机制.

    7.4K80

    linux 中断机制《Rice linux 学习笔记》

    这篇文章以按键为例子讲解linux中断原理,中断的架构,中断的实现。 在我们的开发中,检测按键是否触发,无非就两种方法—轮询和中断。作者认为两种方法最大的区别就是CPU的利用率。...Linux中断原理: 中断:处理器异常的一种,它是一种特殊的电信号,用硬件发给处理器,处理器接收到中断后,会马上向操作系统反映此信号的到来,然后就由操作系统负责处理这些新到来的数据。...中断上下部:为了是程序运行得快和完成的工作量多,将中断处理分为两部分,上半部和下半部,其中,上半部(中断处理程序):接收到中断,立马要执行的程序,只做有严格时限的工作。下半部:允许稍后完成的工作。...Linux中断的相关函数: 1、注册中断函数: 中断处理函数结构: typedef irqreturn_t (*irq_handler_t)(int, void*); 注册中断函数:int request_irq...Linux中断实现: 这里例子采用等待队列的方式实现(也就是上述的第二种方法)。

    4.7K10

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

    linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。...硬中断是可屏蔽的,软中断不可屏蔽。 硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。 软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。...等: local_bh_disable(); local_bh_enable(); 需要注意的是,禁止下半部时仍然可以被硬中断抢占。...(1)定义 软中断是一组静态定义的下半部接口,可以在所有处理器上同时执行,即使两个类型相同也可以。

    22.2K21

    Linux中断虚拟化(二)

    ,第1部分是从当前pending的中断中取得最高优先级的中断,当前之前需要滤掉被被屏蔽的中断。...第2部分是获取正在被CPU处理的中断的优先级的中断的优先级,通过这里,读者更能具体的理解了8259A为什么需要这些寄存器记录中断的状态。...所以在AEOI模式下(上面代码的if分支),需要将收到EOI时8259A需要处理的逻辑完成,这部分内容我们在下一节会讨论。 对于边缘触发的,进入到ISR阶段后,需要复位对于IRR。...对于level trigger的,在收到中断请求后8259A处理,不过多讨论了,如果读者有兴趣,可以阅读函数pic_set_irq1中关于水平触发部分的逻辑。...表3-1 VM-entry interruption-information格式(部分) 位 内容 7:0 中断或异常向量 10:8 中断类型:0: External interrupt1: Reserved2

    6K10

    Linux中断机制分析

    中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下软中断,也就是softirq。之后还会总结一些tasklet、工作队列机制。...这样的后果会造成有可能丢失外部中断。于是,linux内核设计出了一种架构,中断函数需要处理的任务分为两部分,一部分中断处理函数中执行,这时系统关闭中断。...另外一部分在软件中断中执行,这个时候开启中断,系统可以响应外部中断。 关于软件中断的理论各种书籍都有介绍,不多叙述。而要真正体会软件中断的作用就必须从代码的角度来分析。...在linux系统的进程数据结构里,有这么一个数据结构 #define preempt_count()(current_thread_info()->preempt_count), 利用preempt_count...Linux内核就中断方面就必须考虑平衡这三个方面的问题。而下面我要分析的__do_softirq函数就恰似在这三者之间打太极,游刃有余,面面俱到!

    8.7K91

    Linux 中断子系统(二):GIC 中断控制器

    下图来源于ARM官方手册,是 GIC-v2 的框图: 左侧部分就是中断源,中间部分就是 GIC 控制器,最右侧就是中断控制器向 处理器内核发送中断信息。...我们重点要看的肯定是中间的 GIC 部分,GIC 将众多的中断源分为 分为三类: ①、SPI(Shared Peripheral Interrupt),共享外设中断,该中断来自于外设,所有 Core 共享的中断...比如按键中断、串口中断等等,这些中断所有的 Core 都可以处理,不限定特定 Core。...分发器收集所有的中断源,可以控制每个中断的优先级,它总是将优先级最高的中断事件发送到 CPU 接口端。分发器端要做的主要 工作如下: ①、全局中断使能控制。 ②、控制每一个中断的使能或者关闭。...有一点需要说明:不管 GIC 如何对中断进行分类,对 CPU core 来讲,只分为 IRQ、FIQ、VIRQ、VFIQ,一般所有的外部中断对CPU core来讲都属于IRQ: 即便在 GIC 内部分为了

    5.9K20
    领券