温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - linux x86_64 nasm assembly syscalls
assembly linux system-calls x86-64

其他 - Linux x86_64 nasm汇编系统调用

发布于 2020-04-08 12:42:20

我在网上找到了图表,其中显示了x86_64 linux nasm程序集的各种系统调用,总的系统调用似乎有380ish,但是我每本书或每本教程都只能找到“一些系统调用的工作方式以及它们的作用?” 有谁知道我可以使用nasm汇编程序在x86_64 linux汇编程序的每个系统调用中找到信息?

任何帮助都会很棒。

查看更多

提问者
Spencer_J
被浏览
172
Peter Cordes 2020-03-12 03:15

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

创建x86-64机器代码所用的汇编程序(或C编译器)都没有关系,您可以进行的系统调用相同。(在RAX中放置一个呼叫号码并运行syscall指令;在内核内部,它使用该号码为函数指针表建立索引。-ENOSYS如果超出范围,则返回。)

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


/usr/include/asm/unistd_64.h有实际数字。(包含<asm/unistd.h>在64位编译时)。手册页将以C语法记录args。 给定C原型,您可以根据x86-64 System V ABI来设计asm ABI(与功能调用ABI相同,除了第4个arg用R10代替RCX,如果有的话。) 在i386和x86-64上UNIX和Linux系统调用的调用约定是什么?

syscall(2)是用于系统调用的glibc包装函数,并且syscall手册页还记录了适用于各种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甚至没有进入内核。

但是,有些人会编译系统调用名称以及Linux x86-64调用编号和arg寄存器的表。我从来没有发现它有用(syscall调用约定与函数调用约定非常接近,以至于容易记住),但是如果需要的话,也可以使用https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/


两次调用之间存在POSIX函数和原始Linux系统调用之间的显着差异:例如brk/sbrk,并且getpriority“ nice”级别的返回值也有偏差,因此它们不在-4095..-1错误代码范围内。 但是大多数系统调用都具有与C库包装器原型完全匹配的ABI,在这种情况下,NOTES部分未提及任何内容。