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

Nik*_*Nik 3 c c++ usb interrupt

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

我想知道低级中断(例如模拟键盘上按键时的情况,这样键盘驱动程序就会中断中断).

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

Jer*_*fin 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通常用于内存奇偶校验错误等).