如何知道中断是硬件中断还是CPU异常

时间:2013-03-24 15:29:21

标签: x86 interrupt-handling irq

我一直在研究x86上的中断以及内核如何使用中断处理程序处理各种中断。但有一点让我感到困惑。

我知道中断可能是硬件生成的,例如磁盘和定时器中断,或者它们可能是CPU异常,例如页面错误,除零异常等。令我感到困惑的是,有些int代码用于处理两者(特别是INT 08 - 0F)。例如,Ralf Brown的列表表明INT 09h中断同时兼作KEYBOARD DATA READY硬件中断和COPROCESSOR SEGMENT OVERRUN例外。

所以我的问题是,给定这样的中断,中断处理程序如何知道要处理哪个中断?

1 个答案:

答案 0 :(得分:3)

x86通常不提供区分硬件和软件中断的方法。异常处理程序必须查询外部硬件或其他方法来消除这两种情况的歧义。

为避免混乱,系统可以通过在相应的中断描述符表条目中设置权限级别来防止重载相同的向量。用户模式(CPL = 3)INT指令无法在特权向量上生成软件异常。

除少数例外情况外,处理器在异常堆栈帧上推送一个额外的错误代码字。错误代码字段有一个“EXT”位,用于指示异常是否由外部中断引起。在IA手册第3卷第6.13节中指出:

  

EXT外部事件(位0) - 设置时,表示异常   在程序外部的事件交付期间发生,例如   中断或早先的例外。

但是,只有少数例外推送了错误代码字段,所有这些都是向量32下面的处理器异常。

- 编辑 -

另一点:不要被“陷阱之门”和“中断之门”所愚弄。中断可以通过陷阱门,INT可以通过中断门。唯一的区别是在进入处理函数时处理中断使能状态。