トラップと割り込みの違いは何ですか?
システムごとに用語が異なる場合、x86 では何を意味するのでしょうか?
トラップと割り込みの違いは何ですか?
システムごとに用語が異なる場合、x86 では何を意味するのでしょうか?
トラップは、ユーザー プロセスの例外です。これは、ゼロによる除算または無効なメモリ アクセスが原因です。また、カーネル ルーチン (システム コール) を呼び出す通常の方法でもあります。これらはユーザー コードよりも高い優先度で実行されるためです。処理は同期的です (したがって、ユーザー コードは一時停止され、その後続行されます)。ある意味では、それらは「アクティブ」です。ほとんどの場合、コードはトラップが発生することを予期しており、この事実に依存しています。
割り込みは、ハードウェア (ハードディスク、グラフィック カード、I/O ポートなどのデバイス) によって生成されるものです。これらは非同期 (つまり、ユーザー コード内の予測可能な場所では発生しない) または "パッシブ" です。これは、割り込みハンドラーが最終的に発生するまで待機する必要があるためです。
トラップ ハンドラーのハンドラーは割り込みハンドラーのように見えるため、トラップを一種の CPU 内部割り込みと見なすこともできます (レジスターとスタック ポインターが保存され、コンテキスト スイッチがあり、中断した場合に実行が再開される場合があります)。 .
トラップと割り込みは密接に関連しています。トラップは例外の一種で、例外は割り込みに似ています。
Intel x86 では、ベクトル化されたイベント (割り込みと例外) と例外クラス (障害とトラップと中止)の 2 つの重複するカテゴリが定義されています。
この記事の引用はすべて、2016 年 4 月版のIntel Software Developer Manualからのものです。(決定的で複雑な) x86 の観点から、割り込みと例外処理に関する SDM の章を読むことをお勧めします。
ベクトル化されたイベント (割り込みと例外) は、プロセッサの状態の多くを保存した後、プロセッサを割り込みハンドラにジャンプさせます (後でその時点から実行を続行できるように十分です)。
例外と割り込みには、ベクターと呼ばれる ID があり、プロセッサがジャンプする割り込みハンドラーを決定します。割り込みハンドラーは、割り込み記述子テーブル内に記述されています。
割り込みは、ハードウェアからの信号に応答して、プログラムの実行中にランダムに発生します。システム ハードウェアは割り込みを使用して、周辺機器へのサービス要求など、プロセッサ外部のイベントを処理します。ソフトウェアは、INT n 命令を実行して割り込みを生成することもできます。
プロセッサがゼロ除算などの命令の実行中にエラー状態を検出すると、例外が発生します。プロセッサは、保護違反、ページ フォールト、内部マシン フォールトなど、さまざまなエラー状態を検出します。
例外は、報告される方法と、プログラムまたはタスクの継続性を失わずに例外の原因となった命令を再開できるかどうかに応じて、フォルト、トラップ、またはアボートに分類されます。
トラップは、トラップ命令の実行直後に報告される例外です。トラップを使用すると、プログラムの継続性を失うことなく、プログラムまたはタスクの実行を継続できます。トラップ ハンドラの戻りアドレスは、トラップ命令の後に実行される命令を指します。
障害は、通常は修正可能な例外であり、一度修正すると、継続性を失うことなくプログラムを再開できます。フォルトが報告されると、プロセッサはマシンの状態をフォルト命令の実行開始前の状態に戻します。フォルト ハンドラの戻りアドレス (CS および EIP レジスタの保存された内容) は、フォルト命令の次の命令ではなく、フォルト命令を指します。
例: 多くの場合、ページ フォールトは回復可能です。アプリケーションのアドレス空間の一部が RAM からディスクにスワップ アウトされている可能性があります。アプリケーションがスワップアウトされたメモリにアクセスしようとすると、ページ フォールトが発生します。カーネルはそのメモリをディスクから RAM にプルし、制御をアプリケーションに戻すことができます。アプリケーションは中断したところ (スワップ アウトされたメモリにアクセスしていた障害のある命令) から続行しますが、今回はメモリ アクセスは障害なく成功するはずです。
浮動小数点またはその他の欠落した命令をエミュレートする不正な命令のフォールト ハンドラは、フォールトした命令が処理できるかどうかを確認した後、必要なトラップのような動作を得るためにリターン アドレスを手動でインクリメントする必要があります。x86#UD
は「障害」であり、「トラップ」ではありません。(ハンドラーは、それがどの命令であったかを把握するために、障害のある命令へのポインターを必要とします。)
アボートは、例外の原因となった命令の正確な位置を常に報告するとは限らず、例外の原因となったプログラムまたはタスクの再開を許可しない例外です。中止は、ハードウェア エラーや、システム テーブル内の矛盾した値または不正な値などの重大なエラーを報告するために使用されます。
ソフトウェアによって呼び出された割り込み (INT 命令によってトリガーされる) は、トラップのような方法で動作します。命令は、プロセッサがその状態を保存して割り込みハンドラにジャンプする前に完了します。
一般的に言えば、例外、障害、アボート、トラップ、割り込みなどの用語はすべて同じ意味で、「割り込み」と呼ばれます。
トラップと割り込みの違いについて:
トラップ: プログラマーが開始し、特別なハンドラー ルーチンへの制御の転送を予期しています。(例: 80x86 INT命令が良い例です)
一方
割り込み (ハードウェア): CPU の外部にある外部ハードウェア イベントに基づくプログラム制御割り込みです (例: キーボードのキーを押すか、タイマー チップのタイムアウト)。
トラップは、一般にソフトウェア割り込みと呼ばれる特別な種類の割り込みです。割り込みは、ハードウェア割り込み(ハードウェア デバイスからの割り込み) とソフトウェア割り込み(トラップなどのソフトウェアからの割り込み) の両方をカバーする、より一般的な用語です。
トラップはプログラムのようなコードによって呼び出され、たとえば OS ルーチンを呼び出すために使用されます (つまり、通常は同期)。割り込みはイベント (多くの場合、データを受信したネットワーク カードや CPU タイマーなどのハードウェア) によって呼び出され、その名前が示すように、CPU が処理のためにドライバー ルーチンに切り替える必要があるため、通常の制御フローを中断します。行事。
割り込みはハードウェア割り込みであり、トラップはソフトウェアによって呼び出される割り込みです。通常、ハードウェア割り込みが発生すると、他のハードウェア割り込みが無効になりますが、これはトラップには当てはまりません。トラップが提供されるまでハードウェア割り込みを禁止する必要がある場合は、割り込みフラグを明示的にクリアする必要があります。通常、コンピューターの割り込みフラグは、トラップではなく (ハードウェア) 割り込みに影響します。これは、このフラグをクリアしてもトラップが防止されないことを意味します。トラップとは異なり、割り込みは CPU の以前の状態を保持する必要があります。
割り込みは、システム内でハードウェアが生成するフローの変化です。割り込みハンドラは、割り込みの原因を処理するために呼び出されます。その後、制御は中断されたコンテキストと命令に戻されます。トラップはソフトウェア生成の割り込みです。割り込みを使用して I/O の完了を通知し、デバイスのポーリングを不要にすることができます。トラップを使用して、オペレーティング システム ルーチンを呼び出したり、算術エラーをキャッチしたりできます。
トラップはソフトウェア割り込みです。ゼロ除算値を持つ変数を宣言するプログラムを作成すると、トラップとして扱われます。このプログラムを実行するたびに、同じエラーが同時にスローされます。システム コールはプログラムが必要なサービスを os に要求するトラップの特別なバージョン。I/O エラーのような割り込み (ハードウェア割り込みの一般的な言葉) の場合、CPU はランダムなタイミングで中断されます。もちろん、それはプログラマーのせいではありません。それらを引き起こすのはハードウェアです。
トラップは、プログラマによって開始される制御の移行として識別できます。トラップという用語は、例外 (自動的に発生するソフトウェア割り込み) という用語と同じ意味で使用されます。しかし、トラップは単なる特別なサブルーチン呼び出しだと主張する人もいるかもしれません。したがって、それらはソフトウェア起動割り込みのカテゴリに分類されます。たとえば、80×86 マシンでは、プログラマは int 命令を使用してトラップを開始できます。トラップは常に無条件であるため、制御は常にトラップに関連付けられたサブルーチンに転送されます。トラップを処理するためのルーチンを呼び出す正確な命令は、トラップを指定するために明示的な命令が使用されるため、簡単に識別できます。トラップ対割り込み