2011-07-13 39 views
6

私は、x86アーキテクチャのさまざまなゲートについて詳しく知りました。私が正しく理解している場合、割り込みとトラップゲートはhwとswの割り込み処理にそれぞれ使用されます。 pplがSYSENTERとSYSEXITに置き換えられているので、おそらくCALLゲートは使用されません。タスクゲート、割り込みゲート、コールゲート

私はタスクゲートがどのように使用されているのか疑問に思っていました(私はそれらがhwタスクスイッチに使用されていることを知っています)。それはどういう意味ですか? hwタスクはOSのタスク/プロセスを参照していますか?それとも、オペレーティングシステムの2つの異なるインスタンスを切り替えるようなものでしょうか。 (サーバー上にある可能性があります)?

割り込みの中には、ユーザーモードで処理されるものがあります。 (私たちがユーザーモードでのゼロ割り込みにより除算を扱うことができる。それができるならば、それはゼロによる除算のためのIDTハンドラエントリを意味しているのは、ユーザ空間からのアドレスが含まれている?)

おかげ

答えて

7

あなたがしたい場合がありますすべてを割り込みとゲートについて知っているのはIntel developer manual, volume 3です。要するに:

  • タスクゲートは、もともとタスク交換を実行するCPUを介する方法として設計されていました。 CPUは、タスク切り替え操作の間、プロセスの状態を自動的に記録することができる。これらは、現代のオペレーティングシステムでは通常使用されません。 OSは通常、それ自身で状態節約操作を行います。
  • 少なくともLinuxでは、すべての割り込みハンドラはカーネル空間にあり、リング0で実行されます。ゼロ除算の例外を処理する場合は、SIGFPEのユーザー空間シグナルハンドラを登録します。カーネル空間割込みハンドラはSIGFPE信号を発生させ、間接的にユーザ空間ハンドラコードをトリガします(ユーザ空間コードは割込みハンドラから戻った後に実行されます)。
+0

私はこのマニュアルを読んでいましたが、マニュアルでは現代のOSでこれ以上使用されていないことは明らかです。私のクラスのプロジェクトでは、決してタスクゲートを使用せず、完全に無視しました。だから、現代​​のOSにタスクゲートを使用するのが混乱していた。確認するだけで、タイマー割り込みは割り込みゲートにマップされますか? –

+1

"割り込みディスクリプタテーブル(IDT)は、各例外または割り込みベクトル を、関連する例外または割り込みを処理するために使用されるプロシージャまたはタスクのゲートディスクリプタに関連付けます。そう、はい、各割り込みは割り込みゲートにマップされます。インテルのマニュアルでは、実際に何が使用されているか、使用されていないかについては触れていません。どのような_can_を使用するかだけを記述します。 – bdonlan

+1

いくつかのオペレーティング・システムは、異なるアーキテクチャー上で動作するように設計されているため、インテル固有の機能を使用することは避けてください。そして、あなたが言うように、いくつかの機能は単に時代遅れです。 –

4

事態は、割り込みゲートとトラップゲートが実際に使用され、使用中であることです。理論的には、それらの両方をs/wおよびh/wイベント処理のために使用することができます。それらの唯一の違いは、割り込みゲートコールが将来の割り込みを自動的に禁止することです。これはハードウェア割り込み処理のいくつかの場合に役立ちます。 デフォルトでは、割り込みを無効にすると割り込み処理の待ち時間が長くなり、割り込みが失われる可能性が高くなるため、不必要な割り込みの無効化が悪いため、人々はトラップゲートを使用しようとします。 コールゲートは実際には使用されていませんでした。システムコールの実装には不便で、最適ではありません。コールゲートの代わりに、ほとんどのオペレーティングシステムはトラップゲート(Linuxではint 0x80、Windowsではint 0x2E)またはsysenter/sysexit syscall/sysrt命令を使用します。 タスクゲートは決して実際に使用されていませんでした。それは最適ではなく、不便で制限された機能ではありません。その代わりに、オペレーティングシステムは、通常、カーネルモードのタスクスタックの切り替えによって、自分自身でタスクの切り替えを実装します。 Intelは、TSS(Task State Segment)とTask Gateの導入により、マルチタスクのハードウェアサポートを提供しました。その特徴によれば、プロセッサは、1つのタスクの状態を自動的に保存し、hwまたはswからの要求に応答して別のタスクの状態を復元することができる。 Sw要求は、TSSセレクタまたはタスク・ゲート・セレクタを命令オペランドとして使用してcallまたはjmp命令を発行することによって実行できます。 Hw要求は、適切なIDTエントリでタスクゲートにハードウェアトラップすることによって行うことができます。しかし、すでに言及したように、誰もそれを実際に使用していません。その代わりに、オペレーティングシステムはすべてのタスクに対して1つのTSSのみを使用します(TSSはいずれの場合でも使用する必要があります。これは、低特権セグメントから特権セグメントCPUスイッチスタックへの制御転送中です。 TSS)、タスクを手動で切り替えます。

理論的には、割り込みと例外はユーザーモード(リング3)で処理できますが、実際には有用ではなく、カーネル側(リング0)のすべてのイベントをオペレーティングシステムが処理します。理由は簡単で、割り込みと例外ハンドラは常にメモリに常駐し、任意のアドレス空間からアクセス可能でなければなりません。アドレス空間のカーネル部分は、システム内のすべてのタスクのすべてのアドレス空間で共有されますが、アドレス空間のユーザ部分は特定のタスクに配線されます。例外をユーザーモードで処理したい場合は、各タスクスイッチでIDTを再プログラムする必要があります。これにより、パフォーマンスが大幅に低下する可能性があります。同じ方法で割り込みを処理したい場合は、同じアドレスのすべてのタスク間で割り込みハンドラを強制的に共有する必要があります。望ましくない結果として、システム内のどのタスクもハンドラを破損する可能性があります。

関連する問題