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
中定义的常量,而不是自己对系统调用编号进行硬编码。
我看到这个 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
中定义的常量,而不是自己对系统调用编号进行硬编码。