中断
中断内部被细分成了两部分, 中断上半部, 中断下半部.
中断不能被相同类型的中断打断,而下半部依然可以被中断打断;中断对于时间非常敏感,而下半部基本上都是一些可以延迟的工作。由于二者的这种区别,所以对于一个工作是放在上半部还是放在下半部去执行,可以参考下面4条:
- 如果一个任务对时间非常敏感,将其放在中断处理程序中执行。
- 如果一个任务和硬件相关,将其放在中断处理程序中执行。
- 如果一个任务要保证不被其他中断(特别是相同的中断)打断,将其放在中断处理程序中执行。
- 其他所有任务,考虑放在下半部去执行。
中断上半部
中断上下文
进程上下文是运行在内核态帮助进程在内核执行, 通过current宏关联当前的进程, 在内核态进程是可以睡眠的, 可以调用调度函数的, 但是中断上下文是不能睡眠的.
- 中断上半部主要就是快速的处理中断信号.
- 它有严格的时间限制, 因为中断会打断其他代码的执行.
- 中断上半部处理的时侯不会被打断, 不能睡眠, 所以不能在中断执行某些函数(并不是不能执行其他函数).
- 尽量将中断工作(处理等)交给中断下半部.
中断处理程序是被内核用来处理中断的, 同时他也是不可阻塞的, 检测到中断就会立即执行.
中断上半部运行的就是中断处理函数, 它主要是将中断交给下半部来处理, 同时在中断处理结束返回时标记它是什么类型的中断.比如 软中断代替用户态进程在内核态运行返回时, 中断调用run_local_times
将其标记为软中断.
中断也有自己的中断栈, 大概1kb左右. 为了保存执行在中断的一些函数的数据, 指针.
中断下半部
因为中断上半部要达到即时响应, 将工作都交给了中断下半部.
下半部的实现是由以下构成的
k);
// 重复执行
软中断
tasklets
工作队列
软中断
软中断是由编译时静态分配的. 产生后并不是马上可以执行,必须要等待内核的调度才能执行。可以并发