オペレーティングシステムの再学習-15 |割り込みと割り込みベクトル:Java / jsなどの言語がキーボード入力をキャプチャできるのはなぜですか?

目次

質問1:私たちの目標は何ですか?

質問2:ボタンを抽象化する方法は?

質問3:キーストロークに対処する方法は?オペレーティングシステムの処理を使用しますか、それとも各プログラムにそれを単独で実装させますか?

質問4:プログラムはキーストロークに応答するためにどのモデルを使用しますか?

質問5:ユーザーのキーストロークを処理するときに、実行中のプログラムを中断する必要がありますか?

質問6:オペレーティングシステムは、ユーザーがどのキーを押したかをどのようにして知るのですか?

質問7:マザーボードは、キーボードが押されたことをどのように認識しますか?

アイデアの整理:中断されたデザイン

割り込みの種類

質問1:Java / Jなどの言語がキーボード入力をキャプチャできるのはなぜですか?

質問2:オペレーティングシステムがキーボードのキーを処理できることは理解できるので、コンピュータの電源を入れたときにキーボードを使用することもできますが、その時点ではオペレーティングシステムがメモリにロードされていません。これを説明するにはどうすればよいですか。

 


探索プロセス:キーボードに応答するリンク全体を設計する方法は?
問題が発生したときは、落ち着いて解決策を考え、探求する必要があります。情報を確認したり、ビデオを見たり、専門家に相談したりできますが、その前に、最初に考えて整理する必要があります。直接回答できる質問もあれば、その背後にある理論的サポートを見つけるためにさらに深く掘り下げる必要がある質問もあります。

質問1:私たちの目標は何ですか?

私たちの目標は、Java / JSでキー押下応答プログラムを実装することです。この実装は、Switch-Caseステートメントに少し似ています。Enterキーを押して折り返したり、左右のキーを押してカーソルを移動したりするなど、さまざまなプログラムがさまざまなキーに従って実行されます。

質問2:ボタンを抽象化する方法は?

通常、キーボードには100個以下のキーがあります。したがって、ユーザーがどのキーを押すかを説明するために1バイトのデータを使用することを検討できます。ボタンには、押す操作と離す操作の2つの操作があります。これらは2つの異なる操作です。8ビットバイトの場合、最も重要な1を使用して押された状態または解放された状態を記述し、次の7ビット(0〜127)でどのキーが押されたかを記述します。このように、ユーザーのキー/リリースシーケンスを決定する限り、システムにあいまいさはありません。

質問3:キーストロークに対処する方法は?オペレーティングシステムの処理を使用しますか、それとも各プログラムにそれを単独で実装させますか?

キーの処理は一般的なプログラムであり、次のようなオペレーティングシステムによる処理の一部を最初に検討できます。

ユーザーがEnterキーを押すと、オペレーティングシステムは最初に統合パッケージを実行し、次にキーのコードを文字列Enterに変換して、さまざまなプログラムの使用を容易にします。

オペレーティングシステムでは、最初に計算を実行して、組み合わせキーの操作を処理することをお勧めします。最下層はキーとリリースしか知らないため、組み合わせキーは時間係数で判断する必要があります。

次の状況は、Ctrl + Cキーの組み合わせと考えることができます。この動作は、以下に示すように、オペレーティングシステムによって均一に処理できます。

按下 Ctrl
按下 C
释放 Ctrl
释放 C

質問4:プログラムはキーストロークに応答するためにどのモデルを使用しますか?

JavaまたはJSで記述されたアプリケーションがキーの押下に応答する場合は、メッセージモデルを検討する必要があります。プログラムがキーをスキャンし続けると、システム全体に大きな負担がかかるためです。たとえば、プログラムがキーストロークをスキャンするためにwhileループを作成する場合、多くの費用がかかります。プログラムがオペレーティングシステムのキーストロークに応答する関数を登録する場合、この関数はキーストロークが実際にトリガーされたときにのみ実行されるため、オーバーヘッドを削減できます。

