5

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

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

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

4

1 回答 1

3

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

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

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

EXT 外部事件(位 0)— 置位时,表示在程序外部事件(例如中断或较早的异常)的传递过程中发生异常。

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

- 编辑 -

还有一点:不要被“陷阱门”和“中断门”所迷惑。中断可以通过陷阱门,而 INT 可以通过中断门。唯一的区别是进入处理函数时对中断启用状态的处理。

于 2013-03-24T16:00:12.063 回答