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