web-dev-qa-db-ja.com

「int 0x80」または「syscall」の方が良いですか?

Linuxカーネルを調べたところ、x86_64アーキテクチャでは、割り込みint 0x80がシステムコールの呼び出しとして機能しないことがわかりました。

問題は:x86アーキテクチャの場合、より望ましいsyscallまたはint 0x80とその理由は何ですか?

[〜#〜] edit [〜#〜]:カーネル3.4を使用します

56
Alex
  • syscallは、x86-64でカーネルモードに入るデフォルトの方法です。この命令は、Intelプロセッサーの32ビット動作モードでは使用できません
  • sysenterは、32ビットモードの操作でシステムコールを呼び出すために最も頻繁に使用される命令です。 syscallに似ていますが、使用するのが少し難しいですが、それはカーネルの関心事です。
  • int 0x80は、システムコールを呼び出す従来の方法であり、使用しないでください。

システムコールを呼び出す好ましい方法は、VDSOを使用することです。VDSOは、システムコールをより効率的に使用できるようにする各プロセスアドレス空間にマップされたメモリの一部です(たとえば、場合によってはカーネルモードに入らない)。また、VDSOは、従来のint 0x80方法と比較して、syscallまたはsysenter命令の処理をより困難にします。

また、 this および this も参照してください。

73
Paweł Dziepak

私の答え here はあなたの質問をカバーしています。

実際には、最近のカーネルは [〜#〜] vdso [〜#〜] を実装しています。特にシステムコールを動的に最適化するために(カーネルはVDSOを現在のプロセッサに最適なコードに設定します)。したがって、VDSOを使用する必要があります。既存のsyscallには、libcが提供するインターフェイスを使用する方が適切です。

単純なsyscallsのコストのかなりの部分を占めるAFAIKは、ユーザー空間からカーネルへ、そしてその逆になっていることに注意してください。したがって、一部のシステムコール(おそらくgettimeofdaygetpid ...)に対して、VDSOはそれさえも回避する可能性があります(技術的には実際のシステムコールを回避する可能性があります)。ほとんどのシステムコール(openreadsendmmap ...など)では、システムコールのカーネルコストは改善するのに十分な大きさです。ユーザー空間からカーネル空間への移行(たとえば、SYSENTERの代わりにSYSCALLまたはINTマシン命令を使用)の意味はありません。

19

変更する前にこれに注意してください:システムコール番号は異なります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の場合

7
Thomas