是否可以编写一个(linux内核)系统调用函数,该函数有6个以上的输入参数?查看标题,我看到定义的syscall宏最多有6个参数。我很想尝试定义SYSCALL7和SYSCALL8,以允许7和8个参数,但我不太确定这是否真的有效。
发布于 2014-02-03 00:41:36
对于x86,以下函数(来自X86.)将参数复制到:
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, ®s->bx + i, n * sizeof(args[0]));
}这个函数在通用/系统。h中的注释中有很好的描述。它将参数复制到syscall中,并且有6个参数的限制。它可以通过多种方式实现,这取决于体系结构。对于x86 (来自上面的片段),似乎所有的参数都是通过寄存器传递的。
因此,如果要传递6个以上的参数,请使用结构。如果您必须拥有一个SYSCALL7,那么您将不得不创建一个自定义内核,并可能修改syscall进程的几乎每一步。x86_64可能更容易适应这种更改,因为它比x86拥有更多的寄存器。
发布于 2014-02-03 12:08:22
如果有一天你需要20个参数呢?我认为解决syscall问题的最好方法是使用指向*void的指针。
通过这种方式,您可以传递包含无限参数的struct。
发布于 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/
https://stackoverflow.com/questions/21517811
复制相似问题