在阅读本文之前,可以先行阅读:中断上下文、进程上下文
本文回答了为什么引入中断上部分、下部分以及上半部和下半部各自的分工;同时重点分析了下半部的三种机制及tasklet和工作队列的使用模块,能对整个框架有一个清晰的认识。
1. 为什么引入中断上半部、下半部
(1)为了解决一个矛盾体:又想中断处理程序运行快,又想中断处理程序完成的工作量多。
(2)中断处理程序本身局限性,使得它只能完成整个中断处理流程的上半部分。
这些局限包括:
①中断处理程序以异步方式执行,可能打断其他重要代码(包括其他中断程序)的执行,故中断处理程序执行速度越快越好。
②当中断处理程序执行时,如其没有设置了中断屏蔽,同级的其他中断被屏蔽;设置后,其他中断都会屏蔽,硬件与操作系统无法通信。故其速度越快越好。
③中断处理程序往往需要对硬件操作,所以它们通常要求速度越快越好。
④中断处理程序在程序上下文运行,所以不能阻塞。这限制了它们所做的事情。
引入中断上半部、下半部之后,称为“顶半部”的部分,是实际响应中断的例程,也就是用request_irq注册的中断例程;而所谓”底半部”是一个被顶半部调度,并在稍后安全的时间内执行的例程。
2.中断上半部、下半部的比较
上(顶)半部[中断处理程序] | 下(底)半部[推后处理程序] |
---|---|
完成尽可能少的紧急硬件操作 | 完成延缓的耗时操作,中断事情的大部分任务 |
关中断 | 可以开中断,允许中断请求 |
内核立即运行 | 稍后完成 |
3.怎样区分上半部、下半部工作
没有严格规则,以下可供借鉴:
①任务对时间敏感,上半部;
②任务和硬件相关,上半部;
③任务不想被中断打断,上半部;
④其他所有任务,下半部。
4.下半部机制的引入
顶半部用于完成尽量少的比较紧急的功能,它往往只是简单地读取寄存器中的中断状态,并在清除中断标志后就进行”登记中断”的工作。”登记中断”意味着将底半部处理程序挂到设备的底半部执行队列中去。这样,顶半部执行的速度