命令を使ってシステムコールを呼び出す方法x86(32bit)環境で、どのようにシステムコールが呼ばれているのかを調べてみました。コールするとシステムコールが呼ばれます。ソフトウェア割り込みは遅いのが欠点です。いうシステムコール専用の命令が用意されています。比べるとかなりシンプルで、予め設定されたシステムコールハンドラのアドレスをCS:EIPとSS:ESPにセットして、特権モードに切り替えて実行を再開するのみです。2E/sysenter/syscall考察」が参考になります。ここでのポイントは、sysenter命令はユーザーモード空間での実行アドレスをスタックやレジスタに退避しないということです。どこにも保存されません。sysexitはどのように戻っているのでしょうか。ここで疑問ですが、sysenterで保存しないのにどうやってsysexitでESPとEIPを復元しているのでしょうか。答えは、「sysenterを呼び出すのは決められたサブルーチンに限る」です。呼び出すことはありません。戻るときは、カーネルがその「決められたサブルーチン」の値を直接指定して戻ります。呼び出すサンプルプログラムを見てみましょう。実行例は次のようになります。すると、システムコールが実行されます。呼ばれている領域が該当します。いうのは、カーネルがユーザープログラムから使えるように、共有ライブラリとして自動的にリンクしている領域です。含まれているコードを見てみましょう。しているコードが見つかりました。保存しているのは、システムコールからユーザースタックにアクセスすることがあるからです。このvdsoのアドレスはカーネルが知っているので、カーネルは決め打ちでEDXとECXをセットすることができます。これがシステムコールハンドラでECXにセットされます。このアドレスを探してきて保存しているようでした。ようなノリで使うものじゃ無いっぽいですね。同じような仕組みだったのでしょうか。