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