ユーザープログラムから何らかの方法でハードウェア割り込みをシミュレートすることは可能ですか?私はこの質問が何度も投稿されているのを見てきましたが、常に答えられるわけではありません。
低レベルの割り込みについて知りたい(たとえば、キーボードでキーが押されたときの状況をシミュレートして、キーボードドライバーが割り込みを中断するようにする)。
高レベルのイベントとAPIは範囲外であり、質問は実際的ではなく理論的です(「なぜ」の議論を防ぐために:)
はいといいえ。
x86 CPU(一例)にint
は、割り込みを生成する命令があります。割り込みが生成されると、CPUは必ずしもハードウェアによって生成された割り込みとソフトウェアによって生成された割り込みを区別しません。一例として、元のPC BIOSでは、IBMはprint-screenコマンドを実行する割り込みを選択しました。彼らが選んだ割り込み(割り込み5)は、当時は使用されていなかったものでしたが、Intelが言っていたものは将来の使用のために予約されていました。Intelは最終的にその割り込みを使用するようにしました。286ではbound
、値が範囲内にあることを確認し、範囲内にない場合は割り込みを生成する命令を追加しました。Thebound
ただし、値が範囲外の場合は割り込み5が生成されるため、命令は基本的に使用されません。これは、(MS-DOSのようなものを実行している場合)bound
範囲外の値で命令を実行すると画面が印刷されることを意味します。
ただし、最近のOSでは、これは一般的に許可されていません。割り込みの生成と処理はすべてカーネルで行われます。ハードウェアには4つのレベルの保護(「リング」)があり、int
命令を実行できるリングを指定するためのサポートがありました。リング3で実行されているコードから実行しようとすると、直接実行されません。代わりに、実行はOSカーネルに切り替わり、選択したとおりに処理できます。
これにより、(たとえば)WindowsでMS-DOSをエミュレートできるため、MS-DOSプログラム(命令を使用)はint
、仮想化された入力と出力を使用して仮想マシンで実行できるため、直接動作していると「考えている」場合でもキーボードと画面のハードウェアでは、実際にはソフトウェアによって提供されるそれらのエミュレーションを使用しています。
ただし、「ネイティブ」プログラムの場合、ほとんどのint
命令(つまり、カーネルとの通信を目的とした少数の割り込みを除く)を使用すると、プログラムがシャットダウンされるだけです。
つまり、結論:はい、ハードウェアはそれをサポートしていますが、ハードウェアはそれを禁止することもサポートしており、少なくともOSカーネル自体の外部にあるほとんどのコードでは、ほぼすべての最新のOSがまさにそれを実行しています。