1.2.5 软件中断

软件中断是在硬件中断执行完后由内核的调度器(scheduler)调度执行的活动。软件中断和硬件中断的主要区别在于:硬件中断可以随时立刻打断CPU现行活动(如中断允许);软件中断是由内核调度器调度执行的活动。软件中断必须要等到调度器调用它才能执行,软件中断的调度由内核函数do_softirq完成。

    asmlinkage void do_softirq(void)                                //kernel/softirq.c

软件中断的处理程序在do_softirq后开始执行。软件中断的执行时间只有两处:

● 系统调度结束后(在schedule中)被调度执行。

● 硬件中断结束后(在do_IRQ中)被调度执行。

Linux内核中最多可以定义32个软件中断,目前使用的有:

    enum                                                            //include/linux/interrupt.h
    {
      HI_SOFTIRQ=0,
      TIMER_SOFTIRQ,
      NET_TX_SOFTIRQ,
      NET_RX_SOFTIRQ,
      BLOCK_SOFTIRQ,
      TASKLET_SOFTIRQ,
      SCHED_SOFTIRQ,
      HRTIMER_SOFTIRQ,
      RCU_SOFTIRQ
      NR_SOFTIRQS
    };

其中网络子系统使用的软件中断有如下几种。

● NET_RX_SOFTIRQ:处理网络接收到的数据包。

● NET_TX_SOFTIRQ:处理要发送的网络数据包。

另一个软件中断TASKLET_FOFTIRQ用于实现tasklet的概念。

软件中断与tasklet和bottom half有很大区别,软件中断最重要的特性是:

● 软件中断可以同时在多个处理器上运行,所以在编写软件中断处理程序时必须要考虑重入问题。如果在软件中断处理程序中要访问共享全局变量,必须采用锁定机制执行并发访问。

● 软件中断本身不能被同类的软件中断打断。

● 软件中断在执行时只能被硬件中断打断。