上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
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有很大区别,软件中断最重要的特性是:
● 软件中断可以同时在多个处理器上运行,所以在编写软件中断处理程序时必须要考虑重入问题。如果在软件中断处理程序中要访问共享全局变量,必须采用锁定机制执行并发访问。
● 软件中断本身不能被同类的软件中断打断。
● 软件中断在执行时只能被硬件中断打断。