6

也就是说,你怎么知道

特定系统调用需要多少参数,

每个参数应该在哪个寄存器中,

最后每个参数的含义是什么?

有没有man类似的命令可以告诉你?

4

3 回答 3

3

另请参阅:x86-64 上 UNIX 和 Linux 系统调用的调用约定是什么

你要找的是内核ABI,我找不到官方网站,但是有一个博客有这样的信息。

在带有 int 80h 调用的 x64 中,它是:

value   storage
syscall nr  rax
arg 1   rdi
arg 2   rsi
arg 3   rdx
arg 4   r10
arg 5   r9
arg 6   r8
于 2011-12-23T04:20:26.030 回答
2

Linux 手册页项目(当然是以 C 为中心的)

于 2011-12-23T19:54:34.970 回答
1

据我所知,没有关于系统调用的手册,这是你必须深入研究源代码的东西。

这个头文件很有用,因为它有许多带有参数原型的系统调用:

include/linux/syscalls.h

它包含定义,例如:

asmlinkage long sys_getresuid(uid_t __user *ruid, uid_t __user *euid, uid_t __user *suid);
asmlinkage long sys_getresgid(gid_t __user *rgid, gid_t __user *egid, gid_t __user *sgid);
asmlinkage long sys_getpgid(pid_t pid);
asmlinkage long sys_getpgrp(void);
asmlinkage long sys_getsid(pid_t pid);
asmlinkage long sys_getgroups(int gidsetsize, gid_t __user *grouplist);

arch syscalls 头文件包含其余的系统调用,一个依赖于arch:

arch/x86/include/asm/syscalls.h

(这些文件从 2.6.32 开始 - 内核的早期/更高版本可能具有不同的文件/目录名称)。

请记住,Linux 内核的内部结构经常发生变化,并且在主要内核版本之间保持稳定的 ABI 并没有付出太多努力。因此,您必须查看当前正在运行的内核的内核源代码,并且不要期望它会在任何其他内核版本上自动编译。

于 2011-12-22T15:51:16.060 回答