中断和中断处理
- 为什么用中断
- 中断
- 中断处理程序
- 上半部和下半部的对比
- 中断上下文
- 中断控制
本系列博客追寻《Linux内核设计与实现-Robert Love》,各个Linux机中的内核源代码不一,因此直接下载官网内核源码
参考书籍:《Linux内核设计与实现-Robert Love》
为什么用中断
任何操作系统内核的核心任务,都包含有对连接到计算机上的硬件设备进行有效管理。而想要管理这些设备,必须要和他们互通音信才行。
众所周知,处理器和外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后专门等待回应的方法,显然差强人意。
既然硬件的相应这么慢,那么内核就应该再次期间处理其他事务,等到硬件真正完成了请求的操作之后,再回过头来对他进行处理。
轮询是一种方法,但是会做无用功,因此在此用中断!
中断
中断使得硬件得以发出通知给处理器,因此,内核随时可以因为新到来的中断而被打断。
注意异常和中断的差异
外中断——就是我们指的中断——是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;
内中断——就是异常——是指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。内中断(trap)也被译为“捕获”或“陷入”。
异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。
中断则是由于系统中某事件引起的,该事件与现行指令无关
中断处理程序
在相应一个特定中断的时候,内核会指向一个函数,该函数叫做中断处理程序(ISR),产生中断的每个设备都有一个中断处理程序。
一个设备的中断处理程序是他设备驱动程序(driver)的一部分
上半部和下半部的对比
鉴于中断运行快速和完成工作量多,我们把中断分成两部分。
中断处理程序是上半部(top half):接收到一个中断,他就开始立即指向,但只做有严格时限的工作
能够被允许售后完成的工作会推迟到下半部,此后,在合适的时机,下半部会被开中断执行。
中断上下文
当执行一个中断处理程序的时候,内核处于中断上下文。(此时内核代表进程执行)
中断上下文具有严格的时间限制,因为他打断了其他代码。因此,中断上下文一你刚刚迅速,尽量不要处理繁重的工作。尽量把工作从中断处理程序中分离出来,放在下半部来执行,因为下半部可以在更合适的时间运行。
中断处理程序栈的设置是一个配置选项
内核栈:总得有一个进程运行着,当没有进程可以调度的时,空任务进行
中断控制
不做概述