c++ - 像键盘一样向 cpu 发送中断?

标签 c++ c usb interrupt

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

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

高级事件和 API 超出范围,问题是理论性的而不是实践性的(以防止讨论“为什么”:)

最佳答案

是也不是。

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

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

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

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

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


  1. 不过,对于典型的硬件,中断处理程序可以从可编程中断 Controller (PIC) 芯片读取数据,这些数据会告诉它中断是通过 PIC(即硬件中断)还是不是(软件中断)发出的。大多数硬件还至少支持一些只能由硬件生成的中断,例如 x86 上的 NMI。不过,这些通常只用于相当狭窄的用途(例如,PC 上的 NMI 通常用于内存奇偶校验错误等情况)。

关于c++ - 像键盘一样向 cpu 发送中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14735035/

相关文章:

windows - windows如何将虚拟com端口映射到设备

javascript - 在 NodeJS 中通过 USB 连接 Android/iPhone 设备

c++ - 隐藏包含父库

c# - 使用 c++/cli 和在 c# 中使用它的事件处理

c - 如何使用 CUDD 库读取可逆基准

c - 如何让输入在某个点被切断或环绕?

c - C中线程的内存访问

delphi - 在 Vista 上使用 Delphi 获取连接的 USB 信息

c++ - 包括来自不同目录的头文件?

c++ - 如何将 Q 格式整数转换为 float (反之亦然)?