你在哪里检查x86-64机器上系统调用的原型?

时间:2011-12-22 02:56:59

标签: linux assembly x86-64 system-calls abi

那就是,你怎么知道

特定系统调用所需的参数数量,

注册每个参数应该在,

最后每个参数意味着什么?

是否有man相似的命令告诉你?

3 个答案:

答案 0 :(得分:3)

另见:What are the calling conventions for UNIX & Linux system calls on x86-64

你要找的是内核ABI,我找不到官方网站,但a blog有这样的信息。

在带有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

答案 1 :(得分:2)

Linux man-pages project(当然以C为中心)

答案 2 :(得分: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并没有花费太多精力。因此,您必须查看当前正在运行的内核的内核源代码,并且不要指望它在任何其他内核版本上自动编译。