2013-02-06 30 views
3

是否可以通过用户程序模拟硬件中断? 我看过这个问题很多次,但总是没有回答。键盘发送中断给CPU吗?

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

高级别活动和API是外范围,问题比实际相当的理论(以防止“为什么”的讨论:)

+0

那么,你可以修改OS内核,以便你可以从用户空间手动调用中断*处理程序*。 – us2012

+0

如果你可以访问中断向量,你应该能够找到中断的处理位置,然后在那里调用。当然,您需要拥有特权用户权限,也许需要编写一些汇编程序。在intel x86机器上是 –

+0

是的。在别人身上,我不知道。 http://en.wikipedia.org/wiki/INT_(x86_instruction)你需要有正确的权限才能做到这一点。 – thang

回答

5

是,也不是。

在x86 CPU上(举一个例子),有一个int指令产生一个中断。一旦中断产生,CPU不一定会区分由硬件产生的中断和由软件产生的中断。例如,在原始的PC BIOS中,IBM选择了一个会导致执行print-screen命令的中断。他们选择的中断(中断5)是当时并未使用的中断,但英特尔所说的中断仅供将来使用。英特尔最终确实把这个中断使用 - 在286他们增加了一个bound指令,检查值是否在范围内,如果不是,则会产生一个中断。尽管如此,bound指令基本上不会使用,因为如果值超出范围,它将生成中断5。这意味着(如果您运行的是允许它的类似MS-DOS的东西),执行bound指令的值超出界限将打印屏幕。

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

这允许(例如)视窗以模拟MS-DOS,所以MS-DOS程序(其使用int指令)可以在虚拟机中执行,具有虚拟化的输入和输出,所以即使他们“认为“他们直接使用键盘和屏幕硬件,他们实际上是使用软件提供的模拟。然而,对于“本地”程序,使用大多数int指令(即用于与内核进行通信的任何数量的中断)只会导致程序关闭。底线:是的,硬件支持它 - 但硬件也支持禁止它,几乎每个现代操作系统都会这样做,至少对于操作系统内核本身以外的大多数代码。


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

谢谢!我能再问一个相关的问题吗,是否有低水平的机会来模拟HID设备事件?例如在OS X上有'CGEventPost',但是有可能以某种方式在较低级别上进行事件吗? – asdf

+0

@dig:根据您想要的低级别,您可能可以使用'SendInput','keybd_event','mouse_event'或(如果您想实现低级别)合成输入的设备驱动程序。 –