计算机中断例程和启动过程

来源:互联网 发布:苹果软件中文字体 编辑:程序博客网 时间:2024/06/04 23:31

首先将几个概念,中断程序处理和中断向量表。

CPU在执行一段程序的时候,检测到从CPU内部或外部发来的特殊信号,并且可以对该信号立即处理,暂时不去处理当前执行的程序。等该信号处理完成后,可以返回继续执行程序。这种信号就是中断信息。相当于银行的VIP用户~

然后的问题就是怎么产生信号和如何处理信号了。有两种:内中断,外中断。

内中断:对于8086CPU,由硬件决定的中断信息

(1)除法错误

(2)单步运行程序(高级语言的单步或指定调试程序,就是这个中断起的作用)

(3)执行into指令

(4)执行int指令

外中断:由CPU外部产生的终端信号。

举个例子,键盘输入的处理过程。键盘与主板的相关接口芯片里也有一个寄存器,每按下一个键,就会向该端口发送信息,这时,芯片会向CPU发送类型为9的中断。执行程序的时候还可以用键盘输出字符,有时候输入的字符显示不出来,就像卡了一样,过了一会突然按下的字符瞬间出现了,这是原因是CPU没有立即执行这个中断,而去执行更高级别的中断,等高级别的中断完成后,执行键盘的输入字符的中断。

 

这是中断信号的介绍。下面是如何处理中断。

CPU在处理中断的时候,会先知道中断信号的标号,根据这个标号去内存里找到相应的程序来处理。为什么不直接找处理程序,而是中间要用到一个标号?这就像书本需要有目录一样,容易理解,方便,还可以扩展。

每一个中断信号都有标号,每一个中断都有相应的程序处理。我们需要知道哪种标号对应的是哪个处理程序。

所以,用到了一个概念:中断向量表。如下图所示

这段中断向量在内存的0000:0000处开始,也就是说,我要执行0号中断,CPU会讲CS:IP设置成0:0,找到0号中断程序的入口地址进行处理。这个内存地址和标号是有对应关系的。我要找1号中断的处理程序,CS:IP设置成0:(1*4)然后执行0:(1*4)和0:(1*4+2)的内容。同理,第N号中断则是改变IP的值为(N*4),然后执行(N*4)和(N*4+2)的内容。

中断向量表就是一个目录。

 

我们以一个具体程序的例子去理解中断的执行。

mov ax,1000h

mov bl,1

div bl

这个程序执行后,会产生除法溢出。为什么呢?ax是一个16位的寄存器,bl是8位,除的结果是一个16位的,但是默认除数为8位时,会用al(8位)得到结果,这个肯定是不够的,所以溢出。

那么执行后,自动产生0号中断。屏幕上显示"Divide overflow”。后面显示出"Divide overflow”就是其中断处理程序的执行结果的一部分。CPU此时的工作过程:

(1)取得中断类型码 0

(2)Flag标志寄存器入栈,TF,IF设置为0

(3)CS、IP入栈

(4)(IP)=(0*4),(CS)=(0*4+2)

假设处理程序的入口地址为0000::0020,这个地址就保存在了CS:IP现在所指的内存区域里,然后CS:IP自动跳转为0000:0020,这是CPU指向的内存变成了0000:0020,开始从0000:0020往下执行程序段。这里的程序段就是一段显示"Divide overflow"的程序。

 

中断例程和中断向量表知道了后,就是我们的计算机启动了。

 

(1)接通电源,CPU一通电,会将CS:IP初始化为0FFFF:0000.自动从0FFFF:0000内存单元开始执行程序.0FFFF:0000处有一条跳转指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序.

(2)初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中.注意:对于BIOS所提供的中断例程,只需将入口地址登记到中断向量表中即可,因为这些程序是固化到ROM中的,一直存在.(出场的时候已经设置好了,并且这是一种不可擦除的逻辑编程.)

(3)硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导,讲计算机由操作系统控制.

(4)DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,建立相应的中断向量.

0 0