首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >>6个参数的Linux Syscalls

>6个参数的Linux Syscalls
EN

Stack Overflow用户
提问于 2014-02-02 23:44:28
回答 3查看 2.9K关注 0票数 2

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-03 00:41:36

对于x86,以下函数(来自X86.)将参数复制到:

代码语言:javascript
复制
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]));
}

这个函数在通用/系统。h中的注释中有很好的描述。它将参数复制到syscall中,并且有6个参数的限制。它可以通过多种方式实现,这取决于体系结构。对于x86 (来自上面的片段),似乎所有的参数都是通过寄存器传递的。

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

票数 3
EN

Stack Overflow用户

发布于 2014-02-03 12:08:22

如果有一天你需要20个参数呢?我认为解决syscall问题的最好方法是使用指向*void的指针。

通过这种方式,您可以传递包含无限参数的struct

票数 1
EN

Stack Overflow用户

发布于 2014-03-22 13:31:43

一般来说,参数的数量是没有限制的。但是,所有这些都需要一个标准:所有内核模块的编写和用户或调用者将需要商定一种标准的方式将信息从调用者传递给被调用者(反之亦然)--不管是经过堆栈还是寄存器。它被称为"ABI“或呼叫约定。x86和AMD64有不同的标准,一般情况下,x86中的所有UNIX都是相同的: Linux、FreeBSD等。

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

x86 syscall ABI

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

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

详情请参阅(为避免重复):

在x86-64上,UNIX和Linux系统调用的调用约定是什么?

为什么Windows64在x86-64上使用与所有其他OSes不同的调用约定?

并且用户空间也有自己的ABI:

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21517811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档