割り込みベクタテーブルにのみ追加されず、システムコールテーブルがあるのはなぜですか?ここではデザインの選択を理解していません。イベント区別のパフォーマンスが向上した場合、システムコールはなぜできませんか?
答え1
私はいくつかの理由でi386のシステムコールに単一の割り込み(0x80)を使用する歴史的背景を調べていません。いいえシステムコールごとに個別のソフトウェア割り込みを使用します。
- ソフトウェア割り込みの数が制限され、システムコールの数が制限されます(x86では、他の目的には多くの割り込み記述子テーブルエントリが必要です)。ソフトウェア割り込みを使用するほとんどのアーキテクチャがサポートできるよりも多くのシステムコールがあります。
- 多くのアーキテクチャには、ソフトウェア割り込み(またはそれに対応するエントリ)を使用しない専用のシステムコール命令があります。これにはx86-64が含まれます。専用
SYSCALL
命令がソフトウェア割り込みよりも高速なシステムコールアクセスを提供する場合。man 2 syscall
各アーキテクチャのシステムコールルールの詳細が提供されます。
ARM / OABIアーキテクチャの詳細を見ると、システムコール番号が命令にエンコードされているため、割り込みテーブルが使用されていると考えることができます。該当するガイドライン固定ソフトウェア割り込みが実行され、エンコードされた番号は無視され、システムコールハンドラは命令自体から番号を検索します。 EABIはキャッシュ汚染を引き起こしたので、このアプローチを放棄しました(最新のARM CPUには別々の命令とデータキャッシュがあります)。
答え2
まずx86(-64)をサポートします。256項目割り込みテーブル、その一部は実際のハードウェア割り込みに使用されます。最初から計算マニュアルページはsyscalls(2)
こちら、Linuxには400を超えるさまざまなシステムコールがあります。すべてのアーキテクチャに存在するわけではありませんが、その他のリスト、x86-64には314の異なるシステムコール(0〜313)があります。したがって、少なくともx86ベースのLinuxでは、各システムコールに対して異なる割り込み番号を予約する方法はないようです。
もちろん、x86が唯一のアーキテクチャではありません。他のものは、使用可能なソフトウェア割り込みが少なくなるか、ハードウェア割り込みとは別にシステムコールパスが完全に異なる可能性があります。実際、最新のx86(-64)にはすでに次のような別々のパスがあります。SYSCALLおよびSYSENTER命令:
SYSENTER / SYSEXITコマンド(およびAMDの同等のSYSCALL / SYSRET)は、カーネルへの高速アクセスを提供し、割り込みオーバーヘッドを防ぎます。
カーネルへの単一のエントリポイントのみを使用するもう1つの考えられる理由は、特定のシステムコールに関係なく、ユーザースペース/カーネルの切り替えに関連する強制配列によるものです。一部の状態を保存するか、スタックを切り替える必要があります。これらのタスクは、アーキテクチャとシステム設計の特定の機能によって異なりますが、これらのタスクを実行する必要がある場合は、1か所で完了するのが簡単になる可能性があります。 (特に、このような低レベルの操作は、新しいコンテキストで関数呼び出しが行われる前に最初に実行する必要があるためです。)
上記の内容のほとんどは推測に過ぎません。私はx86以外のアーキテクチャ(ユニバーサルオペレーティングシステムを実行していないいくつかのアーキテクチャを除く)にはまったく慣れておらず、Linuxシステムも見たことがありません。呼び出しは非常に厳密に実装されており、他の作業システムは言うまでもありません。より低いレベルの詳細が必要な場合は、他の人が提供できることを願っています。