質問5:ユーザーのキーストロークを処理するときに、実行中のプログラムを中断する必要がありますか?

ユーザーエクスペリエンスの観点から、キーを押すことは優先度の高い操作である必要があります。たとえば、ユーザーがCtrl + CまたはEscを押した場合、ユーザーが現在実行中のプログラムを中断したいことが原因である可能性があります。ユーザーが入力したいだけの場合でも、ユーザーに遅延を感じさせたくないので、できるだけユーザーにリソースを集中させる必要があります。

他の優先度の高い状況に対応するためにプログラムがいつでも中断されることを考慮する必要がある場合、この動作はプログラム実行の最下部からサポートする必要があり、ハードウェアレベルからサポートするのが最善です。最速。これは、このレッスンの中断の主人公につながります。対処方法の詳細については、以下の割り込み部分の分析を参照してください。

質問6:オペレーティングシステムは、ユーザーがどのキーを押したかをどのようにして知るのですか?

質問5と同様の質問があります。オペレーティングシステムはキーボードキーの読み取りを継続的にトリガーしますか、それともキーボードキーが来るたびにオペレーティングシステムに属するプログラムをトリガーしますか?

明らかに、後者の方が効率的です。

では、誰がいつでもどこでもオペレーティングシステムプログラムに割り込むことができるのでしょうか。この権限を持っているのは誰ですか?管理者アカウントですか?もちろんそうではありません。マシン自体がそのような高いレベルの権限を持っている必要があります。

このモデルについて考えてみましょう。ユーザーがキーを押すたびに、CPUの機能がトリガーされます。この機能は、ボタンを処理するために実行されているプログラムを中断します。CPU内のボタンを処理するためのプログラムが必要ですか?CPUが計算に使用されることを期待しているため、これは間違いなく機能しません。CPUに独自のプログラムがある場合、問題が複雑になります。これは、ソフトウェア設計では結合と呼ばれます。CPUの仕事は、命令を効率的に実行することに集中することです。

したがって、キーが押されるたびに、CPUに通知するメカニズムが必要です。バスを使用してCPUに通知すること、つまりマザーボードがCPUに通知することを検討できます。

では、通知を受け取った後、CPUはどのようにオペレーティングシステムに通知するのでしょうか。CPUは、実行中のプログラムに割り込んでから、実行が必要な別のプログラムに切り替えることしかできません。端的に言えば、PCポインタを変更することです。CPUは実行されたプログラムを切り替える方法が1つしかありません。ここで考えていただきたいのですが、CPUが現在実行中のプログラムに割り込んでから、別のプログラムを実行してPCポインターを変更するという方法は、1つしかありません。

次に、さらに考えてみましょう。CPUは、PCポインタをどれだけ設定する必要があるかをどのように知るのでしょうか。CPUは、オペレーティングシステムがキーストロークに応答するプログラムの場所を知っていますか?

答えはもちろん知らないことです。

したがって、CPUを制御して固定位置にジャンプすることしかできません。たとえば、CPUがマザーボードから情報を受信すると(キーがトリガーされると)、CPUはすぐに現在実行中のプログラムを中断し、PCポインタを0に設定します。つまり、PCポインタは、次のステップでメモリアドレス0から次の命令を読み取ります。もちろん、これは私たちの考えの1つに過ぎず、さらなる検討が必要です。オペレーティングシステムが実行する必要があるのは、メモリアドレス0に命令を書き込むことです。たとえば、PCポインタをキープログラムを処理する位置にジャンプさせます。

とはいえ、要約すると、CPUが行う必要があるのは、割り込みを検出したらすぐにPCポインタ(実行中のプログラムの割り込みに相当)を変更することであり、PCがどの程度変化するかはさまざまなタイプに応じて判断できます。 、ボタンを押すなど。0。オペレーティングシステムはこれらの特定の場所に命令を書き込み、割り込みが発生すると、プログラムの制御を引き継ぎます。つまり、オペレーティングシステムがキーストロークを処理するプログラムをPCポインタにポイントさせます。

