Leo*_*Aso 5 x86 irq interrupt-handling
我一直在研究x86上的中断,以及内核如何使用中断处理程序处理各种中断。但是,有一件事使我感到困惑。
我知道中断可能是由硬件生成的,例如磁盘和计时器中断,也可能是CPU异常,例如页面错误,除零异常等。令我感到困惑的是,一些int代码用于处理这两种情况(INT 08 -特别是0F)。例如,拉尔夫·布朗(Ralf Brown)的列表说INT 09h中断是KEYBOARD DATA READY硬件中断和COPROCESSOR SEGMENT OVERRUN异常的两倍。
所以我的问题是,给定此类中断,中断处理程序如何知道要处理的中断?
x86一般不提供区分硬件和软件中断的方法。异常处理程序必须查询外部硬件或其他方式来消除这两种情况的歧义。
\n\n为了避免混乱,系统可以通过在相应的中断描述符表条目中设置特权级别来防止同一向量过载。用户模式 (CPL=3) INT 指令无法在特权向量上生成软件异常。
\n\n对于少数异常,处理器会在异常堆栈帧上推送额外的错误代码字。错误代码字段有一个“EXT”位来指示异常是否是由外部中断引起的。在 IA 手册第 3 卷第 6.13 节中指出:
\n\n\n\n\nEXT 外部事件(位 0)\xe2\x80\x94 设置时,表示在向程序传送外部事件期间发生异常,例如中断或较早的异常。
\n
但是,只有少数异常会推送错误代码字段,并且所有这些异常都是向量 32 以下的处理器异常。
\n\n- 编辑 -
\n\n另外一点:不要被“陷阱门”和“中断门”愚弄。中断可以通过陷阱门,INT 可以通过中断门。唯一的区别是在进入处理程序函数时对中断启用状态的处理。
\n