23

glibc でシステム コールを実行するためのコードを確認したかったのです。このようなものを見つけました。

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.  */

ここで私の質問は、syscall (命令の前cmpq) が命令であるかどうかです。第二に、それが命令である場合、ENTRY (syscall) の意味は何ですか? ENTRY (ENTRY が何なのかわからない) と指示が同じ名前ですか? 第二に、L(pseudo_end) とは何ですか?

4

2 に答える 2

31

syscallは x86-64 の命令であり、システム コールを行うための ABI の一部として使用されます。(32 ビット ABI はint 80horsysenterを使用し、64 ビット モードでも使用できますが、64 ビット コードから 32 ビット ABI を使用することは、特にポインター引数を使用した呼び出しの場合は、悪い考えです。)

ただし、システム コール ABI の汎用ラッパーであるという名前の C ライブラリ関数syscall(2)もあります。errnoコードは、戻り値の-settingへのデコードを含む、その関数のダンプを示しています。ENTRY(syscall)関数がそこから始まることを意味します。

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

L(pseudo_end)ジャンプ先になり得る単なるラベルです。のコードはSYSCALL_ERROR_LABELそこに戻るretかもしれませんが、そのコードのブロックはただ .

于 2012-05-14T13:14:11.573 に答える
6

はい、syscallx86-64 の命令です。sysenteri686 にも同様の説明があります。

ENTRY(syscall)マクロになります。おそらくシンボル定義に展開されるため、grep する必要があります。

于 2012-05-14T13:09:50.490 に答える