中断和异常

操作系统需要对计算机系统中的各种外设进行管理,这就需要CPU和外设能够相互通信才行。一般外设的速度慢于CPU的速度。如果让操作系统通过CPU“主动关心”外设的事情,集采取通常的轮询机制(polling),则太浪费CPU资源了。所以需要CPU和操作系统一起提供某种机制,让外设在需要操作系统处理外设相关事件的时候,就能主动通知操作系统,即打断操作系统和应用程序执行,让操作系统完成外设的相关处理,然后再恢复操作系统和应用程序的正常执行。在操作系统中这种机制叫做中断机制。中断机制给操作系统提供了处理一外情况的能力,同时它也是实现线程抢占式调度的一个重要基石。
在操作系统中,中断大体可以分为中断和异常(即内部中断和外部中断)。
1、中断
由CPU外部设备引起的外部事件如I/O中断、时钟中断、控制台中断等是异步产生的(即产生的时刻不确定),与CPU执行无关,我们称之为异步中断,也称为外中断,简称中断。 中断包括硬件中断和软中断。硬件中断是由外围硬件设备发出的中断信号引起的,以请求操作系统的服务。当I/O接口发出中断请求时,会像8259A和I/OAPIC这样的中断控制器收集,并发送到处理器。软中断是由intn指令引发的中断处理程序,n是中断号。(在程序中使用请求系统服务的系统调用而引发的事件,叫做陷入中断,也称为软中断)
 2、异常
在CPU执行指令期间检查到的不正常的或非法的条件(如除0错、地址访问越界)所引起的内部事件称为同步中断,也成为内部中断,简称异常。
 外部中断:
外部中断是通过两个信号线引入处理器内部的。从很早时候起,也就是8086处理器的时代,这两根线的名字就叫NMI(不可屏蔽中断)和INTR(可屏蔽中断)
不可屏蔽中断
为什么我们要把外部中断分为可屏蔽中断和不可屏蔽中断?想想如果当我们使用电脑时,内存读取的数据是错误时,我们再努力工作也没有什么意义。在所有的这种情况下,处理器必须针对这些中断采取必要的措施,如果我们忽略这些事实,则会造成无法晚会的损失。除此之外,还有一些中断是可以被忽视或者延迟处理的,在这种情况下,处理器的设计者希望通过两个引脚明确的区分不同性质的中断。像上述所说的,所有的严重事件都必须无条件的加以处理,这种类型的中断是不会被阻断和屏蔽的,所以叫做不可屏蔽中断(NMI)。

NMI 的中断源通过一个与非门连接到处理器。处理器的 NMI引脚是高电平有效的,而中断信号是低电平有效的。当不存在中断的时候,与非门的所有输入都为高,因此处理器的 NMI引脚为低电平,这意味着没有中断发生。当有任何一个非屏蔽的中断产生时,与非门的输出为高。Intel 处理器规定,NMI 中断信号由0跳变到 1 后,至少要维持 4 个以上的时钟周期才算是有效的,才能被识别。 当一个中断发生时,处理器将会通过中断引脚 NMI 和 INTR得到通知。除此之外,它还应当知道发生了什么事,以便采取适当的处理措施。每种类型的中断都被统一编号,这称为中断类型号,在实模式下,NMI被赋予了统一的中断号 2。
可屏蔽中断
对于有些中断,处理器就像没有看见、没有听见一样,不会对他们进行处理。所以这类硬件中断称为可屏蔽中断。
可屏蔽中断是通过 INTR 引脚进入处理器内部的, NMI一样,不可能为每一个中断源都提供一个引脚。而且,处理器每次只能处理一个中断。在这种情况下,需要一个代理,来接受外部设备发出的中断信号。还有,多个设备同时发出中断请求的机率也是很高的,所以该代理的任务还包括对它们进行仲裁,以决定让它们中的哪一个优先向处理器提出服务请求。,在个人计算机中,用得最多的中断代理就是8259 芯片,它就是通常所说的中断控制器,从 8086处理器开始,它就一直提供着这种服务。即使是现在,在绝大多数单处理器的计算机中,也依然有它的存在。
Intel 处理器允许 256 个中断,中断号的范围是0~255,8259 负责提供其中的 15个,但中断号并不固定。之所以不固定,是因为当初设计的时候,允许软件根据自己的需要灵活设置中断号,以防止发生冲突。该中断控制器芯片有自己的端口号,可以像访问其他外部设备一样用in 和 out 指令来改变它的状态,包括各引脚的中断号。正是因为这样,它又叫可编程中断控制器(PIC)。

           由上图可知与CPU相连的不是一片,而是两片8259A,每个8259A有8根中断信号线,由于两片级联所以就总共可以挂接15个不同的外部设备。那么这些设备发出的中断请求如何和中断向量对应起来?就是通过8259A设置完成的。早BIOS初始化的时候,IRQ0~IRQ7被设置为对应向量号08A~0Fh,但是在保护模式下向量号08A~0Fh已经被占用,所以我们要重新设置主从8259A。8259A是可编程中断控制器,对它的设置并不复杂,是通过向相应的端口写入特定的ICW来实现的。主8259A对应的端口地址是20h和21h,从8259A对应的地址是A0h和A1h.
内部中断: 
下面是保护模式下的中断和异常向量分配表(其中的2号中断就是上述所说的不可屏蔽中断的中断号,其余部分为CPU内部中断)

       

在实模式下,位于内存低端的1KB内存,是中断向量表,定义了256种中断入口地址,包括16位段地址和16位段内偏移量。在保护模式下,处理器的管理方式是相似的,但并非使用传统的中断向量表来保存中断处理过程的地址,而是中断描述符表(IDT)。顾名思义,在这个表里面,保存的是和中断处理过程有关的描述符。和实模式下的中断向量表(IVT)不同,保护模式下的IDT不要求必须存放在内存的低端,事实上,在处理器内部,有一个48位的中断描述符寄存器(IDTR),保存着中断描述符表在内存中的线性基地址和界限。中断描述符表把每一个中断或异常号和一个指向中断服务例程的描述符联系。同GDT一样,IDT是一个8字节的描述符数组,CPU把中断号*8作为索引。下面是中断描述符和中断描述符表的格式图。

         
这就意味着,中断描述符表可以位于内存中的任何位置,只要IDTR指向它,整个中断就可以正常进行了。GDT不同的是,IDT中的第一个描述符也是有效的。
下面是中断向量与中断服务例程起始地址的关系:


Intel80386通过上述的机制实现了中断和异常,是指整个操作系统和CPU正常运作,所以今天对于中断和异常这部分就简单介绍于此,有兴趣的同学好可以查看intel的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值