CPU的内部的中断

任何一个通用的CPU,比如说8086,都会具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或者内部产生的一种特殊的信息,并且可以立即对所接受到的信息进行处理,这样的信息,我们就称为中断信息,在这里我们主要去讲解CPU内部产生的中断信息

  • 1、除法错误:比如说执行div指令产生的除法溢出
  • 2、单步执行
  • 3、执行into指令(本指令检测OF标志位,当OF=1时,说明已发生溢出,立即产生一个中断类型4的中断,当OF=0时,本指令不起作用.)
  • 4、执行int指令

CPU对不同的中断信息肯定是要去做不同处理的,也就是说CPU首先要去知道所接收到的中断信息的来源,所以中断信息中必须包含识别来源的编码,在8086CPU中用称为中断类型的码的数据来标识中断信息的来源,中断类型码为一个字节的数据,可以用来表示256种中断信息的来源,我们可以把这种中断信息的来源称之为中断源

上面提到的四种中断源在8086CPU当中的中断类型码如下所示

  • 1、除法错误:0
  • 2、单步执行:1
  • 3、执行into指令:4
  • 4、执行int指令,该指令的格式为int n,指令中的n为字节型的立即数,是提供给CPU的中断类型码

当CPU收到中断信息之后,就需要对中断信息进行处理,而如何去对中断信息进行处理,就可以由我们的编程去决定了,我们编写的用来处理中断信息的程序被称之为是中断处理程序,一般来说我们需要对不同的中断信息编写不同的处理程序

在CPU收到中断信息之后就应该去执行该中断信息的处理程序,既然要去执行中断程序肯定是要去设置CS寄存器和IP寄存器的值的,所以CPU在收到中断信息之后,怎么去根据中断信息确定其处理程序的入口这是一个问题,其实8086CPU就是去通过8位的中断类型码通过中断向量表去找到相应的中断处理程序的入口地址,中断向量指的就是中断处理程序的入口地址,中断向量表其实就是中断处理程序的入口地址的列表

中断向量表如下所示,中断向量表在内存当中保存,里面存放着256个中断源所对应的中断处理程序的入口地址

这里写图片描述

CPU只要知道了中断类型码就可以将中断的类型码作为中断向量表的表项号,定位相应的表项,从而得到中断处理程序的入口地址,也就是说其实CPU只需要去用中断类型码去通过查找中断向量表,就可以去得到中断处理程序的入口地址了

对于8086PC机来说,中断向量表在内存当中存放,中断向量表指定放在内存地址0处。从内存0000:0000到0000:03FF的1024个单元中存放着中断向量表,这是规定,8086CPU就从这个地方去读取中断向量表,在中断向量表当中,一个表项存放一个中断向量,也就是一个中断处理程序的入口的地址,一个表项占据两个字的大小,高地址字是存放的是段地址,低地址字存放偏移地址

需要了解的是存储N号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为4N+2,而偏移地址为4N

8086CPU在收到中断信息后,会引发的中断过程

  • 1、(从中断信息中)取得中断类型码
  • 2、标志寄存器入栈(因为在中断过程当中要改变标志寄存器的值,所以我们需要去将其保存在栈中)
  • 3、设置标志寄存器的第8位TF和第9位的值为0
  • 4、CS的内容入栈
  • 5、IP的内容入栈
  • 6、从内存地址为中断类型码*4和中断类型码*4+2的两个字单元中去读取中断处理程序的入口地址设置IP和CS

CPU在收到中断信息之后,如果处理该中断信息,就会完成一个由硬件自动执行的中断过程

用更加简洁的方式去描述中断的过程就是

  • 1、取得中断类型码N
  • 2、pushf
  • 3、TF=0,IF=0
  • 4、push CS
  • 5、push IP
  • 6、(IP)=(N*4),(CS)=(N*4+2)

在第6步之后,CPU开始执行由程序员编写的中断处理程序

由于CPU随时都可能检测到中断信息,所以CPU随时都可能执行中断处理程序,所以中断处理程序必须一直存储在内存当中的某段空间之中,而中断处理程序的入口地址,即中断向量,必须存储在对应的中断向量表表项中

中断处理程序的常规步骤如下所示

  • 1、保存用到的寄存器
  • 2、处理中断
  • 3、恢复用到的寄存器
  • 4、用iret之类返回

iret指令的功能用汇编语法描述

pop IP
pop CS
popf ;就是pop栈顶内容到标志寄存器

其实正是由于终端向量通常位于低内存,所以程序员也通常的将操作系统也放在低内存

猜你喜欢

转载自blog.csdn.net/zcmuczx/article/details/80321236