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

Linux中断下半部实现机制

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

3.1K10

Linux 网络中断下半部处理

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

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

Linux中断下半部机制的对比

Linux有以下几种下半部机制: 软中断 tasklet workqueue threaded irq  中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。...因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟。...因此,内核把中断处理分为两部分:上半部(tophalf)和下半部(bottomhalf),上半部(就是中断服务程序)内核立即执行,而下半部(就是一些内核函数)留着稍后处理。   ...下半部运行时是允许中断请求的,而上半部运行时是关中断的,这是二者之间的主要区别。   但是,内核到底什时候执行下半部,以何种方式组织下半部?...要执行的函数 */ void *data; /* 传递给函数的参数 */ void *wq_data; /* 内部使用 */ struct timer_list timer; /* 延迟的工作队列所用到的定时器

11810

深入浅出:Linux设备驱动之中断定时器

,我们在进行裸机开发学习的 时候,这几乎就是重难点,也是每个程序必要的模块信息,那么在Linux中,我们又怎么实现延时、计数,和中断呢?...Linux中断处理分为顶半部和底半部,顶半部完成尽可能少得的比较紧急的功能,往往只是简单的完成“登记中断”的工作,就是将底半部处理程序挂到该设备的底半部处理队列中去,中断处理机制如下图: ?...(与通常说的软中断(软件指令引发的中断),比如arm的swi是完全不同的概念) 在linux内核中,用softirq_action结构体表征一个软中断,这个结构体包含软中断处理函数指针和传递给函数的参数...二、定时器/时钟 1、概述 软件意义上的定时器最终依赖硬件定时器来实现,内核在时钟中断发生后检测个定时器释放到期,到期后的定时器处理函数将作为软中断底半部执行。... #include #include #include #include

3K102

高并发的中断下半部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.4K40

STM32定时器中断整理

目录 1、系统异常中断 2、外部中断(全部) 3、优先级 5、如何开关中断示例 6、抢断优先级、响应优先级说明 7、定时器说明 7.1基本定时器 7.2高级/通用定时器 7.3定时器拓展补充-主要特性..., USART_IT_RXNE, DISABLE); /* 关闭串口接收中断 */ 定时器 TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); /* 使能定时器更新中断...*/TIM_ITConfig(TIM4, TIM_IT_Update, DISABLE); /* 关闭定时器更新中断 */ DMA DMA_ITConfig(DEBUG_SPI2_RX_DMA_STREAM...7、定时器说明 STM32F42xxx 系列控制器有2 个高级控制定时器、10 个通用定时器和2 个基本定时器,还有2 个看门狗定时器。 控制器上所有定时器都是彼此独立的,不共享任何资源。...7.2高级/通用定时器 高级控制定时器(TIM1 和TIM8)和通用定时器在在基本定时器的基础上引入了外部引脚,可以输入捕获和输出比较功能。

88720

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...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.5K10

Linux 中断处理浅析

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

7.3K80

ESP8266_06硬件定时器与IO中断

这一节主要有两部分内容:1、GPIO的中断用法;2、硬件定时器的使用。 先说定时器,前面说过了软件定时器的用法,如果你已经掌握了,那么硬件定时器基本是差不多的。...都要设置回调函数、定时时间,区别的话,不用定义结构体,同时要选择中断源。 GPIO的中断也很好理解,跟单片机的管脚用法基本一样,设置为输入模式,开启中断等等~ ?...然后是硬件定时器的使用,使用方法也很简单,共分3步: 1、选择中断源,选择定时器是否自动填充 hw_timer_init(0,1); 该函数共有两个参数:...熄灭的时候,定时器依然在跑,只是管脚始终都拉低了。有人会问,你把定时器关掉不行吗?弄这么麻烦?...到此,硬件定时器和GPIO中断的用法说完了。

1.2K31

Linux定时器例子

如果对你有帮助,麻烦点个在看或点个赞,感谢~ 文章首发 公众号—— Pou光明 程序中难免会使用到定时器,今天给大家介绍Linux中一种定时器的实现。...Linux下还有很多其他定时的实现,如精确定时等,感兴趣的同志可以再做深入了解。 编程到现在,其实很多工作都是在调用api,还没能完全脱离面向“谷歌”编程的实质,面对这种情形,如何破局呢?...一、api简介 NAME timerfd_create, timerfd_settime, timerfd_gettime -通过文件描述符来告知定时器状态。...timerfd_settime() 启动或关闭定时器。 new_value参数指定计时器的初始到期时间和间隔。...{ printf("read timerd failed \n"); return -1; } return 0; } 3、通过文件描述符销毁定时器

