私は、割り込みを使用する「既存の」システムコールメカニズムと、特定のプロセッサ命令に依存する現在のシステムコールメカニズムとの違いを理解しようとしています。
AFAIK 両方とも C プログラムに関して同じ方法で動作します。カーネルC関数が呼び出され、正しいシステムコールハンドラに渡されます。それでは、「新しい」システムコールシステムをより効率的にすることは何ですか?
ただ、より効率的なプロセッサ命令が「割り込み」よりも「システムコール」を速く呼び出すのでしょうか?この時間差は、システムコール自体が実行する必要がある作業量(ファイルの書き込みなど)に比べて十分に重要ですか?
答え1
はるかに少ない作業を行う必要があり、メモリから読み取る必要がないため、より高速です。
ソフトウェア割り込みを使用してシステムコールを発行すると、CPUは知るこれがあなたがやっていることです。割り込み記述子テーブルから宛先CSおよびEIP値を読み取る必要があります。 CS 値は、ターゲット権限レベルが何であるかを指定します。 CPUがそれを把握したら、メモリからより多くのデータを読み取る必要があるターゲット状態を決定する必要があります。
SYSCALL
反対側は完全にレジスタベースです。ターゲット権限レベルは事前に知られており、ターゲット状態はカーネルによって設定されたMSRによって指定されます。
一部のシステムコール時間に比べて速度差は小さいが、高速システムコールが多い。もちろん、KPTIビジネス全体は、すべてのシステムコールが遅いことを意味しますが、スピードアップはSYSCALL
依然として価値があります。