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