syscall是x86_64上的指令吗?

时间:2012-05-14 13:03:33

标签: c linux gcc x86-64 machine-instruction

我想检查在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.  */

现在我的问题是系统调用(在cmpq指令之前)是否是指令?其次,如果它是一个指令,ENTRY(系统调用)的含义是什么? ENTRY的同名(我不知道ENTRY是什么)和指令?其次,什么是L(pseudo_end)?

2 个答案:

答案 0 :(得分:10)

syscall是x86-64中的指令,用作ABI for making system calls的一部分。 (32位ABI使用int 80hsysenter,也可以在64位模式下使用,但使用64位代码的32位ABI是一个坏主意,特别是对于使用指针参数。)

但是还有一个C library function named syscall(2),它是系统调用ABI的通用包装器。您的代码显示该函数的转储,包括将返回值解码为errno - 设置。 ENTRY(syscall)只是意味着函数从那里开始。

L()ENTRY()是CPP宏。

L(pseudo_end)只是一个可以成为跳跃目标的标签。也许SYSCALL_ERROR_LABEL处的代码会跳回到那里,尽管这个代码块只有ret会更有效,所以它可能是以前版本的遗留物,或用于其他东西。< / p>

答案 1 :(得分:5)

是的,syscall是关于x86-64的说明。在i686上有类似的指令sysenter

ENTRY(syscall)将是一个宏。可能会扩展到符号定义,你必须为此而努力。