Linux系统调用> 6个参数

时间:2014-02-02 23:44:29

标签: linux-kernel system-calls

是否可以编写一个具有6个以上输入参数的(linux内核)sycall函数?查看标题我发现定义的系统调用宏最多有6个参数。我很想尝试定义SYSCALL7和SYSCALL8以允许7和8参数,但我不太确定它是否真的有效。

3 个答案:

答案 0 :(得分:2)

对于x86,以下函数(来自x86...syscall.h)复制参数:

static inline void syscall_get_arguments(struct task_struct *task,
                                         struct pt_regs *regs,
                                         unsigned int i, unsigned int n,
                                         unsigned long *args)
{
        BUG_ON(i + n > 6);
        memcpy(args, &regs->bx + i, n * sizeof(args[0]));
}

asm_generic/syscall.h的评论中很好地描述了这个功能。它将参数复制到系统调用中,并且限制为6个参数。它可以根据架构以多种方式实现。对于x86(来自上面的代码片段),看起来这些参数都是通过寄存器传递的。

因此,如果要传递6个以上的参数,请使用结构。如果必须拥有SYSCALL7,那么您将不得不创建自定义内核,并且可能几乎修改系统调用进程的每一步。 x86_64可能更容易适应这种变化,因为它有比x86更多的寄存器。

答案 1 :(得分:1)

如果有一天你需要20个参数怎么办?我认为绕过系统调用问题的最佳方法是使用指向*void的指针。

这样您就可以传递包含无限量参数的struct

答案 2 :(得分:1)

一般来说参数的数量没有限制。但所有这些都需要一个标准:所有内核模块写入,用户或调用者需要就将信息从调用者传递给被调用者(反之亦然)的标准方法达成一致 - 无论是通过堆栈还是寄存器传递。它被称为" ABI"或召集会议。 x86和AMD64有不同的标准,对于x86中的所有UNIX通常都是一样的:Linux,FreeBSD等。

http://www.x86-64.org/documentation/abi.pdf

例如,x86系统调用ABI:

http://lwn.net/Articles/456731/

http://esec-lab.sogeti.com/post/2011/07/05/Linux-syscall-ABI

更多详情请参阅(以避免重复):

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

Why does Windows64 use a different calling convention from all other OSes on x86-64?

用户空间也有自己的ABI:

https://www.kernel.org/doc/Documentation/ABI/README

https://lwn.net/Articles/234133/

http://lwn.net/Articles/456731/