导航:首页 > 操作系统 > linux中断屏蔽

linux中断屏蔽

发布时间:2023-02-07 17:52:50

linux如何保护共享资源

主要有一下几种:中断屏蔽、 原子操作、自旋锁、信号量、环形缓冲区。在本文中对于这些机制的具体的实现函数,以及原理不再做任何的表述。本 一、原子变量 假设我们所需要保护的共享资源只是一个整数值,此时我们可以采用的机制有自旋锁,信号量,和原子变量,当然中断屏蔽也是可以的。但是如果选择最优的机制,我们应该选择原子变量。原因:1.对一个整数值的操作是很简单的,也就是说此对全局变量形成的临界区是很小的.如果我们采用其他的机制,例如锁的机制,信号量等就显得有些浪费.也就是说,你的锁机制的代码量可能比临界区的代码量还要多.2. 对一个缺乏经验的程序员来讲,由于思维缺乏逻辑,使用锁机制会存在很多潜在的风险.例如: 死锁.等问题;而采用原子变量的方法,可以避免锁机制产生的弊端. 二、自旋锁自旋锁机制和信号量机制都可以对资源进行互斥访问,但是从性能上讲,自旋锁的性能优于信号量。但是自旋锁机制本身在不停的自旋(也就是查询锁是否可用),导致此机制有一些缺点:1。假定我们的驱动程序获得了一个自旋锁,在临界区开始了他的工作期间,驱动程序丢掉了处理器。也许他调用了一个函数,这个函数使进程休眠。也许发生了内核的抢占。但是我们的代码拥有这个自旋锁,如果其他的进程想要获得此自旋锁,需要等很长时间,甚至造成死锁。所以我们应用自旋锁时应遵循:任何拥有自旋锁的代码必须是原子的。所以他不能休眠,所以不能调用能够引起休眠的函数。例如:_to_user,_from_user,kmalloc等。也不能因为任何原因放弃处理器,除了中断以外(有时中断也不行,可以采用禁止中断的自旋锁函数操作)。 三、信号量拥有信号量的进程是可以休眠的。这也正是他对于自旋锁的优势。 其他的暂不论述。

❷ linux下 软中断处理函数do_softirq中用了local_irq_disable()来屏蔽中断

中断屏蔽,确实会导致中断丢失。但是,中断控制器本身会保证中断不被丢失。对于水平触发中断,一个中断发送出去,如果没有cpu的ack,会一直悬停在那,直到相应为止。一个边缘触发的中断,是设计成可以丢失的中断,丢失了也无所谓。因为中断控制器会重发。

对于网络数据中的大量中断,有NAPI的方式来实现。

❸ Linux如何及时响应外部中断

FPGA每隔100us给运行linux的ARM一个中断,要求在20us内响应中断,并读走2000*16bit的数据。
目前主要的问题是,当系统同时发生多个中断时,会严重影响linux对FPGA中断的响应时间。如何解决?

1、首先想到了ARM的FIQ,它可以打断IRQ中断服务程序,保证对外部FIQ的及时响应。但是发现linux只实现了IRQ,没有显示FIQ。
linux是从devicetree读取中断号,加入中断向量表的。

interrupts = <0x0 0x32 0x0>;中的第一个字段0表示非共享中断,非零表示共享中断,SDK产生的dts统一为0,此时第二字段的值比XPS中的小32;如果第一字段非零,则第二字段比XPS小16.
最后字段表示中断的触发方式。
IRQ_TYPE_EDGE_RISING =0x00000001,
IRQ_TYPE_EDGE_FALLING =0x00000002,
IRQ_TYPE_LEVEL_HIGH =0x00000004,
IRQ_TYPE_LEVEL_LOW =0x00000008,
很明显,devicetree根本没有提供通知linux有FIQ的渠道。
2、再来看linux的IRQ
linux的中断分为上半部和下半部,上半部运行在IRQ模式,会屏蔽所有中断,下半部运行在SVC模式,会重新打开中断。
也就是说,当一个中断的上半部正在运行时(不能再次响应中断),FPGA的中断是不能被linux响应的;
反过来,当FPGA中断的上半部正在运行时(不能再次响应中断),其他的中断也不能被linux响应;
unsigned long flags;
...
local_irq_save(flags);
....

local_irq_restore(flags);

