69

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

i386 アーキテクチャ (32 ビット x86 ユーザー空間) の場合、どちらがより望ましいか、syscallまたはint 0x80その理由は?

Linux カーネル バージョン 3.4 を使用しています。


脚注 1:int 0x80場合によっては 64 ビット コードで動作しますが、推奨されることはありません。 32 ビット int 0x80 Linux ABI を 64 ビット コードで使用するとどうなりますか?

4

4 に答える 4

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

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

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

于 2012-10-09T19:18:54.770 に答える
23

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

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

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

于 2012-10-09T19:13:48.903 に答える
-5

int 0x80カーネルに何かをするように指示するためのシステムコールを示すのに適した用語です。

意味と解釈は互換性があり、「syscall を作成する」または「int 80h を発行する」です。

DOS の時代と変わりません。

  • int 21h を呼び出して、DOS に AX レジスタとオプションで ES:DX レジスタ ペアに基づいて何かを実行させます。
  • int 13h は BIOS ハードディスク ハンドラです。
  • int 10h は EGA/VGA 画面です。
  • int 09h はキーボード ハンドラです。

ここでの共通のテーマはこれです。割り込み/システムコールが呼び出されると、カーネルはレジスタの状態をチェックして、必要なシステムコールのタイプを確認します。たとえば、eaxレジ​​スタを見て、何を実行するかを決定することで、内部的にカーネル空間へのコンテキスト スイッチを実行し、呼び出しの結果を返すオプションを使用して、手順とコンテキスト スイッチをユーザー空間に戻します。成功したか、失敗したか。

于 2012-10-09T19:11:03.630 に答える