什么是中断
- 中断通常是由CPU外部的输入输出设备(硬件)所触发的,供外部设通知 CPU"有事情需要处理”,因此又叫中断请求(InterruptRequest).
- 中断请求的目的是希望CPU暂时停止执行当前正在执行的程序,转去执行中断请求所对应的中断处理例程(中断处理程序在哪有IDT表决定)
- 80x86有两条中断请求线:
不可屏蔽中断线,称为NMI (NonMaskable Interrupt)
可屏蔽中断线,称为INTR (Interrupt Require)
不可屏蔽中断如何处理
- 当不可屏蔽中断产生时, CPU在执行完当前指令后会里面进入中断处理程序
- 不可屏蔽中断不受EFLAG寄存器中IF位的影响,一旦发生, CPU必须处理
- 不可屏蔽中断处理程序位于IDT表中的2号位置,也就是第二个门
可屏蔽中断
在硬件级,可屏蔽中断是由一块专门的芯片来管理的,通常称为中断控制器它负责分配中断资源和管理各个中断源发出的中断请求为了便于标识各个中断请求,中断管理器通常用IRQ(Interrupt Request)后面加上数字来表示不同的中断.
比如:在Windows中时钟中断的IRQ编号为0也就是: IRQ0
图中就是IRQ 0
补充:
大多数操作系统时钟中断在10-100MS之间,Windows系列为10-20MS.
可屏蔽中断如何处理?
特别说明:
- 如果自己的程序执行时不希望CPU去处理这些中断,可以用CLI指令清空EFLAG寄存器中的IF位用STI指令设置EFLAG寄存器中的IF位
- 硬件中断与IDT表中的对应关系并非固定不变的,参见:== APIC== (高级可编程中断控制器)
异常
异常通常是CPU在执行指令时检测到的某些错误,比如除0、访问无效页面等。
中断与异常的区别:
- 中断来自于外部设备,是中断源(比如键盘)发起的, CPU是被动的.
- 异常来自于CPU本身,是CPU主动产生的
- INT N虽然被称为“软件中断”,但其本质是异常。EFLAG的IF位对INT N无效。
异常处理
无论是由硬件设备触发的中断请求还是由CPU产生的异常,处理程序都在. IDT表。
常见的异常处理程序:
页和段,当我们访问的页或段是无效的就会触发异常,页发生异常它就会进入IDT里的0xE号门,段就是0xD号门。
双重错误,比如说我们的程序页错误进入0xE号门后又引发别的异常,这时它就会进入0x8号门。
缺页异常
缺页异常的产生:
- 当PDE/PTE的P=0时
- 当PDE/PTE的属性为只读但程序试图写入的时
一旦发生缺页异常, CPU会执行IDT表中的OxE号中断处理程序,由操作系统来接管。
就像我们刚学C的时候,出现的0xC0000005这属于内存缺页异常。