3.
ARM有七种模式,我们这里只讨论SVC、IRQ和FIQ模式。
我们可以假设ARM核心有两根中断引脚(实际上是看不见的),一根叫 irq pin, 一根叫fiq pin.
在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ的。
先不说中断控制器,只说ARM核心。正常情况下,ARM核都只是机械地随着pc的指示去做事情,当CPSR中的I和F位为1的时候,IRQ和FIQ全部处于禁止状态。无论你在irq
pin和fiq pin上面发什么样的中断信号,ARM是不会理你的,你根本不能打断他,因为他耳聋了,眼也瞎了。
在I位和F位为0的时候,当irq
pin上有中断信号过来的时候,就会打断arm的当前工作,并且切换到IRQ模式下,并且跳到相应的异常向量表(vector)位置去执行代码。这个过程是自动的,但是返回到被中断打断的地方就得您亲自动手了。当你跳到异常向量表,处于IRQ的模式的时候,这个时候如果irq
pin上面又来中断信号了,这个时候ARM不会理你的,irq
pin就跟秘书一样,ARM核心就像老板,老板本来在做事,结果来了一个客户,秘书打断它,让客户进去了。而这个时候再来一个客户,要么秘书不断去敲门问,要么客户走人。老板第一个客户没有会见完,是不会理你的。
但是有一种情况例外,当ARM处在IRQ模式,这个时候fiq pin来了一个中断信号,fiq
pin是什么?是快速中断呀,比如是公安局的来查刑事案件,那才不管你老板是不是在会见客户,直接打断,进入到fiq模式下,并且跳到相应的fiq的异常向量表处去执行代码。那如果当ARM处理FIQ模式,fiq
pin又来中断信号,又就是又一批公安来了,那没戏,都是执法人员,你打不断我。那如果这个时候irq
pin来了呢?来了也不理呀,正在办案,还敢来妨碍公务。
所以得出一个结论: IRQ模式只能被FIQ模式打断,FIQ模式下谁也打不断。
在打不断的情况下,irq pin 或 fiq pin随便你怎么发中断信号,都是白发。
所以除了fiq能打断irq以外,根本没有所谓中断嵌套的情况。
Linux不用FIQ,只用到了IRQ。但是我们有时候一个中断需要处理很长时间,那我们就需要占用IRQ模式那么长的时间吗?没有,linux在IRQ模式下只是简单的记录是什么中断,马上就切换回了SVC模式,换句话说,Linux的中断处理都是在SVC模式下处理的。
只不过SVC模式下的ISR上半部关闭了当前中断线,下半部才重新打开

❹ Linux设备驱动中的并发

并发就是多个执行单元或多个进程并行执行,而这多个执行单元对资源进行共享,比如访问同一个变量或同一个硬件资源,这个时候就很容易出现竞态(说简单点就是竞争同一个”女朋友”)。


为了处理并发带来的问题,Linux有几种处理方法:
1. 中断屏蔽
2. 原子操作
3. 自旋锁
4. 信号量
5. 互斥体
6. 完成量

以上几种处理并发的方式各有利弊,需要根据实际情况来选择使用哪一种。


它的原理就是让CPU不响应中断,一般使用这种方法的要求代码段要比较少,不能占用大量的时间。一般在驱动中不推荐使用这种方式。


原子量保证对一个整形数据的操作是排他性的。就是该操作绝不会在执行完毕前被任何其他任务或事件打断。


自旋锁是一种典型的对临界资源进行互斥访问的手段。当一个自旋锁已经被其他线程持有,而另一个线程试图去获取自旋锁,这时候就会一直在那里等待(原地自旋等待)。如果递归调用自旋锁,就会导致系统死锁。


与自旋锁不同的是,当获取不到信号量时,进程不会原地打转而是进入休眠等待状态。新的Linux内核倾向于直接使用mutex作为互斥手段,信号量用作互斥不再被推荐使用。


当进程占用资源时间较长时,用互斥体会比较好。


使用方法:

完成量的机制是实现一个线程发送一个信号通知另一个线程完成某个任务。一个线程调用wait_for_completion后就进入休眠,另一个线程执行完某个任务后就发送通知给进入休眠的线程,然后它就执行wait_for_completion后面的代码。

❺ linux 内核中断 用什么锁

首先我阐明一下,用锁的情况只有两种:
线程
文件
内核程序在使用的时候也脱离不了这两种锁的概念。
中断,是信号,是否要处理中断信号?或者产生中断信号?
对信号来说只有:
信号屏蔽、信号捕捉、信号排队、可重如函数等概念。
你想问的问题,我没猜测,在处理某个信号时,不想让其他信号中断,那么使用信号屏蔽字:
先设置要屏蔽的信号集,要保存的信号集,初始信号集,可供协调使用的函数有几个:
#include <signal.h>
signal(这个不建议使用,应为有些老的实现是有问题的),设置信号处理程序
sig_atomic_t 数据类型
sigprocmask,设置信号屏蔽字
sigaction,设置信号处理程序,功能跟强悍,可控性更好
sigsuspend,以原子性方式,等待某些信号发生,然后返回
你具体要做啥不清楚,但使用上面的信号相关的函数,肯定能实现你的功能。参考APUE的论述。

❻ 中断与操作系统之间有什么关系

