中断指CPU在执行过程中,出现某些突发事件急待处理,CPU暂停执行当前程序,转去处理突发事件,处理完后CPU又返回原程序被中断的位置继续执行。
中断的分类:
- 内部中断:中断源来自CPU内部(软件中断指令、溢出、触发错误、内存缺页中断等)
- 外部中断:中断源来自CPU外部,由外设提出请求
屏蔽中断和不可屏蔽中断:
- 可屏蔽中断:可以通过屏蔽字被屏蔽,屏蔽后,该中断不再得到响应
- 不可平布中断:不能被屏蔽
向量中断和非向量中断:
- 向量中断:CPU通常为不同的中断分配不同的中断号,当检测到某中断号的中断到来后,就自动跳转到与该中断号对应的地址执行
- 非向量中断:多个中断共享一个入口地址。进入该入口地址后再通过软件判断中断标志来识别具体哪个是中断也就是说向量中断由软件提供中断服务程序入口地址,非向量中断由软件提供中断入口地址
中断既然是体系结构的机制,就需要有硬件支持。x86由2个8259A芯片级联支持,支持16种硬件产生的中断,通过IRQ n表示,IRQ就是中断号,又有被称为中断线,是硬件中断独有的,以下提到的异常没有IRQ。
由于有多种中断类型,不只上面提供的硬件中断,还有cpu内部的异常,为了对所有中断进行统一管理,cpu使用中断向量。x86提供了256个可用的中断向量,中断向量号为0~255,当某个中断向量号被assert时,cpu会找到对应的中断门描述符,其中包含处理函函数的入口地址。中断向量号的分布如下:
1、0~31:处理cpu异常和非屏蔽中断,它实际上被Intel保留,操作系统不可使用。
2、32~127:由外部硬件触发,它又分为可屏蔽中断(INTR)和非可屏蔽中断(NMI)。
3、128:linux用于系统,当执行int 0x80时,就会陷入内核态执行system_call。
对于硬件中断来说,中断向量号 = IRQ + 32,因为前31个是cpu异常。IRQ0对应的中断向量号是32(0x20)。