这可能是一个微不足道的问题,但我无法在网上轻松找到答案。
软件中断int
指令(在英特尔处理器中(是否可以用于触发任何中断处理程序,包括那些响应硬件中断的中断处理程序?如果是,这是否在实践中使用?
在英特尔IA-32
和x86-64
体系结构中,中断描述符表(IDT(为每个条目都有一个描述符特权级别(DPL(字段,该字段定义了允许通过INT
指令(软件中断(访问该中断处理程序的CPU特权级别(CPL(。来自设备的硬件中断会忽略此机制。
Linux操作系统内核在初始化系统时初始化IDT的所有条目。(我想其他操作系统也会以自己的方式这样做。(
INT
指令允许用户模式进程发出具有范围从0到255的任意矢量的中断信号。因此,必须小心地初始化IDT,以阻止用户模式进程通过INT
指令模拟的非法中断和异常。这可以通过将IDT条目的DPL字段设置为0
(这是环0,即内核模式(来实现。如果进程试图发出这些中断信号中的一个,则控制单元对照DPL字段检查CPL值,并发出一般保护故障(中断矢量号13
(。
然而,在少数情况下,用户模式进程需要能够发出编程异常。为了实现这一点,将相应IDT条目的DPL字段设置为3
(环3,即用户空间(就足够了。与向量3
、4
、5
和128
相关联的四个Linux异常处理程序可以在用户模式下发出,因为它们的IDT条目的DPL字段设置为3
。因此,用户模式进程可以发出四条汇编语言指令INT3
(断点:中断编号3(、INTO
(溢出:中断编号4
(、BOUND
(超出范围:INT 0x05
(和INT 0x80
(用于系统调用(。
所有其他向量的中断处理程序都是有特权的,它们对应的INT
指令被认为是只有内核本身才能执行的特权指令,使用CPL0
运行。我不确定的是,在实践中,内核本身是否执行INT
指令来调用各种中断处理程序。