syscall(2) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

syscall(2)

SYSCALL(2)                 Linux Programmer's Manual                SYSCALL(2)

NAME
       syscall - indirect system call

SYNOPSIS
       #define _GNU_SOURCE         /* See feature_test_macros(7) */
       #include <unistd.h>
       #include <sys/syscall.h>   /* For SYS_xxx definitions */

       long syscall(long number, ...);

DESCRIPTION
       syscall()  is  a  small  library  function that invokes the system call
       whose assembly language interface has the  specified  number  with  the
       specified  arguments.  Employing syscall() is useful, for example, when
       invoking a system call that has no wrapper function in the C library.

       syscall() saves CPU registers before making the system  call,  restores
       the  registers  upon  return from the system call, and stores any error
       code returned by the system call in errno(3) if an error occurs.

       Symbolic constants for system call numbers can be found in  the  header
       file <sys/syscall.h>.

RETURN VALUE
       The  return value is defined by the system call being invoked.  In gen‐
       eral, a 0 return value indicates success.  A -1 return value  indicates
       an error, and an error code is stored in errno.

NOTES
       syscall() first appeared in 4BSD.

   Architecture-specific requirements
       Each architecture ABI has its own requirements on how system call argu‐
       ments  are  passed  to  the kernel.  For system calls that have a glibc
       wrapper (e.g., most system calls), glibc handles the details of copying
       arguments to the right registers in a manner suitable for the architec‐
       ture.  However, when using syscall() to make a system call, the  caller
       might  need  to handle architecture-dependent details; this requirement
       is most commonly encountered on certain 32-bit architectures.

       For example, on the ARM architecture  Embedded  ABI  (EABI),  a  64-bit
       value  (e.g.,  long  long)  must  be  aligned to an even register pair.
       Thus, using syscall() instead of the wrapper  provided  by  glibc,  the
       readahead()  system  call would be invoked as follows on the ARM archi‐
       tecture with the EABI in little endian mode:

           syscall(SYS_readahead, fd, 0,
                   (unsigned int) (offset & 0xFFFFFFFF),
                   (unsigned int) (offset >> 32),
                   count);

       Since the offset argument is 64 bits, and the first  argument  (fd)  is
       passed in r0, the caller must manually split and align the 64-bit value
       so  that it is passed in the r2/r3 register pair.  That means inserting
       a dummy value into r1 (the second argument of 0).  Care  also  must  be
       taken  so that the split follows endian conventions (according to the C
       ABI for the platform).

       Similar issues can occur on MIPS with  the  O32  ABI,  on  PowerPC  and
       parisc with the 32-bit ABI, and on Xtensa.

       Note  that  while the parisc C ABI also uses aligned register pairs, it
       uses a shim layer to hide the issue from user space.

       The  affected  system  calls   are   fadvise64_64(2),   ftruncate64(2),
       posix_fadvise(2),      pread64(2),      pwrite64(2),      readahead(2),
       sync_file_range(2), and truncate64(2).

       This does not affect syscalls that manually split and  assemble  64-bit
       values  such  as  _llseek(2),  preadv(2),  preadv2(2),  pwritev(2), and
       pwritev2(2).  Welcome to the wonderful world of historical baggage.

   Architecture calling conventions
       Every architecture has its own way of invoking and passing arguments to
       the kernel.  The details for various architectures are  listed  in  the
       two tables below.

       The first table lists the instruction used to transition to kernel mode
       (which  might  not be the fastest or best way to transition to the ker‐
       nel, so you might have to refer to vdso(7)), the register used to indi‐
       cate the system call number, the register(s) used to return the  system
       call   result,   and   the   register   used   to   signal   an  error.
       l2   l2   l2   l2   l1   l2   l.          Arch/ABI  Instruction    Sys‐
       tem    Ret  Ret  Error     Notes            call  #    val  val2  _ al‐
       pha     callsys   v0   v0   a4   a3   1,                              6
       arc  trap0     r8   r0   -    -                           arm/OABI  swi
       NR    -    a1   -    -    2    arm/EABI  swi     0x0   r7   r0   r1   -
       arm64     svc           #0   x8   x0   x1   -           blackfin  excpt
       0x0 P0   R0   -    -   i386 int    $0x80 eax  eax  edx  -    ia64 break
       0x100000 r15  r8   r9   r10  1,  6  m68k trap #0   d0   d0   -    - mi‐
       croblaze     brki                               r14,8  r12  r3   -    -
       mips syscall   v0   v0   v1   a3   1,                                 6
       nios2     trap r2   r2   -    r7       parisc    ble        0x100(%sr2,
       %r0)     r20  r28  -    -          powerpc   sc   r0   r3   -    r0   1
       riscv     scall     a7   a0   a1   -                           s390 svc
       0     r1   r2   r3   -    3  s390x     svc  0     r1   r2   r3   -    3
       superh    trap    #0x17    r3   r0   r1   -    4,     6     sparc/32  t
       0x10    g1   o0   o1   psr/csr   1,            6            sparc/64  t
       0x6d    g1   o0   o1   psr/csr   1,                                   6
       tile swint1    R10  R00  -    R01  1
       x86-64    syscall   rax  rax  rdx  -    5
       x32  syscall   rax  rax  rdx  -    5
       xtensa    syscall   a2   a2   -    -

       Notes:

       [1] On a few architectures, a register is used as a boolean (0 indicat‐
           ing no error, and -1 indicating an error) to signal that the system
           call  failed.  The actual error value is still contained in the re‐
           turn register.  On sparc, the carry bit (csr) in the processor sta‐
           tus register (psr) is used instead of a full register.

       [2] NR is the system call number.

       [3] For s390 and s390x, NR (the system call number) may be  passed  di‐
           rectly with svc NR if it is less than 256.

       [4] On SuperH, the trap number controls the maximum number of arguments
           passed.   A  trap #0x10  can  be  used  with only 0-argument system
           calls, a trap #0x11 can be used with 0- or 1-argument system calls,
           and so on up to trap #0x17 for 7-argument system calls.

       [5] The x32 ABI shares syscall table with x86-64  ABI,  but  there  are
           some nuances:

           •  In  order to indicate that a system call is called under the x32
              ABI, an additional bit, __X32_SYSCALL_BIT, is bitwise-ORed  with
              the  system call number.  The ABI used by a process affects some
              process behaviors, including  signal  handling  or  system  call
              restarting.

           •  Since  x32  has different sizes for long and pointer types, lay‐
              outs of some (but not all; struct timeval or struct  rlimit  are
              64-bit, for example) structures are different.  In order to han‐
              dle  this,  additional system calls are added to the system call
              table, starting from number 512 (without the __X32_SYSCALL_BIT).
              For example, __NR_readv is defined as 19 for the x86-64 ABI  and
              as __X32_SYSCALL_BIT | 515 for the x32 ABI.  Most of these addi‐
              tional  system  calls are actually identical to the system calls
              used for providing i386 compat.  There are some  notable  excep‐
              tions,  however, such as preadv2(2), which uses struct iovec en‐
              tities with 4-byte pointers and sizes ("compat_iovec" in  kernel
              terms),  but  passes an 8-byte pos argument in a single register
              and not two, as is done in every other ABI.

       [6] Some architectures (namely, Alpha, IA-64, MIPS,  SuperH,  sparc/32,
           and  sparc/64)  use  an additional register ("Retval2" in the above
           table) to pass back a second return value from the  pipe(2)  system
           call;  Alpha uses this technique in the architecture-specific getx‐
           pid(2), getxuid(2), and getxgid(2) system calls as well.  Other ar‐
           chitectures do not use the second return value register in the sys‐
           tem call interface, even if it is defined in the System V ABI.

       The second table shows the registers used to pass the system call argu‐
       ments.                       l    l2   l2   l2   l2   l2   l2   l2   l.
       Arch/ABI  arg1 arg2 arg3 arg4 arg5 arg6 arg7 Notes         _        al‐
       pha     a0   a1   a2   a3   a4   a5   -
       arc  r0   r1   r2   r3   r4   r5   -
       arm/OABI  a1   a2   a3   a4   v1   v2   v3
       arm/EABI  r0   r1   r2   r3   r4   r5   r6
       arm64     x0   x1   x2   x3   x4   x5   -                        black‐
       fin  R0   R1   R2   R3   R4   R5   -
       i386 ebx  ecx  edx  esi  edi  ebp  -
       ia64 out0 out1 out2 out3 out4 out5 -
       m68k d1   d2   d3   d4   d5   a0   -                            microb‐
       laze     r5   r6   r7   r8   r9   r10  -
       mips/o32  a0   a1   a2   a3   -    -    -    1
       mips/n32,64    a0   a1   a2   a3   a4   a5   -
       nios2     r4   r5   r6   r7   r8   r9   -
       parisc    r26  r25  r24  r23  r22  r21  -                          pow‐
       erpc   r3   r4   r5   r6   r7   r8   r9
       riscv     a0   a1   a2   a3   a4   a5   -
       s390 r2   r3   r4   r5   r6   r7   -
       s390x     r2   r3   r4   r5   r6   r7   -                           su‐
       perh    r4   r5   r6   r7   r0   r1   r2
       sparc/32  o0   o1   o2   o3   o4   o5   -
       sparc/64  o0   o1   o2   o3   o4   o5   -
       tile R00  R01  R02  R03  R04  R05  -
       x86-64    rdi  rsi  rdx  r10  r8   r9   -
       x32  rdi  rsi  rdx  r10  r8   r9   -
       xtensa    a6   a3   a4   a5   a8   a9   -

       Notes:

       [1] The mips/o32 system call convention passes arguments 5 through 8 on
           the user stack.

       Note that these tables don't cover the entire  calling  convention—some
       architectures  may  indiscriminately clobber other registers not listed
       here.

EXAMPLE
       #define _GNU_SOURCE
       #include <unistd.h>
       #include <sys/syscall.h>
       #include <sys/types.h>
       #include <signal.h>

       int
       main(int argc, char *argv[])
       {
           pid_t tid;

           tid = syscall(SYS_gettid);
           syscall(SYS_tgkill, getpid(), tid, SIGHUP);
       }

SEE ALSO
       _syscall(2), intro(2), syscalls(2), errno(3), vdso(7)

COLOPHON
       This page is part of release 5.02 of the Linux  man-pages  project.   A
       description  of  the project, information about reporting bugs, and the
       latest    version    of    this    page,    can     be     found     at
       https://www.kernel.org/doc/man-pages/.

Linux                             2018-04-30                        SYSCALL(2)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3