トラップと割り込みの違いは何ですか?


回答:


203

トラップは、ユーザプロセスにおいて例外です。これは、ゼロまたは無効なメモリアクセスによる除算が原因です。カーネルルーチン(システムコール)を呼び出す通常の方法でもあります。これは、ユーザーコードよりも高い優先度で実行されるためです。処理は同期的です(したがって、ユーザーコードは一時停止され、その後続行されます)。ある意味では、それらは「アクティブ」です。ほとんどの場合、コードはトラップが発生することを予期し、この事実に依存しています。

割り込みは、ハードウェア(ハードディスクのようなデバイス、グラフィックスカード、I / Oポートなど)によって生成されたものです。これらは非同期(つまり、ユーザーコードの予測可能な場所では発生しません)または「パッシブ」であり、割り込みハンドラーは最終的に発生するまで待機する必要があります。

トラップハンドラーのハンドラーは割り込みハンドラーのように見えるため、トラップを一種のCPU内部割り込みとして見ることもできます(レジスターとスタックポインターが保存され、コンテキストスイッチがあり、実行が再開される場合もあります)。 。


5
lxr.free-electrons.com/source/arch/x86/kernel/…ゼロ除算がハードウェア割り込みとして初期化されるのは興味深いことですが、なぜそうなのですか?
Alex Kreimer、2012年

8
これは、ALUがこの問題を検出したときにCPUが送信する割り込みであるためです。セグメンテーション違反のように。ただし、すべての数学エラーが割り込みを引き起こすわけではありません(オーバーフローはそうではありません)。
アーロンディグラ2018年

4
それは理にかなっている。しかし、少し混乱しているのは、なぜ以前のLinuxカーネルではソフトウェアトラップとして初期化されたのかということです。set_trap_gate(0、&divide_error);
Alex Kreimer、2012年

11
少しわかりにくい」とはどういう意味ですか?これは非常に混乱します:-)ここでの問題は、ゼロによる除算がハードウェア割り込み(IRQ /ベクトル0)であることですが、カーネル開発者はそれを処理する方法をいくつか選択できます。つまり、ユーザープロセスからはトラップですが、CPU側からは割り込みです。誰が正しいのですか?なし?両方とも?
アーロンディグラ

3
もちろん、これはx86 CPUにのみ当てはまります。他のCPUは動作が異なります。
アーロンディグラ2018年

110

トラップ割り込みは密接に関連しています。トラップは一種の例外であり、例外は割り込みに似ています。

Intel x86は、ベクトル化されたイベント(割り込み例外)、および例外クラス(フォールトトラップアボート)の2つの重複するカテゴリを定義しています。

この投稿の引用はすべて、2016年4月版のIntel Software Developer Manualからのものです。(決定的で複雑な)x86の観点では、割り込みと例外処理に関するSDMの章を読むことをお勧めします。

ベクトル化されたイベント

ベクトル化されたイベント(割り込み例外)は、プロセッサーの状態の大部分を保存した後、プロセッサーを割り込みハンドラーにジャンプさせます(その時点から実行を継続できるほど十分です)。

例外と割り込みには、ベクターと呼ばれるIDがあり、プロセッサーがジャンプする割り込みハンドラーを決定します。割り込みハンドラについては、割り込み記述子テーブルで説明しています。

割り込み

割り込みは、ハードウェアからの信号に応答して、プログラムの実行中にランダムに発生します。システムハードウェアは、割り込みを使用して、周辺機器にサービスを提供する要求など、プロセッサの外部のイベントを処理します。ソフトウェアは、INT n命令を実行して割り込みを生成することもできます。

例外

例外は、プロセッサがゼロによる除算などの命令の実行中にエラー条件を検出したときに発生します。プロセッサは、保護違反、ページ違反、内部マシン障害など、さまざまなエラー状態を検出します。

例外分類

例外は、それらが報告される方法、および例外の原因となった命令がプログラムまたはタスクの連続性を失うことなく再開できるかどうかに応じて、障害トラップ、またはアボートに分類されます。

概要:トラップは命令ポインタをインクリメントし、フォルトはインクリメントせず、「分解」を中止します。

トラップ

トラップは、トラップ命令の実行直後に報告される例外です。トラップを使用すると、プログラムの継続性を失うことなく、プログラムまたはタスクの実行を継続できます。トラップハンドラの戻りアドレスは、トラップ命令の後に実行される命令を指します。

障害

障害は、一般的に修正することができる例外であり、それは、修正された後、プログラムは継続の損失なしで再起動することができます。障害が報告されると、プロセッサはマシンの状態を障害のある命令の実行を開始する前の状態に復元します。フォルトハンドラのリターンアドレス(CSおよびEIPレジスタの保存された内容)は、フォルトのある命令の次の命令ではなく、フォルトのある命令を指しています。

例:ページ違反は多くの場合回復可能です。アプリケーションのアドレス空間の一部がRAMからディスクにスワップアウトされた可能性があります。スワップアウトされたメモリにアクセスしようとすると、アプリケーションはページ違反をトリガーします。カーネルはそのメモリをディスクからRAMにプルし、制御をアプリケーションに戻すことができます。アプリケーションは中断したところから続行します(スワップアウトされたメモリにアクセスしていた障害のある命令で)、今回はメモリアクセスは障害なく成功するはずです。

