syscall
x86-64
でカーネルモードに入るデフォルトの方法です .この命令は、Intel プロセッサの 32 ビット動作モードでは使用できません。 .sysenter
は、32 ビット動作モードでシステム コールを呼び出すために最も頻繁に使用される命令です。syscall
に似ています 、使用するのは少し難しくなりますが、それはカーネルの問題です。int 0x80
システム コールを呼び出す従来の方法であり、避ける必要があります。
システム コールを呼び出すための推奨される方法は、vDSO を使用することです。vDSO は、システム コールをより効率的に使用できるようにする各プロセス アドレス空間にマップされたメモリの一部です (たとえば、場合によってはまったくカーネル モードに入らないことによって)。 vDSO は、従来の int 0x80
と比較して、より困難な処理も行います 方法、syscall
の処理 または sysenter
また、これとこれを参照してください。
ここでの私の回答は、あなたの質問をカバーしています。
実際には、最近のカーネルは VDSO を実装しており、特にシステム コールを動的に最適化しています (カーネルは VDSO を現在のプロセッサに最適なコードに設定します)。そのため、VDSO を使用する必要があります。また、既存のシステム コールには、libc によって提供されるインターフェイスを使用することをお勧めします。
私の知る限り、単純なシステムコールのコストのかなりの部分は、ユーザー空間からカーネルへ、そしてその逆であることに注意してください。したがって、一部のシステムコール (おそらく gettimeofday
、 getpid
...) VDSO はそれさえも回避する可能性があります (技術的には、実際のシステムコールを実行することを回避する可能性があります)。ほとんどのシステムコール (open
など) 、 read
、 send
、 mmap
....) syscall のカーネル コストは、ユーザー空間からカーネル空間への移行を改善するのに十分な大きさです (例:SYSENTER
を使用) または SYSCALL
INT
の代わりに機械語命令 )重要ではありません。
変更する前に注意してください:システム コール番号が異なります 0x80 または syscall を実行する場合、たとえば sys_write は 0x80 で 4、syscall で 1 です。
32 ビットまたは 0x80 の場合は http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.htmlhttp://blog.rchapman.org/post/36801038863/linux-system-call-table-for -x86-64 システムコール用