GNU/Linux >> Linux の 問題 >  >> Linux

Linux の 32 ビット コードでは、int 0x80 と syscall のどちらが優れていますか?

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

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

また、これとこれを参照してください。


ここでの私の回答は、あなたの質問をカバーしています。

実際には、最近のカーネルは VDSO を実装しており、特にシステム コールを動的に最適化しています (カーネルは VDSO を現在のプロセッサに最適なコードに設定します)。そのため、VDSO を使用する必要があります。また、既存のシステム コールには、libc によって提供されるインターフェイスを使用することをお勧めします。

私の知る限り、単純なシステムコールのコストのかなりの部分は、ユーザー空間からカーネルへ、そしてその逆であることに注意してください。したがって、一部のシステムコール (おそらく gettimeofdaygetpid ...) VDSO はそれさえも回避する可能性があります (技術的には、実際のシステムコールを実行することを回避する可能性があります)。ほとんどのシステムコール (open など) 、 readsendmmap ....) 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 システムコール用


Linux
  1. Linux –カーネルのプロプライエタリまたはクローズドパーツ?

  2. カーネル Linux サーバーの基礎となるものは?

  3. Linux の Bash 終了コードとは

  1. Linux アプリケーションの syscall アクセスを制限する

  2. Linux カーネルがプリエンプティブであるとはどういう意味ですか?

  3. CコードからLinuxカーネルモジュールをロードする方法は?

  1. 64 ビット Linux での 32 ビット プロセスのアドレス空間

  2. Linuxカーネルコードで__initはどういう意味ですか?

  3. 再起動せずにカーネルを更新