Linux 内核中软中断机制

   软中断实现的原理图:

                        Linux 内核中软中断机制_第1张图片

  软件中断机制的构成核心元素包括:软中断状态、软中断向量表、软中断守护内核线程。

软中断状态:即是否有触发的软中断未处理。

软中断向量表:包含两个成员变量,一个是处理此软中断的回调函数,另一个是处理时所需的参数。

软中断守护内核线程:内核建立一个内核线程ksoftirqd来轮询软中断状态,调用软中断向量表中的软中断回调函数处理中断。


 Linux内核中的软件中断的工作框架模拟了实际的硬中断处理过程。当某一软中断事件发生后,首先调用raise_softirq()函数设置对应的中断标记位,触发中断事物。然后会检测中断状态寄存器的状态,如果ksoftirqd通过查询发现某一软中断事物发生后之后,那么通过软中断向量表调用软中断服务程序action。


软中断的过程与硬中断十分类似。二者唯一不同之处是从中断向量到中断服务程序的映射过程。在CPU硬件中断发生之后,CPU的具体的服务程序通过中断向量值进行映射,这个过程是由硬件自动完成的。而软中断不是自动完成的,而由软中断守护内核线程实现这个过程。

             

Linux内核中软中断的使用方法:

在Linux系统中最多可以同时注册32个软中断,目前系统使用了6个软中断,它们是 定时器处理、SCSI处理、网络收发处理以及tasklet机制。其中这里的tasklet机制就是用来实现下半部分的。

描述软中断的核心数据结构为中断向量表:

struct softirq_action{

           void (*action)(struct softirq_action *);   //中断服务程序

           void *data;                        //服务程序输入参数

}

         软中断守护程序是软中断机制的核心。通过查询软中断的状态来判断是否发生事件,如果发生就会映射到相应的软中断向量表,调用执行注册的action()。在Linux中 软中断daemon线程函数为do_softirg()。

触发软中事物通过raise_softirq()来实现,该函数就是在中断关闭的情况下设置软中断状态位。然后判断CPU是否在中断上下文,如果不在,那么直接唤醒守护daemon。

常用的软中函数列表如下:

open_softirq():它注册一个软中断,将软中断的服务程序注册到系统的软中断向量表。

raise_softirq():设置软中断状态映射表,触发软中断事物响应。


Linux软中断的处理框架也采用上半部和下半部的处理方式。

软中断的上半部分处理紧急的,需要立即处理的,关键性的处理动作,例如网络驱动的接收动作,当有中断到达的时候,先查询网络的中断寄存器,判断为何种方式的中断,清空中断中断寄存器后,复制数据,然后设置软中断状态的状态,触发软中断。

软中断的下半部分进行数据处理,而下半部则相对涞水并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行机制,不在中断服务上下文中执行。



你可能感兴趣的:(Linux 内核中软中断机制)