3.6K20

Linux定时器实现

一般定时器实现的方式有以下几种: 基于排序链表方式: 通过排序链表来保存定时器,由于链表是排序好的,所以获取最小(最早到期)的定时器的时间复杂度为 O(1)。...时间轮: 但对于Linux这种对定时器依赖性比较高(网络子模块的TCP协议使用了大量的定时器)的操作系统来说,以上的数据结构都是不能满足要求的。所以Linux使用了效率更高的定时器算法:时间轮。...时钟通过时分秒来进行分级,当然我们也可以这样,但对于计算机来说,时分秒的分级不太友好,所以Linux内核中,对32位整型分为5个级别,第一个等级存储0 ~ 255秒 的定时器,第二个等级为 256秒 ~...注意:第二级至第五级数组的第一个槽是不挂任何定时器的。 每级数组上面都有一个指针,指向当前要执行的定时器。每当时间走一秒,Linux首先会移动第一级的指针,然后执行当前位置上的定时器。...Linux时间轮的实现 那么接下来我们看看Linux内核是怎么实现时间轮算法的。

2.9K20

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

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

4.7K10

linux内核缺页中断处理

7.当磁盘中断发生时,表明该页已经被装入,页表已经更新可以反映他的位置,页框也标记位正常状态。 8.恢复发生缺页中断指令以前的状态,程序计数器重新指向这条指令。...9.调度引发缺页中断的进程,操作系统返回调用他的汇编例程 10.该例程恢复寄存器和其他状态信息,返回到用户空间继续执行,就好像缺页中断没有发生过。...linux内核对缺页异常的处理流程很复杂,但是基本思想和上述流程差不多。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...), "=r" (x) : "m"(__m(addr)), "i"(errret), "0"(err)) //"m"(__m(addr)), "i"(4), "0"(4)) 经过以上分析,对linux

10.6K21

Linux中断虚拟化(一)

作者简介 王柏生 资深技术专家,先后就职于中科院软件所、红旗Linux和百度,现任百度主任架构师。在操作系统、虚拟化技术、分布式系统、云计算、自动驾驶等相关领域耕耘多年,有着丰富的实践经验。...著有畅销书《深度探索Linux操作系统》(2013年出版)。 谢广军 计算机专业博士,毕业于南开大学计算机系。资深技术专家,多年的IT行业工作经验。...本文内容节选自《深度探索Linux虚拟化技术》,已获得机械工业出版社华章公司授权。...因此,在本章中,我们简单介绍硬件中断的基本原理,然后结合中断的基本原理讨论如何虚拟化中断芯片。...图2 基于PIC的虚拟中断过程 具体步骤如下: 1)虚拟设备向虚拟中断芯片PIC发送中断请求,虚拟PIC记录下虚拟设备的中断信息。

6.2K30

Linux中断虚拟化(二)

作者简介 王柏生 资深技术专家,先后就职于中科院软件所、红旗Linux和百度,现任百度主任架构师。在操作系统、虚拟化技术、分布式系统、云计算、自动驾驶等相关领域耕耘多年,有着丰富的实践经验。...著有畅销书《深度探索Linux操作系统》(2013年出版)。 谢广军 计算机专业博士,毕业于南开大学计算机系。资深技术专家,多年的IT行业工作经验。...本文内容节选自《深度探索Linux虚拟化技术》,已获得机械工业出版社华章公司授权。...KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/i8259.c void kvm_pic_set_irq(void...= -1) returnvector; … } linux.git/drivers/kvm/i8259.c int kvm_pic_read_irq(struct kvm_pic *s)

5.8K10

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

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

21.4K21
领券