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

X86 如何知道中断是硬件中断还是cpu异常,x86,interrupt-handling,irq,X86,Interrupt Handling,Irq,我一直在研究x86上的中断,以及内核如何使用中断处理程序处理各种中断。但有一件事让我困惑。我知道中断可能是硬件产生的,比如磁盘和计时器中断,也可能是CPU异常,比如页面错误、除以零异常等。让我困惑的是,一些int代码用于处理这两种情况(特别是int 08-0F)。例如,拉尔夫·布朗(Ralf Brown)的列表中指出INT 09h中断是键盘数据就绪硬件中断和协处理器段溢出异常的两倍 所以我的问题是,给定这样的中断,中断处理程序如何知道要处理哪个中断?x86通常不提供区分硬件中断和软件中断的方法。

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

我知道中断可能是硬件产生的,比如磁盘和计时器中断,也可能是CPU异常,比如页面错误、除以零异常等。让我困惑的是,一些int代码用于处理这两种情况(特别是int 08-0F)。例如,拉尔夫·布朗(Ralf Brown)的列表中指出INT 09h中断是
键盘数据就绪
硬件中断和
协处理器段溢出
异常的两倍
所以我的问题是,给定这样的中断,中断处理程序如何知道要处理哪个中断?

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

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

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

外部事件(位0)-设置时,表示异常 在传递程序外部事件期间发生,例如 中断中断或早期异常

然而,只有少数异常推送eror代码字段,并且所有这些都是向量32以下的处理器异常

--编辑--


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

回答这些问题有点痛苦。你所学到的汇编编程已经严重过时了。它在28年前有效,是为一台没有协处理器的机器设计的。现代机器更加先进,使用的是保护模式操作系统,最重要的是,使用的是更精细的中断控制器。@HansPassant您能否添加一些相关的实际术语或关键字,以便在更现代的方向上继续这类研究?(例如,来自中断控制器或协处理器协作词汇表的参考)