C 系统调用:中的最大参数
在一个系统调用中可以传递多少个参数?C 系统调用:中的最大参数,c,linux,arguments,system-calls,C,Linux,Arguments,System Calls,在一个系统调用中可以传递多少个参数? 我检查了内核文件/asm/unistd.h,没有看到包含超过4个参数的系统调用。这取决于您使用的体系结构。对于i386,在系统调用号旁边最多有6个参数 从中,您将系统呼叫号码传递到的寄存器: arch/ABI instruction syscall # retval Notes ─────────────────────────────────────────────────────────────────── arm/OABI
我检查了内核文件/asm/unistd.h,没有看到包含超过4个参数的系统调用。这取决于您使用的体系结构。对于i386,在系统调用号旁边最多有6个参数 从中,您将系统呼叫号码传递到的寄存器:
arch/ABI instruction syscall # retval Notes
───────────────────────────────────────────────────────────────────
arm/OABI swi NR - a1 NR is syscall #
arm/EABI swi 0x0 r7 r0
blackfin excpt 0x0 P0 R0
i386 int $0x80 eax eax
ia64 break 0x100000 r15 r10/r8 bool error/
errno value
parisc ble 0x100(%sr2, %r0) r20 r28
s390 svc 0 r1 r2 See below
s390x svc 0 r1 r2 See below
sparc/32 t 0x10 g1 o0
sparc/64 t 0x6d g1 o0
x86_64 syscall rax rax
论点如下:
arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7
──────────────────────────────────────────────────────────
arm/OABI a1 a2 a3 a4 v1 v2 v3
arm/EABI r0 r1 r2 r3 r4 r5 r6
blackfin R0 R1 R2 R3 R4 R5 -
i386 ebx ecx edx esi edi ebp -
ia64 out0 out1 out2 out3 out4 out5 -
parisc r26 r25 r24 r23 r22 r21 -
s390 r2 r3 r4 r5 r6 r7 -
s390x r2 r3 r4 r5 r6 r7 -
sparc/32 o0 o1 o2 o3 o4 o5 -
sparc/64 o0 o1 o2 o3 o4 o5 -
x86_64 rdi rsi rdx r10 r8 r9 -
这对实际的系统调用不重要吗?有些接受更多的参数,有些接受更少的参数,有些不接受任何参数。为什么要使用超过4个参数的系统调用?@KlasLindback:你错了。内核和用户空间之间的系统调用协议(通过VDSO或
syscenter
machine指令)不是ABI调用约定。在x86上,系统调用不在堆栈上传递任何内容,只通过寄存器传递。