syscall (2) 的参数及其目的是什么?

What are the arguments of syscall (2) and their purpose?

我看到这个 wikibook,它表明可以有 7 个参数传递给 syscall,我想了解每个参数的用途。

这在man page中没有指定。
此外,我发现了 table 可以传递给每个系统调用的参数,但我不一定理解它们之间的共同点。

理想情况下,我正在寻找指定的答案

arg #1 - pid  
arg #2 - ... 

架构为 x86-64。

table you linked to 提供了您要求的参数列表。

我想您可能感到困惑的是 syscall 不执行任何操作。相反,它是一个通用的 API 用于 任何您可能希望内核做的事情 -- 打开文件、映射内存、派生新进程等等.

您希望内核执行的具体操作是使用系统调用号选择的。只需从 table 中选择第一个,系统调用 0(称为 sys_read)从文件中读取。

显然,不同系统调用执行的操作需要不同的参数。继续使用 sys_read 示例,我们在 table 中看到它采用三个参数:文件描述符 (fd)、指向缓冲区的指针 (buf) 和要读取的字节数 (count)。所以如果你想调用这个系统调用,你可以按如下方式进行:

#include <sys/syscall.h>

// Assuming these have been initialized appropriately.
unsigned int fd = ...;
char * buf = ...;
size_t count = ...;

syscall(SYS_read, fd, buf, count);

This answer 提供了有关您何时可能希望选择使用 syscall 的更多信息。简短的版本是使用 syscall 的原因很少。

编辑:正如@PeterCordes 指出的那样,ABI 之间的系统调用编号不同,因此您应该使用 sys/syscall.h 中定义的常量,而不是自己对系统调用编号进行硬编码。