3

是否可以从用户程序以某种方式模拟硬件中断?这个问题我已经看过很多次了,但总是没有答案。

我想了解低级中断(例如模拟键盘上按键时的情况,以便键盘驱动程序中断中断)。

高级事件和 API 不在范围之内,问题是理论上的而非实际的(以防止“为什么”讨论 :)

4

1 回答 1

5

是和不是。

在 x86 CPU(例如)上,有一条int指令会产生中断。一旦产生中断,CPU 不一定要区分硬件产生的中断和软件产生的中断。例如,在最初的 PC BIOS 中,IBM 选择了一个会导致打印屏幕命令执行的中断。他们选择的中断(中断 5)是当时没有使用的中断,但英特尔曾表示保留供将来使用。英特尔最终确实使用了该中断——在 286 中,他们添加了一条bound指令,检查值是否在界限内,如果不在界限内,则生成中断。这bound指令基本上从未使用过,因为如果值超出范围,它会生成中断 5。这意味着(如果您正在运行允许它的 MS-DOS 之类的东西)bound使用超出范围的值执行指令将打印屏幕。

然而,在现代操作系统上,这通常是不允许的。所有中断的产生和处理都发生在内核中。硬件有 4 级保护(“环”)并支持指定int可以执行指令的环。如果您尝试从在 ring 3 运行的代码执行它,它不会直接执行——相反,执行将切换到 OS 内核,它可以按照自己的选择处理它。

这允许(例如)Windows 模拟 MS-DOS,因此 MS-DOS 程序(确实使用该int指令)可以在虚拟机中执行,具有虚拟化的输入和输出,因此即使他们“认为”他们正在直接工作对于键盘和屏幕硬件,他们实际上是在使用软件提供的模拟。

然而,对于“本机”程序,使用大多数int指令(即除了极少数的用于与内核通信的中断之外的任何中断)只会导致程序被关闭。

所以,底线:是的,硬件支持它 - 但硬件也支持禁止它,几乎每个现代操作系统都这样做,至少对于操作系统内核本身之外的大多数代码。


  1. 但是,对于典型的硬件,中断处理程序可以从可编程中断控制器 (PIC) 芯片中读取数据,该芯片将告诉它中断是否来自 PIC(即硬件中断)或不是(软件中断)。大多数硬件还支持至少一些只能由硬件生成的中断,例如 x86 上的 NMI。这些通常保留用于相当狭窄的用途(例如,PC 上的 NMI 通常用于诸如内存奇偶校验错误之类的事情)。
于 2013-02-06T17:40:32.030 回答