syscall是x86_64上的指令吗?
我想检查在glibc中执行系统调用的代码。我发现了这样的东西syscall是x86_64上的指令吗?,c,linux,gcc,x86-64,machine-instruction,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),%r
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
指令之前)是否是一条指令?其次,如果它是一条指令,那么条目(syscall)的含义是什么?条目(我不知道条目是什么)和指令的名称相同?其次,什么是L(伪端)?是的,syscall
是x86-64上的一条指令。i686上有一条类似的指令syscenter
ENTRY(syscall)
将是一个宏。可能扩展到符号定义,您必须对此进行grep处理。是x86-64中的一条指令,用作。(32位ABI使用int80h
或sysenter
,并且在64位模式下也可用,但使用64位代码中的32位ABI是个坏主意,尤其是对于带有指针参数的调用。)
但是还有一个,系统调用ABI的通用包装器。代码显示该函数的转储,包括将返回值解码为errno
-设置ENTRY(syscall)
只是表示函数从那里开始
L()
和ENTRY()
是CPP宏
L(pseudo_end)
只是一个可以作为跳转目标的标签。也许SYSCALL\u ERROR\u LABEL
上的代码会跳回那里,尽管将该代码块重新调用会更有效,所以它可能是以前版本的遗物,或者用于其他用途。的确如此。它的作用与x86中的int 0x80
相同。请注意,每个系统调用都使用通常专用的代码,从常量(保存寄存器)设置%rax
,并跳过设置未使用的参数。如果这是一条实际指令,它的操作码是什么?它是0x0F 0x05(请参阅英特尔的软件开发人员手册)。