アボート

アボートは常に例外を発生させた命令の正確な位置を報告しないと例外を発生させたプログラムやタスクの再起動を許可しない例外です。アボートは、ハードウェアエラーやシステムテーブル内の不整合または不正な値などの重大なエラーを報告するために使用されます。

エッジケース

ソフトウェアによって呼び出された割り込み(INT命令によってトリガーされる)は、トラップのように動作します。命令は、プロセッサがその状態を保存し、割り込みハンドラにジャンプする前に完了します。


6
これは非常に良い回答です。「新しいユーザーからの遅い回答」レビューキューが、注意を払っていることを確認するためのテストを提供していたことを確信しました。
Noumenon

1
ありがとう!それは私にとって多くのことを意味します:)
ruthafjord

これはx86にとって素晴らしい答えです。質問はもともとかなり一般的で、x86については触れられていませんでした。バランスをとるように編集しました。おそらく、この回答の先頭に別の段落を追加して、x86の世界以外の用語の問題に対処できますか?そして、または私がさらに悪いと思った場合は、質問に別の編集を残してください:PIはx86を私自身しか知らないが、うまくいけば、他のシステムが非常に類似した用語を使用しており、あなたはそれを言うことができます:)
Peter Cordes

1
脱脂PPCの aarchitectureの本を、とその定義が大きく重なっているように見えます。それらは、エッジケースの新しい名前を持ち、例外を明確なカテゴリの一部ではなく、割り込みのサブタイプのように扱います。
ruthafjord 2016年

1
この答えはそれを最もよく表していると思います。2つの間に存在する可能性のあるぼやけた線について説明します。また、ページフォールトにより、CPUが命令を再試行し、トラップがその命令をスキップして先に進むことにも言及しています。
16

9

一般的に言えば、例外、フォールト、アボート、トラップ割り込みなどの用語はすべて同じ意味であり、「割り込み」と呼ばれます。

トラップと割り込みの違いについて:

トラップ:プログラマーが開始し、特別なハンドラールーチンに制御を移すことが期待されています。(例:80x86 INT命令が良い例です)

どこに

割り込み(ハードウェア):CPUの外部の外部ハードウェアイベントに基づくプログラム制御割り込みです(例:キーボードのキーを押すか、タイマーチップのタイムアウト)。


良い定義。ソース?
alexlomba87

6

トラップは、特別な種類のある割り込みと一般に呼ばれるソフトウェア割り込み割り込みは、両方のカバーより一般的な用語であり、ハードウェア割り込み(ハードウェアデバイスからの割り込み)とソフトウェア割り込み(例えば、ソフトウェアからの割り込み、トラップ)。


4
一部の著者(Tanenbaum)が「ハードウェアトラップ」について言及しているため、問題はさらに混乱しています。ハードウェアトラップとソフトウェア割り込みを使用できる場合、定義はかなり濁っていて、どちらの方向にも行くことができるので、常にハードウェアまたはソフトウェアという単語が必要です。
The111

3

トラップは、プログラムのようなコードによって呼び出され、たとえばOSルーチン(つまり、通常は同期)を呼び出すために使用されます。割り込みはイベント(データを受信したネットワークカードやCPUタイマーなどのハードウェアの多くの場合)によって呼び出され、CPUが処理するためにドライバールーチンに切り替える必要があるため、名前が示すように、通常の制御フローに割り込みます。行事。


2

割り込みは、システム内でハードウェアによって生成されたフローの変化です。割り込みハンドラは、割り込みの原因に対処するために呼び出されます。その後、制御は中断されたコンテキストと命令に戻ります。トラップはソフトウェアで生成された割り込みです。割り込みを使用してI / Oの完了を通知し、デバイスのポーリングの必要性をなくすことができます。トラップは、オペレーティングシステムルーチンを呼び出したり、算術エラーをキャッチしたりするために使用できます。


2

トラップは、現在の命令の実行が原因で発生するため、同期イベントと呼ばれます。ここで、割り込みは、プロセッサで実行されている独立した命令によって引き起こされます。これは、外部イベントに関連しているため、非同期イベントとして知られています。


2

割り込みはハードウェア割り込みであり、トラップはソフトウェアによって呼び出される割り込みです。ハードウェア割り込みが発生すると、通常は他のハードウェア割り込みが無効になりますが、これはトラップには当てはまりません。トラップが提供されるまでハードウェア割り込みを禁止する必要がある場合は、割り込みフラグを明示的にクリアする必要があります。そして通常、コンピュータの割り込みフラグは、トラップではなく(ハードウェア)割り込みに影響します。つまり、このフラグをクリアしてもトラップは防止されません。トラップとは異なり、割り込みはCPUの以前の状態を保持する必要があります。


1

トラップはソフトウェアの割り込みです。ゼロ除算の値を持つ変数を宣言するプログラムを作成すると、トラップとして扱われます。このプログラムを実行すると、同じエラーが同時にスローされます。システムコールは、プログラムがosに必要なサービスを要求するトラップの特別なバージョン。I / Oエラーのような割り込み(ハードウェア割り込みの一般的な単語)の場合、CPUはランダムな時間に割り込みされ、当然のことながらプログラマーの責任ではありません。それらを起動するのはハードウェアです。


1
システムコールがトラップであることを説明できますか?
Radha Gogia、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.