前言
这篇文章,我把中断异常、输入输出,两个部分放到一起,因为它们之间的联系实在很深。
中断和异常
在程序运行时,系统内部,外部或者程序本身出现一些需要特殊处理的“事件”,CPU立即强行中断当前程序,并改变机器状态来执行一段处理这个“事件”的程序,然后再回来继续执行之前的程序。这种机制,就叫中断(异常)。
早期的计算机,只要做做计算任务就行了,与外界的交互非常简单,但随着不断的发展,交互方式越来越丰富,中断机制不断显示出了它的重要性。
中断的具体过程
内部中断和外部中断:
- 内部中断就是CPU内部的不可屏蔽的中断,在x86的实模式下,有断点,单步,溢出,除零中断。其中,除零中断会自动触发,其余的中断一般需要用显式的方式在程序中写明,如果满足条件则触发。
- 外部中断,就是与外部设备交互的中断。比如BIOS中断,DOS中断,都是一种外部中断,它们提供的都是一些功能性的中断,比如输出输出。显然这些也是需要你在程序里显示调用的。
过程:
- 关中断。CPU关闭中断(标志寄存器中的IF位),不允许外部中断。
- 保护断点。把中断处的指令地址压入堆栈。
- 识别中断源。CPU中断处理器来确定中断号,找到中断程序的入口地址。
- 保护现场。把中断处指令相关的寄存器以及标志寄存器都要入堆栈。
- 转到中断服务程序入口开始执行。
- 恢复现场并返回。把IP,等寄存器都弹栈,然后执行中断返回指令。