中断
什么是中断
中断通常是由CPU外部的输入输出设备(硬件)所触发的。是外部设备通知CPU有任务要处理,希望CPU 停下正在执行的 程序, 转而执行 请求对应的 中断处理例程 (中断处理程序在哪里由IDT表决定),所以又叫做 中断请求 。
80x86的两条中断线
- 非屏蔽中断线 —— NMI (NonMaskable Interrupt)
- 如果通过NMI发送请求,则是不可屏蔽请求
- 走IDT表中的 0x2 号门,CPU必须处理这个请求,不受EFLAGS.IF位影响
- 可屏蔽中断线 —— INTR (Interrupt Require)
- 如果通过INTR发送请求则是可屏蔽请求
- 可屏蔽请求受到EFLAGS.IF位影响
可屏蔽中断
硬件中,可屏蔽中断时由一款专门的芯片来管理的,通常称为中断控制器。它负责分配中断资源和管理各个中断源发出的中断请求。为了便于表示各个中断请求,中断管理器通常用IRQ(Interrupt Request) 0x12
这样的形式来表示不同的中断。
时钟中断
IRQ 0 (IDT表 0x30 中断门)就是时钟中断,大多系统的时钟中断为10-100毫秒,而windows的时钟中断时10-20毫秒。也就是说,没10-20ms中断控制器就会向CPU发送一个时钟中断,让CPU断下来处理其他事务,即使原来的程序是个死循环,也能让CPU有机会进行线程切换,但CPU并没有这么做。
其他中断
IDT表中 0x31 - 0x3F 对应 IRQ 1 - IRQ 15
如果EFLAGS.IF == 1,CPU将处理可屏蔽中断
如果EFLAGS.IF == 0,CPU将不再处理屏蔽中断
使用CLI指令将 IF 位清 0 ;使用STI指令将IF位置 1
APIC (高级可编程中断控制器)
异常
异常通常是运行时检测到某些错误引起的,类如除0、访问无效段或页
中断与异常的区别
- 中断是由外部设备主动发起的,而异常是由CPU主动产生的
INT n
被称为软件中断,但本质上是 异常,且EFLAGS.IF位对INT n
无效
相同之处
不管是中断还是异常,都是查的同一张表 —— IDT表