syscall
読み:シス-コール
外語:syscall
AMDのx86系プロセッサーの命令の一つで、システムコール用に用意された命令。
概要
AMD K6以降で利用できる。また、AMD64 ISA互換機能として搭載されたIntel 64でも利用できる。
オペコードは「0fh 05h」の2バイトである。
元の処理に戻る場合の命令はsysretで、こちらのオペコードは「0fh 07h」の2バイトである。
特徴
由来
従来、システムコールの実装にはソフトウェア割り込み機能が使われていた(Windows NT系ならint 2eh、Linuxならint 80h)が、ソフトウェア割り込みは処理が煩雑であるため遅かった。
そこで、高速なシステムコールを実現するために、この命令が追加された。
対応判定
未対応のCPUで利用すると無効命令例外が発生するので、CPUがこの命令に対応しているかどうかは、CPUID命令で判定する。
EAX=80000000HでCPUID命令を実行し、返却値EAXの最上位ビットが1となる拡張CPUID対応環境で、かつEAX=80000001HでCPUIDを実行した結果得られたEDXレジスターのビット11が1のとき、命令に対応している。
挙動
syscall命令は、次のような動作をする。
- レガシーモードの場合
- syscall命令の次のアドレス(EIP)をECXレジスターにロード
- CSレジスターに、STAR MSR(MSR C000_0081H:ビット47‐32)の値をロード
- EIPレジスターに、STAR MSR(MSR C000_0081H:ビット31‐0)の値をロード
- SSレジスターに、CSレジスターにロードした値に8を加算した値をロード
- 特権レベル0(RING 0)に切り替え、カーネルモードルーチンの実行を開始
- ロングモードの場合
- syscall命令の次のアドレス(RIP)をRCXレジスターにロード
- フラグ(RFLAGS)をR11レジスターにロード
- RIPレジスターに、64ビットモードならLSTAR MSR(MSR C000_0082H)、コンパチビリティモードならCSTAR MSR(MSR C000_0083H)の値をロード
- CSレジスターに、STAR MSR(MSR C000_0081H:ビット47‐32)の値をロード
- SSレジスターに、CSレジスターにロードした値に8を加算した値をロード
- RFLAGSレジスターに、RFLAGSレジスターとSYSCALL_FLAG_MASK(MSR C000_0084H:ビット31‐0)との論理積(AND)をロード
- 特権レベル0(RING 0)に切り替え、カーネルモードルーチンの実行を開始
再検索