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