软件中断"int"指令可以用来触发硬件中断处理程序吗



这可能是一个微不足道的问题,但我无法在网上轻松找到答案。

软件中断int指令(在英特尔处理器中(是否可以用于触发任何中断处理程序,包括那些响应硬件中断的中断处理程序?如果是,这是否在实践中使用?

在英特尔IA-32x86-64体系结构中,中断描述符表(IDT(为每个条目都有一个描述符特权级别(DPL(字段,该字段定义了允许通过INT指令(软件中断(访问该中断处理程序的CPU特权级别(CPL(。来自设备的硬件中断会忽略此机制。

Linux操作系统内核在初始化系统时初始化IDT的所有条目。(我想其他操作系统也会以自己的方式这样做。(

INT指令允许用户模式进程发出具有范围从0到255的任意矢量的中断信号。因此,必须小心地初始化IDT,以阻止用户模式进程通过INT指令模拟的非法中断和异常。这可以通过将IDT条目的DPL字段设置为0(这是环0,即内核模式(来实现。如果进程试图发出这些中断信号中的一个,则控制单元对照DPL字段检查CPL值,并发出一般保护故障(中断矢量号13(。

然而,在少数情况下,用户模式进程需要能够发出编程异常。为了实现这一点,将相应IDT条目的DPL字段设置为3(环3,即用户空间(就足够了。与向量345128相关联的四个Linux异常处理程序可以在用户模式下发出,因为它们的IDT条目的DPL字段设置为3。因此,用户模式进程可以发出四条汇编语言指令INT3(断点:中断编号3(、INTO(溢出:中断编号4(、BOUND(超出范围:INT 0x05(和INT 0x80(用于系统调用(。

所有其他向量的中断处理程序都是有特权的,它们对应的INT指令被认为是只有内核本身才能执行的特权指令,使用CPL0运行。我不确定的是,在实践中,内核本身是否执行INT指令来调用各种中断处理程序。

最新更新