我一直在研究x86上的中断以及内核如何使用中断处理程序来处理各种中断。但有一件事让我感到困惑。
我知道中断可以是硬件生成的,比如磁盘和计时器中断,也可以是CPU异常,比如页面错误、除零异常等。令我困惑的是,有些int代码用于同时处理两种情况(特别是INT 08-0F)。例如,Ralf Brown的列表显示INT 09h中断既可以处理键盘数据准备好
硬件中断,也可以处理协处理器段越界
异常。
所以我的问题是,鉴于这些中断,中断处理程序如何知道要处理哪个中断?
我一直在研究x86上的中断以及内核如何使用中断处理程序来处理各种中断。但有一件事让我感到困惑。
我知道中断可以是硬件生成的,比如磁盘和计时器中断,也可以是CPU异常,比如页面错误、除零异常等。令我困惑的是,有些int代码用于同时处理两种情况(特别是INT 08-0F)。例如,Ralf Brown的列表显示INT 09h中断既可以处理键盘数据准备好
硬件中断,也可以处理协处理器段越界
异常。
所以我的问题是,鉴于这些中断,中断处理程序如何知道要处理哪个中断?
x86架构通常没有提供区分硬件和软件中断的方法。异常处理程序必须查询外部硬件或其他手段来区分这两种情况。
为了避免混乱,系统可以通过设置相应中断描述符表项中的特权级别来防止过载相同向量。用户模式(CPL = 3)INT指令无法在特权向量上生成软件异常。
对于一些异常情况,处理器会在异常堆栈帧上推送一个额外的错误代码单词。错误代码字段具有一位“EXT”,用于指示异常是否由外部中断引起。《IA手册》卷3,第6.13节说明:
EXT 外部事件(位0)-设置时表示异常发生在程序外部的事件传递中,例如中断或早期异常。
然而,只有少数异常推送错误代码字段,这些异常都是向量32以下的处理器异常。
- 编辑 -
另一个位:不要被“陷阱门”和“中断门”所迷惑。中断可以经过陷阱门,INT可以经过中断门。唯一的区别在于进入处理程序函数时处理中断使能状态的处理方式。