是否有可能以某种方式从用户程序模拟硬件中断? 我已经多次看过这个问题,但总是没有回答。
我想了解低级别中断(例如模拟键盘按键时的情况,以便键盘驱动程序会中断中断)。
高级别事件和API超出了范围,问题是理论上的而非实际的(以防止“为什么”讨论:)
答案 0 :(得分:5)
是和否。
在x86 CPU上(例如),有int
指令生成中断。一旦产生中断,CPU就不一定 1 区分硬件产生的中断和软件产生的中断。例如,在原始PC BIOS中,IBM选择了一个中断,该中断将导致执行print-screen命令。他们选择的中断(中断5)是一个尚未使用的中断,但英特尔曾说过这个中断是为了将来使用而保留的。英特尔最终确实使用了该中断 - 在286中,他们添加了一个bound
指令,用于检查值是否在边界内,如果不是,则生成中断。 bound
指令基本上从未使用过,因为如果值超出范围,它会生成中断5。这意味着(如果你正在运行像MS-DOS那样允许的话)执行bound
指令,其值超出界限将打印屏幕。
然而,在现代操作系统中,通常不允许这样做。中断的所有生成和处理都发生在内核中。硬件具有4级保护(“环”),并支持指定可以执行int
指令的环。如果你试图从在第3环上运行的代码执行它,它将不会直接执行 - 相反,执行将切换到操作系统内核,可以根据它的选择对其进行处理。
这允许(例如)Windows模拟MS-DOS,因此MS-DOS程序(执行使用int
指令)可以在虚拟机中执行,具有虚拟化输入和输出,所以即使他们“认为”他们直接使用键盘和屏幕硬件,他们实际上是使用软件提供的模拟。
但是,对于“本机”程序,使用大多数int
指令(即用于与内核通信的少量中断)只会导致程序关闭。
所以,底线:是的,硬件支持它 - 但硬件也支持禁止它,几乎每个现代操作系统都是这样做的,至少对于OS内核本身以外的大多数代码都是如此。