質問7:マザーボードは、キーボードが押されたことをどのように認識しますか?

「キーボードに反応するリンク全体をどのように設計するか」を層ごとに掘り下げた後、現在のオペレーティングシステムはボタンを引き継ぐことができました。次に、マザーボードがボタンがあることをどのように認識し、 CPU。

キーボードのキーは特定のスイッチを押すことと考えることができ、キー情報を特定のキーの値に変換するためのチップが必要です。たとえば、ユーザーがAキーを押すと、行と列のAキーがオンになり、電気信号と見なすことができます。次に、この電気信号を特定の数値(バイト)に変換するチップが必要です。変換が完了すると、マザーボードはこの番号(キーコード)を受け取り、その番号を独自のレジスタの1つに書き込んで、CPUに通知することができます。

CPUの計算を容易にするために、CPUがマザーボードからの通知を受信した後、キーコードがレジスタに格納され、キーを押すプログラムの実行が容易になります。

アイデアの整理:中断されたデザイン

全体の設計は3つの層に分かれており、最初の層はハードウェア設計、2番目の層はオペレーティングシステムの設計、3番目の層はプログラミング言語の設計です。

キーコードのコレクションは、キーボードチップとマザーボードの機能です。マザーボードは、新しいボタンがあることを認識すると、CPUが現在実行中のプログラムに割り込み、PCポインタを固定位置にジャンプすることをCPUに通知します。これを割り込みと呼びます。

システム内でさまざまなイベントが発生することを考慮し、割り込みの種類に応じてPCポインタジャンプの位置を特定する必要があります。PCポインタジャンプの位置は、割り込みの種類によって異なる場合があります。たとえば、キープログラム、プリンタ対応プログラム、システム例外などはすべて中断する必要があります。たとえば、システム呼び出しも実行中のプログラムを中断し、カーネルモードに切り替えてカーネルプログラムを実行する必要があります。

したがって、さまざまなタイプの割り込みを分類する必要があります。このタイプは、割り込み識別子と呼ばれますたとえば、ボタンの場合、番号16の使用を検討できます。番号16は、ボタンの割り込みタイプの識別コードです。さまざまな種類の割り込みが発生した場合、CPUはPCポインタがジャンプするアドレスを知る必要があります。このアドレスは割り込みベクタと呼ばれます。

このような実装を検討することができます。割り込み番号16が発生すると、32ビットマシンのPCポインタがメモリアドレス16 * 4のメモリ位置に直接ジャンプします。デザインに最大255の割り込みがある場合、その数は0〜255で、割り込みベクトルを格納するために必要なメモリアドレスは1Kだけです。この1Kスペースは、割り込みベクトルテーブルと呼ばれます。

32ビットは正確に4バイトです。つまり、2554バイトでベクターテーブル全体を格納できます。

したがって、CPUが割り込みを受信した後、CPUは割り込みタイプに応じてPCポインタを操作し、割り込みベクトルを見つけます。オペレーティングシステムは、割り込みベクタを変更し、その前に命令を挿入する必要があります。たとえば、オペレーティングシステムは、対応する割り込みタイプを処理するプログラムにPCポインタをジャンプするために、ここにジャンプ命令を書き込みます。

オペレーティングシステムが引き継いだ後、キーを押すプログラムを例にとると、オペレーティングシステムは次のような処理を実行します。

ボタンをキューに入れて保存します。これは、オペレーティングシステムがすべてのキーをタイムリーに処理することを保証できないためです。たとえば、キーが速すぎる場合は、最初に保存してから、タイムシェアリングでゆっくりと処理する必要があります。

キーの組み合わせを計算します。押すと離す時間の関係を利用できます。

