中断的上下文与进程上下文并没有什么瓜葛,当执行一个中断处理函数时,内核处于中断上下文。由于中断相当于打断了当前执行的程序,而且中断也没有后备的进程,所以中断上下文不可以睡眠(注意某些函数会睡眠),中断处理也必须做到迅捷,有一定的时限要求。中断处理程序存在希望中断程序运行的尽量快以及希望中断处理程序完成的工作量多这一对矛盾。因此我们一般将中断分为上下两个部分,分为上半部,下半部。上半部完成有严格时限的工作(必须),例如回复硬件等,这些工作都是在禁止其他中断情况下进行的。能够延后执行的都放在下半部进行。上半部只能通过中断处理程序实现,下半部的实现目前有 3 种实现方式,分别为:1、软中断、2、tasklet 3、工作队列(work queues)我们主要讲 tasklet。调用 tasklet 以后,tasklet 绑定的函数并不会立马执行,而是有中断以后,经过一个很短的不确定时间在来执行,如下图所示:
|