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