特定の計算の後、ボタンはメッセージ(イベント構造またはオブジェクト)に抽象化されます。

アプリケーションにAPIを提供して、アプリケーションがオペレーティングシステムによって処理されたメッセージを監視できるようにします。

キー押下を監視するプログラムにキー押下メッセージを配布します。

したがって、プログラムは、Java / Node.jsなどの仮想マシンを使用する言語などの言語レベルであり、オペレーティングシステムAPIとのインターフェイスのみが必要です。

割り込みの種類

割り込みのトリガー側に応じて、同期割り込み非同期割り込みに分けられます。

割り込みをトリガに強制されているかどうかによると、それが分割されマスカブル割り込みノンマスカブル割り込み

割り込みは、CPU命令によって直接トリガーできます。このようなアクティブにトリガーされる割り込みは、同期割り込みと呼ばれます。同期中断にはいくつかのケースがあります。

  1. システムコールは、ユーザーモードからカーネルモードに切り替える必要があります。この場合、プログラムはトラップと呼ばれる割り込みをトリガーする必要があります。割り込みがトリガーされた後、システムコールを続行する必要があります。
  2. 同期割り込みが間違っている(障害)こともあります。通常、何らかのエラーが検出されたため、割り込みをトリガーする必要があります。応答後の割り込みは、ページの欠落など、エラーをトリガーした場所で再実行されます。ページフォールトを中断します。
  3. プログラムの例外。この状況は、プログラムによってスローされる例外を実装するために使用されるトラップに似ています。

割り込みの別の部分は、キーボードやマウスなどのデバイスによってトリガーされる割り込みなどの外部通知に応答する必要があるため、CPUによって直接トリガーされることはありません。この種の割り込みは非同期割り込みと呼ばれます。

CPUは通常、割り込みマスクビット(レジスタ)の設定をサポートしています。1に設定すると、CPUは一時的に割り込みに応答しなくなります。トラップ、エラー、例外などのキーボードおよびマウス入力の場合、一時的にシールドされます。ただし、CPU障害によるパワーダウン割り込みなど、特に重要な割り込みの場合は、通常どおりトリガーされます。マスクできる割り込みはマスカブル割り込みと呼ばれ、ほとんどの割り込みはマスカブル割り込みです。

これは、一部のプログラムがctrl + cで終了できない理由も説明できます。

質問1:Java / Jなどの言語がキーボード入力をキャプチャできるのはなぜですか?

キーボード入力をキャプチャするために、ハードウェア層はキーを割り込みに抽象化し、CPUの実行を中断する必要があります。CPUは、割り込みタイプに従って、対応する割り込みベクトルを見つけます。オペレーティングシステムは割り込みベクトルを事前設定しているため、割り込みが発生した後、オペレーティングシステムがプログラムを引き継ぎます。オペレーティングシステムは、キーストロークを分析するための基本的なアルゴリズムを実装し、キーストロークをキーボードイベントに抽象化し、複数のキーを格納するためのキューを提供し、キーストロークを監視するためのAPIも提供します。したがって、Java / Node.js仮想マシンなどのアプリケーションは、オペレーティングシステムのAPIを呼び出すことでキーボードイベントを使用できます。

質問2:オペレーティングシステムがキーボードのキーを処理できることは理解できるので、コンピュータの電源を入れたときにキーボードを使用することもできますが、その時点ではオペレーティングシステムがメモリにロードされていません。これを説明するにはどうすればよいですか。

多くの場合、マザーボードのROMには、BIOS(Basic Input / Outup System)と呼ばれる簡略化されたバージョンのオペレーティングシステムがあります。OSがコンピュータを引き継ぐ前に、BIOSはマシンを管理し、OSをメモリにロードするのを支援します。初期のOSもBIOSの機能を使用していましたが、最新のOSが引き継いだ後は、BIOS割り込みベクトルに取って代わりました。

 

 

おすすめ

転載: blog.csdn.net/MyySophia/article/details/114044259