syscall

読み:シス・コール
外語:syscall 英語
品詞:固有名詞

AMDx86系プロセッサーの命令の一つで、システムコール用に用意された命令。

目次

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)に切り替え、カーネルモードルーチンの実行を開始
関連するリンク
SYSCALL and SYSRET Instruction Specification
用語の所属
x86
関連する用語
システムコール
sysenter

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club