C语言 系统调用是关于x86_64的指令



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

现在我的问题是:

  1. syscall(在cmpq指令之前)是指令吗?
  2. 如果是指令,ENTRY (syscall)的含义是什么?条目的名称相同(我不知道条目是什么)和指令?
  3. 什么是L(pseudo_end)

syscall是x86-64中的一条指令,用作ABI的一部分进行系统调用。 (32 位 ABI 使用 int 80hsysenter ,在 64 位模式下也可用,但从 64 位代码使用 32 位 ABI 是一个坏主意,特别是对于带有指针参数的调用。

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

L()ENTRY()是CPP宏。

L(pseudo_end)只是一个可以作为跳转目标的标签。 也许SYSCALL_ERROR_LABEL的代码跳回到那里,尽管该代码块只是ret会更有效,所以也许它是以前版本的遗物,或者用于其他用途。

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

ENTRY(syscall)将是一个宏。可能会扩展到符号定义,您必须为此进行 grep。

相关内容

  • 没有找到相关文章

最新更新