2012-05-14 11 views
7

glibcでシステムコールを実行するコードをチェックしたかったのです。私はこのようなものを見つけた。syscallはx86_64の命令ですか?

ENTRY (syscall) 
    movq %rdi, %rax  /* Syscall number -> rax. */ 
    movq %rsi, %rdi  /* shift arg1 - arg5. */ 
    movq %rdx, %rsi 
    movq %rcx, %rdx 
    movq %r8, %r10 
    movq %r9, %r8 
    movq 8(%rsp),%r9 /* arg6 is on the stack. */ 
    syscall   /* Do the system call. */ 
    cmpq $-4095, %rax /* Check %rax for error. */ 
    jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */ 
L(pseudo_end): 
    ret   /* Return to caller. */ 

私の質問は、(cmpq命令の前の)syscallが命令の場合ですか?第二に、それが命令の場合、ENTRY(システムコール)の意味は何ですか? ENTRY(ENTRYが何であるかわからない)とインストラクションの同じ名前ですか?第二に、L(pseudo_end)とは何ですか?

+0

です。それはx86の 'int 0x80'と同じです。 – Dave

+0

通常、システムコールごとに特殊なコードが使用され、定数から '%rax'を設定し(レジスタを保存する)、未使用の引数の設定をスキップすることに注意してください。 – o11c

答えて

3

はい、syscallはx86-64の命令です。 i686にも同様の指示sysenterがあります。

ENTRY(syscall)はマクロになります。シンボル定義に展開されている可能性があります。そのためにgrepする必要があります。

7

syscallは、x86-64の命令であり、ABI for making system callsの一部として使用されます。 (32ビットABIはint 80hまたはsysenterを使用し、64ビットモードでも使用できますが、64ビットコードから32ビットABIを使用することは悪い考えです。特にポインタ引数を持つ呼び出しの場合は好ましくありません)

しかし、C library function named syscall(2)もあります。これはシステムコールABI用の汎用ラッパーです。あなたのコードには、戻り値のデコードを含む、その関数のダンプがerrnoに設定されています。 ENTRY(syscall)は、関数がそこから開始することを意味します。

L()およびENTRY()はCPPマクロです。

は、ジャンプターゲットにすることができるラベルです。 SYSCALL_ERROR_LABELのコードは、そのコードブロックがただちにretになると効率的ですが、元のバージョンの遺物であるか、他のものに使用されている可能性があります。

+1

これが実際の命令であれば、そのオペコードは何ですか? – SasQ

+1

0x0F 0x05です(インテルのソフトウェア開発者マニュアルをご覧ください)。 – flolo

関連する問題