是否可以从用户程序以某种方式模拟硬件中断?这个问题我已经看过很多次了,但总是没有答案。
我想了解低级中断(例如模拟键盘上按键时的情况,以便键盘驱动程序中断中断)。
高级事件和 API 不在范围之内,问题是理论上的而非实际的(以防止“为什么”讨论 :)
是和不是。
在 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
指令(即除了极少数的用于与内核通信的中断之外的任何中断)只会导致程序被关闭。
所以,底线:是的,硬件支持它 - 但硬件也支持禁止它,几乎每个现代操作系统都这样做,至少对于操作系统内核本身之外的大多数代码。