中断由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。硬中断是可以屏蔽的,软中断是不可以屏蔽的。

软中断则是手动由中断指令产生。内核不会立即处理重新触发的软中断。当大量软中断出现的时候,内核会唤醒一组内核线程来处理。这些线程的优先级最低(nice值为19),这能避免它们跟其它重要的任务抢夺资源。但它们最终肯定会被执行,所以这个折中的方案能够保证在软中断很多时用户程序不会因为得不到处理时间而处于饥饿状态,同时也保证过量的软中断最终会得到处理。

设计中断系统时,硬中断用于紧急的响应,而软中断一般用于处理硬中断没有完成的工作。

中断有两个重要的属性,中断号和中断处理程序。中断号用来标识不同的中断,不同的中断具有不同的中断处理程序。在操作系统内核中维护着一个中断向量表(Interrupt Vector Table),这个数组存储了所有中断处理程序的地址,而中断号就是相应中断在中断向量表中的偏移量。

中断与驱动
中断产生时候 保护系统当前状态,也就是把cpu当前的状态保存起来

执行中断程序,执行的中断程序应该尽量短,不去过多占用cpu时长,此处引入Linux的顶半部机制以及底半部机制,顶半部是指中断代码需要立即执行的情况,对于情况不紧急的情况,会将中断程序注册到队列,在cpu运行状态不是那么繁忙的情况下再去执行程序,底半部机制是指中带代码需要立即执行,不得延误(后面会详细介绍顶半部机制以及底半部机制)。

恢复现场工作,中断执行后,跳出中断程序,并恢复中断前cpu状态,继续执行之前的任务

❼ Linux中断补充

在系统结构中,CPU工作的模式有两种,一种是中断,由各种设备发起;一种是轮询,由CPU主动发起。
中断IRQ:
中断允许让设备(如键盘,串口卡,并口等设备)表明它们需要CPU。一旦CPU接收了中断请求,CPU就会暂时停止执行正在运行的程序,并且调用一个称为中断处理器或中断服务程序(interrupt service routine)的特定程序。CPU处理完中断后,就会恢复执行之前被中断的程序。
中断分类:
硬中断+软中断
硬中断:
①非屏蔽中断:不能被屏蔽,硬件发生的错误:内存错误,风扇故障,温度传感器故障等。
②可屏蔽中断:可被CPU忽略或延迟处理。当缓存控制器的外部针脚被触发的时候就会产生这种类型的中断,而中断屏蔽寄存器就会将这样的中断屏蔽掉。我们可以将一个比特位设置为0,来禁用在此针脚触发的中断。
软中断:
是软件实现的中断,也就是程序运行时其他程序对它的中断;而硬中断是硬件实现的中断,是程序运行时设备对它的中断。

CPU之间的中断处理(IPI)
处理器间中断允许一个CPU向系统其他的CPU发送中断信号,处理器间中断(IPI)不是通过IRQ线传输的,而是作为信号直接放在连接所有CPU本地APIC的总线上。
CALL_FUNCTION_VECTOR (向量0xfb)

发往所有的CPU,但不包括发送者,强制这些CPU运行发送者传递过来的函数,相应的中断处理程序叫做call_function_interrupt(),例如,地址存放在群居变量call_data中来传递的函数,可能强制其他所有的CPU都停止,也可能强制它们设置内存类型范围寄存器的内容。通常,这种中断发往所有的CPU,但通过smp_call_function()执行调用函数的CPU除外。

RESCHEDULE_VECTOR (向量0xfc)

当一个CPU接收这种类型的中断时,相应的处理程序限定自己来应答中断,当从中断返回时,所有的重新调度都自动运行。

INVALIDATE_TLB_VECTOR (向量0xfd)

发往所有的CPU,但不包括发送者,强制它们的转换后援缓冲器TLB变为无效。相应的处理程序刷新处理器的某些TLB表项。

阅读全文

与linux中断屏蔽相关的资料

热点内容
永新优品app怎么找不到 浏览:244
海外服务器如何找客户 浏览:578
单片机学51 浏览:157
自助审核系统源码 浏览:382
python小数矩阵 浏览:598
安卓微信拍了拍功能怎么打开 浏览:47
求个最新的网址谁知道 浏览:29
bl耽美电影大尺度 浏览:275
编程里的块和函数的关系 浏览:372
大龄程序员自由职业现状 浏览:17
电影讲一个男的把一个小女孩关起来 浏览:600
英语电影读后感100词 浏览:154
征途命令 浏览:695
抢版电影啥意思 浏览:181
xp编程器软件 浏览:397
matlab细菌觅食算法 浏览:784
手机怎么建压缩包 浏览:941
大象里面的文件夹怎么打开 浏览:954
安卓微信为什么发不了照片 浏览:349
补办绿本解压违法吗 浏览:604