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

Linux 网络中断半部处理

在 上一篇文章 中,我们介绍了网卡接收和发过数据在 Linux 内核中的处理过程,我们先来回顾一网卡接收和发送数据的过程,如 图1 所示: ?...为了避免这种情况出现,Linux 内核把中断处理分为:中断半部中断半部,上半部在关闭中断的情况进行,而下半部在打开中断的情况进行。...由于中断半部在关闭中断的情况进行,所以必须要快速完成,从而避免中断丢失的情况。而中断半部处理是在打开中断的情况进行的,所以可以慢慢进行。...一般来说,网卡驱动向内核注册的中断处理服务属于 中断半部,如前面介绍的 NS8390网卡驱动 注册的 ei_interrupt 中断处理服务,而本文主要分析网卡 中断半部处理。...对于 Linux 内核的中断处理机制可以参考我们之前的文章 Linux中断处理,这里就不详细介绍了。在本文中,我们只需要知道网络中断半部处理例程为 net_rx_action 函数即可。

2.3K50

Linux中断半部实现机制

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

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

    Linux内核中断半部和底半部的理解

    在大多数真实的系统中,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。   下图描述了Linux内核的中断处理机制。...为了在中断执行时间尽量短和中断处理需完成的工作尽量大之间找到一个平衡点,Linux中断处理程序分解为两个半部:顶半部和底半部。 ?   ...尽管顶半部、底半部的结合能够善系统的响应能力,但是,僵化地认为Linux设备驱动中的中断处理一定要分两个半部则是不对的。如果中断处理的工作本身很少,则完全可以直接在顶半部全部完成。   ...其他操作系统中对中断处理也采用了类似于 Linux的方法,真正的硬件中断服务程序都斥尽量短。...软中断适度线程化,可以缓解高负载情况系统的响应。

    1.8K30

    Linux中断半部机制的对比

    Linux有以下几种下半部机制: 软中断 tasklet workqueue threaded irq  中断服务程序一般都是在中断请求关闭的条件执行的,以避免嵌套而使中断控制复杂化。...因此,Linux内核的目标就是尽可能快的处理中断请求,尽其所能把更多的处理向后推迟。...例如,假设一个数据块已经达到了网线,当中断控制器接受到这个中断请求信号时,Linux内核只是简单地标志数据到来了,然后让处理器恢复到它以前运行的状态,其余的处理稍后再进行(如把数据移入一个缓冲区,接受数据的进程就可以在缓冲区找到数据...因此,内核把中断处理分为两部分:上半部(tophalf)和下半部(bottomhalf),上半部(就是中断服务程序)内核立即执行,而下半部(就是一些内核函数)留着稍后处理。   ...首先,一个快速的“上半部”来处理硬件发出的请求,它必须在一个新的中断产生之前终止。

    25010

    Linux中断处理

    中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断处理过程。...处理中断后,调用 do_softirq() 函数来对中断半部进行处理(下面会说)。...中断处理 - 下半部(软中断) 由于中断处理一般在关闭中断的情况执行,所以中断处理不能太耗时,否则后续发生的中断就不能实时地被处理。...鉴于这个原因,Linux中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一半部 的执行。...一般中断半部 只会做一些最基础的操作(比如从网卡中复制数据到缓存中),然后对要执行的中断半部 进行标识,标识完调用 do_softirq() 函数进行处理

    6.6K20

    Linux 中断处理浅析

    最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想....注册的中断处理函数有个中断开关属性, 一般情况, 中断处理函数总是在关中断的情况进行的....中断处理的这几个阶段中不能调用可能导致睡眠的函数(包括分配内存); 对于第一个问题, 较新的linux内核增加了ksoftirqd内核线程, 如果持续处理的softirq超过一定数量, 则结束中断处理过程...据说在montavista(一种嵌入式实时linux)中, 将内核的中断机制做了修改. (某些中断的)中断处理过程被赋予了task结构, 能够被内核调度. 解决了上述两个问题....工作队列 linux基线版本的内核在解决上述问题上, 提供了workqueue机制.

    7.4K80

    linux内核缺页中断处理

    缺页中断处理一般流程: 1.硬件陷入内核,在堆栈中保存程序计数器,大多数当前指令的各种状态信息保存在特殊的cpu寄存器中。 2.启动一个汇编例程保存通用寄存器和其他易丢失信息,以免被操作系统破坏。...9.调度引发缺页中断的进程,操作系统返回调用他的汇编例程 10.该例程恢复寄存器和其他状态信息,返回到用户空间继续执行,就好像缺页中断没有发生过。...linux内核对缺页异常的处理流程很复杂,但是基本思想和上述流程差不多。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...* *这里不适用current因为有可能处于任务切换的中断内 */ pgd_paddr = read_cr3(); //从cr3获取页目录地址 //获取中间目录的地址,在i386就是

    10.7K22

    Linux中断机制:硬件处理,初始化和中断处理

    来源: CSDN | phenix_lord的专栏 硬件处理 最近解决一个关于Linux中断的问题,把相关机制整理了一遍,记录在此。...3、 对X86系统,CPU利用从中断控制器获取到的vector为索引,查询IDT (interrupt descriptor table)得到该中断处理接口(对linux,是在entry_64.s中定义的函数...针对X86中断控制器硬件和linux对这些硬件的初始化,在《interrupt in linux》中有很详细的描述。...MSI/MSI-X模式 在这种模式,PCI设备通过和数据DMA一样的通道来完成中断处理,通过向特定地址空间(系统FSB Interrupt存储器空间)发起一个写操作来发起中断。...level 触发: 这种模式,外设通过把电压保持到某个门限值来完成触发中断,在处理完成(EOI)后,如果电压还在门限值,就会再次触发中断的执行。

    8K31

    Linux 内核如何处理中断

    中断服务程序(ISR)是一个小的程序,用来处理具体的数据,其具体的处理方式依赖于造成中断请求(IRQ)的原因。之前正在运行的进程在中断服务程序(ISR)运行结束前都会被中断。...硬件中断 当一个硬件设备想要告诉 CPU 某一需要处理的数据已经准备好后(例如:当键盘被按或者一个数据包到了网络接口处),它将会发送一个中断请求(IRQ)来告诉 CPU 数据是可用的。...当系统需要实时性时(例如在工业应用中),软件中断会变得重要。你可以在 Linux 基金会的文章中找到更多相关信息:面向嵌入式开发者的实时 Linux 介绍。...在这种情况,你会被一个弹窗提醒,或在控制台输出中看到** 段错误(segmentation fault)( 核心已转储(core dumped))**。但并不是所有异常都是由指令错误引起的。...其中一些在 Linux 内核源树中的Linux IRQ 向量布局中指定。 如果要实时获取该表,请运行如下命令: watch -n1 "cat /proc/interrupts"

    2.4K40

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

    类似中断半部的tasklet机制对中断处理函数的延迟处理,下半部tasklet也可以应用到tracepoint回调函数上,从而提升回调函数blk_add_trace_rq_insert1的并发处理能力...三、丢失tasklet的原因 针对这个部分下半部tasklet丢失的问题,再次查阅kernel的经典教材,在《Linux Kernel Development 3rd Edition》的8.3.2小节中发现了...为了搞清楚这个问题,我们来分析一tasklet_schedule()函数的源码。 函数中关键部分是 if (!...按照这样的思路,我们不难从内核usb驱动部分找到一段中断半部tasklet的经典使用场景。...从usbatm的代码实例中,我们可以了解到tasklet也是使用了tasklet_init的第三个参数实现了中断半部和下半部之间的参数传递。

    1.5K40

    Linux 中断子系统(三):中断处理知识点大全

    如果这个 /proc/irq/{IRQ}/smp_affinity 指定为 00000001,代表这个IRQ只能在最后一个CPU核进行处理,其他CPU不允许处理,大家可以测试一,博主测试是 OK 的(...所以 Linux : 1、高优先级中断无法抢占正在执行的低优先级中断。 2、同处于 pending 状态的中断,优先响应高优先级中断进行处理。...这样是可以理解的,如果万一中断大量爆发,中断如果允许嵌套的话,栈会越来越大,会爆掉,所以为了防止这种情况发生,Linux中断不允许嵌套,单CPU中,在一个中断处理完之前,不会相应另外一个中断,哪怕优先级比它高...在中断处理过程中,主要是 GIC 和 CPU 的交互,即便 GIC 支持高优先级中断抢占正在执行的低优先级中断,发信号给 CPU core,但是 CPU core 可以不处理,因为 Linux 中当 CPU...对于这类中断linux kernel有一套复杂的机制来处理,你可以通过command line参数(noirqdebug)来控制开关该功能。

    5.3K20

    一文完全读懂 | Linux中断处理

    中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断处理过程。...处理中断后,调用 do_softirq() 函数来对中断半部进行处理(下面会说)。...中断处理 - 下半部(软中断) 由于中断处理一般在关闭中断的情况执行,所以中断处理不能太耗时,否则后续发生的中断就不能实时地被处理。...鉴于这个原因,Linux中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一半部 的执行。...一般中断半部 只会做一些最基础的操作(比如从网卡中复制数据到缓存中),然后对要执行的中断半部 进行标识,标识完调用 do_softirq() 函数进行处理

    2.8K20

    Linux内核21-Linux内核的中断处理过程

    Linux中断要执行的操作分为三类: 关键中断 比如响应PIC控制器发送的中断,重新编程设置PIC或者设备控制器,更新设备和处理器访问的数据结构等。...非关键中断 更新只有处理器访问的数据结构的中断请求(比如,读取键盘按键按后的键码)。这类中断中断处理程序中也能很快完成处理。...为了统一处理这些硬件,Linux内核使用了面向对象的编程思想,构建了一个PIC对象,包含PIC名称和7个PIC标准方法。...设置了IRQ_INPROGRESS 多核系统中,此时可能另外一个CPU可能正在处理先前发生的相同中断Linux对此的处理方式就是延后处理。...比如我们以Linux4.4.203内核对于中断处理为例,与上面的处理过程进行比较,理解其主要变化。 调用do_IRQ函数。其入口位于entry_32.S文件中,是C语言实现的。

    2.3K20

    Linux中断 - IDT

    [toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux..._syscall_32, 这个函数中就会执行具体的中断处理,然后INTERRUPT_RETURN恢复栈,作好返回用户态的准备。...nr从ia32_sys_call_table中断向量表中索引到具体的中断处理函数然后调用之,其结果最终合存入%eax寄存器。...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一: void __init init_IRQ(void) { int

    6.6K10

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

    讲解这部分之前,我们先阐述一个概念-内核控制路径:就是一段在内核态执行的代码,比如说,异常处理程序,中断处理程序,系统调用处理,内核线程等等在内核态执行的代码。...图4-3 内核控制路径的一个嵌套异常的示例 允许内核控制路径嵌套的代价就是中断处理程序不能阻塞,也就是说,中断处理程序运行时不能发生进程切换。...所以,中断的执行不会引起进程的切换,也就可以无限嵌套处理中断处理程序可以打断中断或异常处理程序执行,但是反过来,异常不能打断中断处理程序。...中断处理程序绝对不能包含页错误的操作,因为这会诱发进程切换。 Linux嵌套执行中断或异常处理程序的两个主要原因是: 为了提高可编程中断控制器和设备控制器的吞吐量。...内核正在处理一个中断的时候,能够及时响应另一个中断。 实现没有中断优先级的模型。这可以简化内核代码并提高可移植性。 在多核系统中,几个中断或异常处理程序可能会并发执行。

    2.1K20

    关于 JavaScript 错误处理的最完整指南(下半部)

    使用 Promise 处理错误 为了演示 Promise 处理方式,我们先回到一开始的那个事例: function toUppercase(string) { if (typeof string !...使用 Promise 来处理定时器中的异常 使用定时器或事件无法捕获从回调引发的异常。...catch(reason => console.error(reason.message)); Node 中的错误处理 Node 中的同步错误处理 Node.js 中的同步错误处理与到目前为止所看到的并没有太大差异...Node.js 中的异步错误处理:回调模式 对于异步代码,Node.js 主要使用这两种方式: 回调模式 event emitters 在回调模式中,异步 Node.js API 接受一个函数,该函数通过事件循环处理...大多数情况,emitter object 和一些观察者进行交互以侦听消息。 Node.js中的任何事件驱动模块(例如net)都扩展了一个名为EventEmitter的根类。

    2.3K20

    中断机制和中断描述符表、中断和异常的处理

    Intel x86 处理器发布了大约20 种异常,Linux 内核必须为每种异常提供一个专门的异常处理程序,它们通常把一个UNIX 信号发送到引起异常的进程。...在实模式中断向量表中的表项由8 个字节组成,如图3.2 所示,中断向量表也改叫做中断描述符表IDT(Interrupt Descriptor Table)。...当控制权通过中断门进入中断处理程序时,处理器清IF 标志,即关中断,以避免嵌套中断的发生。...通过系统门来激活4 个Linux 异常处理程序,它们的向量是3、4、5 及128,也就是说,在用户态,可以使用int 3、into、bound 及int 0x80 四条汇编指令。...最后,在保护模式中断描述符表在内存的位置不再限于从地址0 开始的地方,而是可以放在内存的任何地方。为此,CPU 中增设了一个中断描述符表寄存器IDTR,用来存放中断描述符表在内存的起始地址。

    3.6K10

    DragonOS的中断处理设计

    在这里简单记录一目前DragonOS中的中断处理的设计吧。...* @param irq_num 中断向量号   * @param arg 传递给中断安装接口的参数   * @param handler 中断处理函数   * @param paramater 中断处理函数的参数...可作为中断半部使用,任务处理实时性低于硬中断。 软中断模块设计与硬中断的设计类似。其包括了一个软中断向量表及一些函数模型。...2.1软中断向量表表项定义 表项类型定义为softirq_t 成员 类型 参数 返回值 描述 action 函数 void*data void 软中断处理函数 data void* – – 传递给软中断处理函数的数据...unregister_softirq  * @param irq_num 软中断号 2.4软中断处理程序do_softirq 在该函数中,先检测软中断是否正在被处理,如果空闲,则发起处理并置位标志位。

    63320
    领券