linux x86_64 nasm 程序集系统调用

linux x86_64 nasm assembly syscalls

我在网上找到了显示 x86_64 linux nasm 程序集的各种系统调用的图表,似乎总共有 380 个左右的系统调用,但是我只能找到每本书或教程 "how a few of the syscalls work and what they do?" 有谁知道我在哪里可以找到关于使用 nasm 汇编程序的 x86_64 linux 程序集的每个系统调用的信息?

任何帮助都会很棒。

查看 Linux 手册页(第 2 部分)。 http://man7.org/linux/man-pages/dir_section_2.html

无论您使用什么汇编器(或 C 编译器)来创建 x86-64 机器代码,您可以进行的系统调用都是相同的。 (在 RAX 和 运行 syscall 指令中放入一个调用号;在内核中,它使用该编号来索引一个 table 函数指针。或 returns -ENOSYS 如果超出范围。)

使用 strace ./my_program 调试您的程序以跟踪它进行的系统调用。 这会将 args 和 return 值解码为有意义的内容调用基础,因此您可以轻松查看是否传递了错误的指针,例如进行系统调用 return -EFAULT 。 (系统调用不会引发 SIGSEGV / 段错误,它们只是 return 一个错误。)


/usr/include/asm/unistd_64.h 有实际数字。 (在为 64 位编译时由 <asm/unistd.h> 包含)。手册页将根据 C 语法记录参数。 鉴于C原型,您可以根据x86-64 System V ABI计算出asm ABI。 (与函数调用 ABI 相同,除了第 4 个参数使用 R10 而不是 RCX,如果存在的话。)What are the calling conventions for UNIX & Linux system calls on i386 and x86-64

syscall(2) 是用于系统调用的 glibc 包装函数,the syscall man page 还记录了各种 Linux 平台(x86-64、SPARC、ARM 等)的 asm ABI。 ,包括调用号和ret val的寄存器,以及进入内核的指令。请注意,函数名称与 x86-64 syscall 指令相同只是巧合。


没有人会费心为每种不同风格的 asm 语法的每个系统调用制作详尽的文档 - 这些信息都在手册页和调用约定文档中; Linux 手册页的 NOTES 部分记录了 C 库包装器 API 与底层 asm 系统调用之间的差异。

另请参阅 https://blog.packagecloud.io/eng/2016/04/05/the-definitive-guide-to-linux-system-calls/ 以了解更多信息,包括 VDSO 内容以实现高效 getpid / clock_gettime,甚至无需进入内核。

但是,有些人确实编译了 table 系统调用名称和 Linux x86-64 调用编号和 arg 寄存器。我从来没有发现它有用(系统调用调用约定非常接近函数调用约定,因此很容易记住),但是 https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/ 如果你想要它就在那里。


Notable POSIX 函数和原始 Linux 系统调用之间存在一些差异:例如 brk / sbrk, and also getpriority 其中 "nice"级别 return 值有偏差,因此它们不在错误代码的 -4095..-1 范围内。 但是大多数系统调用都有一个与 C 库包装器原型完全匹配的 ABI,在这种情况下,注释部分没有提及任何内容。