如果程序总是顺序执行,那么事情将变得非常简单。但事情往往和人们所期望的不太一样,中断和异常会打断顺序执行的程序流,转而进入一条完全不同的执行路径。操作系统的内核为什么那么难懂,很大一部分要归功于它们。下面将介绍现代CPU架构中的中断和异常机制。
中断架构
从某种意义上说,现代计算机架构是由大量的中断事件驱动的。中断提供给外部硬件设备一种“打断CPU当前执行任务,并响应自身服务”的手段。
1、可编程中断控制器
中断从设备发送到CPU需要由被称为“中断控制器”的部件转发。中断控制器发展至今,经历了PIC(可编程中断控制器)和APIC(高级可编程中断控制器)两个阶段。
2、PIC
8259A芯片即常说的PIC,它具有IR0~IR7共8个中断管脚连接外部设备。中断管脚具有优先级,其中IR0优先级最高,IR7最低。PIC有如下三个重要的寄存器。
(1)IRR中断请求寄存器:共8位,对应IR0~IR7这8个中断管脚。某位置一代表收到对应管脚的中断但还未提交给CPU。
(2)ISR服务中寄存器:共8位。某位置1代表对应管脚的中断已经提交给CPU处理,但CPU还未处理完。
(3)IMR中断屏蔽寄存器:共8位。某位置一对应的中断管脚被屏蔽。
除此之外,PIC还有一个EOI位,当CPU处理完一个中断时,通过写该位告知PIC中断处理完成。PIC向CPU递交中断的流程如下:
(1)一个或多个IR管脚上产生电平信号,若对应的中断没有被屏蔽,IRR中相应的位 被置1。
(2)PIC拉高INT管脚通知CPU中断发生。
(3)CPU通过INTA管脚应答PIC,表示中断请求收到。
(4)PIC收到INTA应答后,将IRR中具有最高优先级的位清0,并设置ISR中对应的位。
(5)CPU通过INTA管脚第二次发出脉冲,PIC收到后计算最高优先级中断的vector,并将它提交到数据线上。
(6)等待CPU写EOI。收到EOI后ISR中最高优先级的位被清0,如果PIC处于AEOI模式,当第二个INTA脉冲收到后,ISR中最高优先级的位自动清0。