【问题标题】:Why doesn't the 'syscall' instruction work under Linux?为什么 'syscall' 指令在 Linux 下不起作用?
【发布时间】:2015-12-30 19:33:17
【问题描述】:

我有一个在 Linux 用户空间中运行的非常基本的汇编程序:

section .text
global _start

_start:
    mov edx, 14
    mov ecx, msg
    mov ebx, 1
    mov eax, 4
    syscall

    mov eax, 1
    syscall

section .data
msg db "Hello, World!", 0xA

但是,这不起作用,但前提是我将 syscalls 替换为 int 0x80。这些不做同样的事情吗?我知道syscall 旨在降低延迟,但除此之外,我认为没有区别。为什么它不起作用?

【问题讨论】:

  • 也许您正在寻找sysenter? Linux 将带有用户空间 sysenter 包装器的页面映射到 32 位进程的虚拟地址空间。这是 VDSO。
  • 确实有一些所谓的手册页,您确实需要查找。特别是关于syscallsyscalls 和您要调用的系统调用。你会在那里找到你必须知道的一切。

标签: linux assembly x86-64


【解决方案1】:

syscall 仅适用于 x86-64 操作系统,您应该将系统调用号放入rax 寄存器而不是eaxSee this website for more information.

【讨论】:

  • 没有系统调用号需要超过32位来表示!! mov r32, imm32 将 64 位寄存器的 upper32 归零。使用一些汇编程序编写mov rax, 231 只会导致机器代码中的字节浪费。 (REX.W=1 mov r, imm32(符号扩展)或更糟的REX.W=1 mov r, imm64。)
【解决方案2】:

syscall 指令不会在任何地方存储“返回 RIP”或“返回 RSP”,因此这些通常存储在使用 syscall 指令之前的先前指令的寄存器中。

我怀疑在 Linux 上 RCXRDX 用于此目的;并且所有其他参数都因此在不同的寄存器中结束。

【讨论】:

  • RCX 和 R11,实际上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 2016-10-03
  • 2016-11-18
相关资源
最近更新 更多