c - syscall 是 x86_64 上的指令吗?

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

现在我的问题是:

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

最佳答案

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) 只是一个可以作为跳转目标的Label。也许 SYSCALL_ERROR_LABEL 处的代码跳回到那里,尽管该代码块只是 ret 会更有效,所以它可能是以前版本的遗留物,或者用于其他用途。

关于c - syscall 是 x86_64 上的指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10583891/

相关文章:

iphone - 尝试为 iPhone 编译 x264 和 ffmpeg - "missing required architecture arm in file"

c - C中的排序结构无法在VS2017中显示输出结果,但在CodeBlocks中显示

c - ARM汇编跳转到地址

c - 如何获取 C 宏中声明的变量的地址?

c - 指向 char 数组的指针数组

linux - 如何使用 SLURM 获取 GPU (GRES) 分配报告

linux - 如何从脚本创建简单的日志文件

php - xdebug 和 CentOS 的问题

c++ - 我可以让我的 Makefile 自动让 GCC 使用它支持的最新标准吗?

c++ - g++ 链接到外部库创建 undefined reference