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

cqoc49vn  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(148)

这可能是一个微不足道的问题,但我不能很容易地在网上找到答案。
软件interups int指令(在英特尔处理器中)是否可以用于触发任何中断处理程序,包括那些响应硬件中断的处理程序?如果可以,是否在实践中使用?

unhi4e5o

unhi4e5o1#

在英特尔IA-32x86-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就足够了与向量345相关联的四个Linux异常处理程序和128可以在用户模式下发出,因为它们的IDT条目具有设置为3的DPL字段。因此,四个汇编语言指令INT3(断点:中断号3),INTO(溢出:中断数4)、BOUND(超出界限范围:INT 0x05)和INT 0x80(用于系统调用)可以由用户模式进程发出。
所有其他向量的中断处理程序都是特权的,它们对应的INT指令被认为是特权指令,只能由内核本身执行,运行CPL 0。我不确定的是,实际上,内核本身是否执行INT指令来调用各种中断处理程序。

相关问题