像键盘一样向CPU发送中断吗?

时间:2013-02-06 17:21:18

标签: c++ c usb interrupt

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

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

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

1 个答案:

答案 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内核本身以外的大多数代码都是如此。


  1. 虽然,对于典型的硬件,中断处理程序可以从可编程中断控制器(PIC)芯片读取数据,该数据将告诉它中断是否来自PIC(即硬件中断)(软件中断)。大多数硬件还支持至少一些只能由硬件生成的中断,例如x86上的NMI。这些通常保留用于相当狭窄的用途(例如,PC上的NMI通常用于内存奇偶校验错误等)。