linux 中断和中断处理

一、概念

内核需要管理连接到计算机上的硬件设备,如硬盘,蓝光碟机,键盘,鼠标,3D处理器,以及无线电等。内核提供一种机制,让硬件在需要的时候再向内核发出信号。这就是中断机制。

从物理学角度看,中断是一种电信号,中断是硬件发出,送入中断控制器的输入引脚中,中断控制器是个简单的电子芯片,其作用是将多路中断管线,采用复用技术只通过一个和处理器连接的管线与处理器通信。当接受到一个中断后,中断控制器会给处理器发送一个电信号。处理器一经检测到此信号,便中断自己的工作转而处理中断。此后,处理器会通知操作系统一经产生中断,这样,操作系统就可以对这个中断进行适当地处理了。

中断可能随时发生,因此中断处理函数也就随时可能执行。必须保证中断处理程序能够快速执行。

二、上半部分与下半部分的对比

又想中断处理程序快,又想中断处理程序完成的工作量多,把中断处理切分为两个部分。

上半部分:接受到一个中断,它就立即执行,但只做严格时限的工作。例如对接受的中断进行应答或复位硬件。

例如:网卡接受数据包时:

1、需要通知内核数据包到了,网卡需要立即完成这件事情。

2、内核需要执行中断处理程序来做出应答。

3、中断开始执行,通知硬件,拷贝最新的网络数据包到内存,然后读取网卡更多的数据包。这些都很重要,急迫。因为网卡接受数据包的缓存大小固定,而且相比系统内存也小很多。上述拷贝动作一旦延迟,会造成缓存溢出。

下半部分:能够被允许稍后完成的工作会推迟到下半部分。此后,在合适的时机,下半部分会被中断执行。

例如:上面网卡的例子。中断任务完成后,这时它将控制权交还给系统被中断前原先运行的程序。处理和操作数据包的其他工作在随后的下半部中进行。

三、中断控制:

linux提供一组接口用于操作机器上的中断状态。这些接口为我们提供了能够禁止当前处理器的中断系统,或屏蔽掉整个机器的一条中断线的能力。

通过禁止中断,可以确保某个中断处理程序不会抢占当前的代码。锁提供保护机制。

四、下半部分工作类型

1、内核定时器

内核定时器把操作推迟到某个确定的时间段之后执行。必须保证在一个确定的时间段过去之后再运行。

2、软中断(对网络处理多一点)

它的特性包括:
a)产生后并不是马上可以执行,必须要等待内核的调度才能执行。软中断不能被自己打断,只能被硬件中断打断(上半部)。

b)可以并发运行在多个CPU上(即使同一类型的也可以)。所以软中断必须设计为可重入的函数(允许多个CPU同时操作)。因此也需要使用自旋锁来保护其数据结构。

c)没有顺序执行保障。

3、tasklet

tasklet是通过软中断实现的,比软中断更常用

它具有以下特性:

a)一种特定类型的tasklet只能运行在一个CPU上,不能并行,只能串行执行。

b)多个不同类型的tasklet可以并行在多个CPU上。

c)软中断是静态分配的,在内核编译好之后,就不能改变。但tasklet就灵活许多,可以在运行时改变(比如添加模块时)。

d)同类型不能同时执行

4、工作队列:

工作队列可以把工作推后,交给一个内核线程去处理。如果执行后的任务需要睡眠,那么就需要选择工作队列。如果推后执行的工作不需要睡眠,那么就选择软中断或tasklet。工作队列没有顺序执行保障。

五、在下半部分加锁

中断程序可以抢占下半部分。下半部分可以抢占进程上下文中的代码。这三部分在共享数据时,要争取使用锁。

1、tasklet之间的同步(当两个不同类型的tasklet共享同一数据时)需要正确使用锁机制。

2、如果进程上下文和一个下半部分共享数据,在访问数据之前,你需要禁止下半部分的处理并得到锁的使用权。防止死锁

3、如果中断上下文和一个下半部分共享数据,在访问数据之前,你需要禁止中断并得到锁的使用权。防止死锁

4、任何在工作队列中被共享的数据也需要使用锁机制。

六、当一个中断处理程序执行时,又有新的中断请求

这个要看中断优先级,如果来的中断比当前的中断优先级高就会放下当然程序执行新的中断程序,等新的中断程序执行完后就接着执行之前的中断

猜你喜欢

转载自blog.csdn.net/qq_36183935/article/details/81284110