什么是中断
假设你在玩王者荣耀,突然一个电话过来…, 这就是中断!
对CPU来说就是:CPU在执行某一段程序的时候收到某些特定信号转而去执行另一段特定程序的过程。
那为什么需要中断呢?原因是CPU不能闷着头啥也不管一个劲的只管执行代码,还得和连接在主板上的其它硬件打交道。经常和CPU保持联系的硬件有键盘、鼠标、磁盘,还有网卡等。如果没有中断那就意味着你猛敲键盘电脑都没反应,这显然不是你想要的结果。注意一点就是上图中,当CPU收到一个中断请求转去执行中断处理程序之后,不一定会返回继续执行原来的程序A,有可能是另一段程序B。就好比你玩荣耀,突然接了一个电话之后可能就是扔下手机领快递去了。
中断如何发生
从某种角度来讲中断可以理解为外部硬件和CPU的一种通信方式。一般CPU与硬件通信的方式有两种轮询和中断,早期的CPU处理外设的事件(比如接收键盘输入),往往采用“轮询”的方式。轮询是指CPU像个查岗的一样轮番对外设顺序访问,比如它先看看键盘有没被按下,有的话就处理,没的话继续往下看鼠标有没有移动,再看看打印机……这种方式使CPU的执行效率很低。中断模式时就是说CPU不主动访问这些设备,只管处理自己的任务。如果有设备要与CPU联系,或要CPU处理一些事情,它会给CPU发一个中断请求信号。这时CPU就会放下正在进行的工作而去处理这个外设的请求。处理完中断后,CPU返回去继续执行中断以前的工作。
一般CPU每执行一条指令就会检查是否有中断过来。一旦发生了中断,就把手头的工作先放一边,去处理一下。
上文提到有很多种硬件要和CPU联系,那么CPU如何区分不同硬件的中断信号呢?答案是靠一个叫做可编程中断控制器PIC的东西,外号8259A,各种外设想发中断请求信号都得通过这个PIC,所以CPU只需要和PIC进行对接就行。
实际长这样:
所有的需要发中断的外设都要和中断控制器的引脚相连,控制器会根据引脚的编号来给中断编号,比如1号中断,2号中断,…这样CPU就可以区分中断了。接下来的问题是,一个特定的中断过来后,比如110号中断过来了,CPU如何找到所对应的的处理程序?
实际上操作系统也给不同中断处理都分配了一个编号,叫做中断向量。操作系统还准备了一个表格叫中断描述符表IDT,表格里记录了很多信息,其中就有处理这个中断号对应的函数地址。CPU找PIC拿到编号后就执行处理函数就OK了。中断描述符表一般是保存在内存中,然后用一个寄存器IDTR(Interrupt Descriptor Table Register ),中断描述符表寄存器来保存这个表的地址。上面的例子,CPU收到110号中断信号后,根据IDTR寄存器找到中断描述符表,然后读取这个表中的第110表项就能找到110号中断的处理程序的函数地址。
因为中断处理完之后是要回去继续执行之前的程序的,所以当发生中断的时候,操作系统需要进行上下文切换,就是要先保存当前的工作状态,以便中断处理完再恢复到原来的状态。具体就是把当前执行的这个线程的各个寄存器的值,执行到哪里了等等这些信息都保存在这个线程的内核栈里去。
不过有时候在执行一些非常重要的事情的时候,就不想被打断。于是CPU在一个叫eflags的寄存器中设置了一个标记,如果是1才允许被打断,如果是0那就算天王老子找也不管了。
当然,也有一些特别重要的中断是不能屏蔽的,一般是碰到了特别严重的故障!
中断的分类
其实上面讲的中断只是广义中断中的一种:外部中断。中断的分类如下:
外部中断
1、可屏蔽中断:通过INTR线向CPU请求的中断,主要来自外部设备如硬盘,打印机,网卡等。此类中断并不会影响系统运行,可随时处理,甚至不处理,所以名为可屏蔽中断。
2、不可屏蔽中断:通过NMI线向CPU请求的中断,如电源掉电,硬件线路故障等。这里不可屏蔽的意思不是不可以屏蔽,不建议屏蔽,而是问题太大,屏蔽不了,不能屏蔽的意思。
注:INTR和NMI都是CPU的引脚
内部中断
内部中断又叫软中断或者异常
1、陷阱:是一种有意的,预先安排的异常事件,一般是在编写程序时故意设下的陷阱指令,而后执行到陷阱指令后,CPU将会调用特定程序进行相应的处理,处理结束后返回到陷阱指令的下一条指令。如系统调用,程序调试功能等。
尽管我们平时写程序时似乎并没有设下陷阱,那是因为平常所用的高级语言对底层的指令进行了太多层的抽象封装,已看不到底层的实现,但其实是存在的。例如printf函数,最底层的实现中会有一条int 0x80指令,这就是一条陷阱指令,使用0x80号中断进行系统调用。
2、故障:故障是在引起故障的指令被执行,但还没有执行结束时,CPU检测到的一类的意外事件。出错时交由故障处理程序处理,如果能处理修正这个错误,就将控制返回到引起故障的指令即CPU重新执这条指令。如果不能处理就报错。
常见的故障为缺页,当CPU引用的虚拟地址对应的物理页不存在时就会发生故障。缺页异常是能够修正的,有着专门的缺页处理程序,它会将缺失的物理页从磁盘中重新调进主存。而后再次执行引起故障的指令时便能够顺利执行了。
3、终止:执行指令的过程中发生了致命错误,不可修复,程序无法继续运行,只能终止,通常会是一些硬件的错误。终止处理程序不会将控制返回给原程序,而是直接终止原程序