2013-03-24 178 views
3

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


我知道中断可能是硬件生成的,例如磁盘和定时器中断,或者它们可能是CPU异常,如页面错误,被零除异常等等。令我困惑的是某些int代码用于处理两者特别是INT 08-0F)。例如,Ralf Brown的清单说INT09h中断既是KEYBOARD DATA READY硬件中断,也是COPROCESSOR SEGMENT OVERRUN例外。

所以我的问题是,如果像这样的中断,中断处理程序如何知道要处理哪个中断?如何知道中断是硬件中断还是CPU异常

+0

有点痛苦回答这些问题。你所学到的关于汇编编程的知识已经过时了。它在28年前有效,专为没有协处理器的机器而设计。现代机器更先进,使用保护模式操作系统,最重要的是更复杂的中断控制器。 – 2013-03-24 17:21:12

+0

@HansPassant您能否添加一些相关的实际术语或关键词,以便继续以更新的方向进行此类研究? (例如,来自中断控制器或协处理器合作词汇表的参考) – n611x007 2014-07-08 16:49:02

回答

2

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

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

对于少数例外情况,处理器会在异常堆栈帧上推送附加的错误代码字。错误代码字段有一个'EXT'位来指示异常是否由外部中断引起。在IA手动音量3,第6.13节中指出:

EXT外部事件(位0) - 置位时,指示该异常 递送外部程序的事件的过程中发生,如 中断或更早的例外。

然而,只有少数例外推eror代码字段,而所有这些都低于矢量处理器异常32

- 编辑 -

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