syscall

SYSCALL(2)      Ð ÑководÑÑво пÑогÑаммиÑÑа Linux      SYSCALL(2)



ÐÐЯ
       syscall - непÑÑмой ÑиÑÑемнÑй вÑзов

ÐÐÐÐÐ
       #define _GNU_SOURCE         /* Ñм. feature_test_macros(7) */
       #include <unistd.h>
       #include <sys/syscall.h>   /* Ð´Ð»Ñ Ð¾Ð¿Ñеделений SYS_xxx */

       long syscall(long number, ...);

ÐÐÐСÐÐÐÐ
       syscall() â ÑÑо маленÑÐºÐ°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑеÑÐ½Ð°Ñ ÑÑнкÑиÑ,
       коÑоÑÐ°Ñ Ð´ÐµÐ»Ð°ÐµÑ ÑиÑÑемнÑй вÑзов, Ñей инÑеÑÑейÑ
       аÑÑемблеÑного ÑзÑка  ÑказÑваеÑÑÑ Ð² number, Ñ
       дополниÑелÑнÑми аÑгÑменÑами. ÐÑполнение
       syscall() нÑжно, напÑимеÑ, Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка
       ÑиÑÑемного вÑзова, Ñ ÐºÐ¾ÑоÑого Ð½ÐµÑ Ð¾Ð±ÑÑÑоÑной
       ÑÑнкÑии в библиоÑеке C.

       ÐÑи вÑзове syscall() ÑоÑÑанÑÐµÑ ÑегиÑÑÑÑ Ð¦Ð Ð´Ð¾
       вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑиÑÑемного вÑзова,
       воÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑегиÑÑÑÑ Ð¿Ñи возвÑаÑе из
       ÑиÑÑемного вÑзова и еÑли возникла оÑибка,
       Ñо ÑоÑÑанÑÐµÑ Ð»Ñбой код, полÑÑеннÑй оÑ
       ÑиÑÑемного вÑзова, в errno(3).

       СимволÑнÑе конÑÑанÑÑ Ð´Ð»Ñ ÑиÑÑемнÑÑ Ð²Ñзовов
       можно найÑи в заголовоÑном Ñайле
       <sys/syscall.h>.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐозвÑаÑаемое знаÑение опÑеделÑеÑÑÑ
       вÑзÑваемÑм ÑиÑÑемнÑм вÑзовом. ÐÑи ÑÑпеÑном
       вÑполнении обÑÑно возвÑаÑаеÑÑÑ 0. ÐÑи оÑибке
       возвÑаÑаеÑÑÑ -1, пÑи ÑÑом код оÑибки ÑоÑÑанÑеÑÑÑ
       в errno.

ÐÐÐÐЧÐÐÐЯ
       ÐÑзов syscall() впеÑвÑе поÑвилÑÑ Ð² 4BSD.

   ТÑебованиÑ, завиÑÑÑие Ð¾Ñ Ð°ÑÑиÑекÑÑÑÑ
       ÐаждÑй ABI аÑÑиÑекÑÑÑÑ Ð¸Ð¼ÐµÐµÑ Ñвои ÑобÑÑвеннÑе
       ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ пеÑедаÑе аÑгÑменÑов
       ÑиÑÑемного вÑзова в ÑдÑо. ÐÐ»Ñ ÑиÑÑемнÑÑ
       вÑзовов, имеÑÑÐ¸Ñ Ð¾Ð±ÑÑÑÐºÑ Ð² glibc (болÑÑинÑÑво
       ÑиÑÑемнÑÑ Ð²Ñзовов), копиÑование аÑгÑменÑов
       в пÑавилÑнÑе ÑегиÑÑÑÑ Ñ ÑÑÑÑом аÑÑиÑекÑÑÑÑ
       вÑполнÑеÑÑÑ Ð² Ñамой glibc. Ðднако пÑи
       вÑполнении ÑиÑÑемного вÑзова ÑеÑез syscall(),
       вÑзÑваÑÑий Ñам должен ÑÑиÑÑваÑÑ Ð¾ÑобенноÑÑи
       аÑÑиÑекÑÑÑÑ; ÑаÑе вÑего ÑÑо оÑноÑиÑÑÑ Ðº 32-биÑнÑм
       аÑÑиÑекÑÑÑам.

       ÐапÑимеÑ, на аÑÑиÑекÑÑÑе ARM Embedded ABI (EABI)
       64-биÑное знаÑение (long long) должно бÑÑÑ
       вÑÑовнено по ÑÑÑной паÑе ÑегиÑÑÑов. То еÑÑÑ,
       пÑи иÑполÑзовании syscall() вмеÑÑо обÑÑÑоÑной
       ÑÑнкÑии glibc ÑиÑÑемнÑй вÑзов readahead() на ARM
       вÑзÑвалÑÑ Ð±Ñ Ñ ÑÑÑÑом EABI ÑледÑÑÑим обÑазом:

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

       Так как ÑмеÑение аÑгÑменÑа 64 биÑа, и пеÑвÑй
       аÑгÑÐ¼ÐµÐ½Ñ (fd) пеÑедаÑÑÑÑ Ð² ÑегиÑÑÑе r0, вÑзÑваÑÑий
       должен ÑазделиÑÑ Ð¸ вÑÑовнÑÑÑ 64-биÑное
       знаÑение Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¾ пеÑедавалоÑÑ Ð² паÑе
       ÑегиÑÑÑов r2/r3. ÐÑо вÑполнÑеÑÑÑ Ð²ÑÑавкой пÑÑÑого
       знаÑÐµÐ½Ð¸Ñ Ð² r1 (вÑоÑого аÑгÑÐ¼ÐµÐ½Ñ 0).

       ÐодобнÑе ÑложноÑÑи можно видеÑÑ Ð½Ð° MIPS Ñ O32
       ABI, на PowerPC Ñ 32-биÑнÑм ABI и на Xtensa.

       ÐÑо оÑноÑиÑÑÑ Ðº ÑиÑÑемнÑм вÑзовам fadvise64_64(2),
       ftruncate64(2), posix_fadvise(2), pread64(2), pwrite64(2),
       readahead(2), sync_file_range(2) и truncate64(2).

   ÐÑÑиÑекÑÑÑнÑе ÑоглаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ вÑзовам
       Ркаждой аÑÑиÑекÑÑÑе еÑÑÑ ÑобÑÑвеннÑй ÑпоÑоб
       пеÑедаÑи аÑгÑменÑов вÑÐ·Ð¾Ð²Ñ ÑдÑа. ÐÑобенноÑÑи
       ÑазлиÑнÑÑ Ð°ÑÑиÑекÑÑÑ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² двÑÑ
       ÑаблиÑÐ°Ñ Ð½Ð¸Ð¶Ðµ.

       ÐÐ¾Ð»Ñ Ð¿ÐµÑвой ÑаблиÑÑ: инÑÑÑÑкÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÐµÑеÑода в
       Ñежим ÑдÑа (Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ бÑÑÑÑÑм или лÑÑÑим
       ÑпоÑобом пеÑеÑода в ÑдÑо, лÑÑÑе иÑполÑзоваÑÑ
       vdso(7)), ÑегиÑÑÑ Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ð¾Ð¼ÐµÑа ÑиÑÑемного
       вÑзова, ÑегиÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑа ÑезÑлÑÑаÑа ÑабоÑÑ
       ÑиÑÑемного вÑзова и ÑегиÑÑÑ ÑигнализаÑии
       оÑибки.

       аÑÑ/ABI    инÑÑÑÑкÑÐ¸Ñ        â syscall  возв.знаÑ.  оÑибка  замеÑаниÑ
       _
       alpha       callsys               v0         a0                 a3           [1]
       arc         trap0                 r8         r0                 -
       arm/OABI    swi NR                -          a1                 -            [2]
       arm/EABI    swi 0x0               r7         r0                 -
       arm64       svc #0                x8         x0                 -
       blackfin    excpt 0x0             P0         R0                 -
       i386        int $0x80             eax        eax                -
       ia64        break 0x100000        r15        r8                 r10          [1]
       m68k        trap #0               d0         d0                 -
       microblaze  brki r14,8            r12        r3                 -
       mips        syscall               v0         v0                 a3           [1]
       nios2       trap                  r2         r2                 r7
       parisc      ble 0x100(%sr2, %r0)  r20        r28                -
       powerpc     sc                    r0         r3                 r0           [1]
       s390        svc 0                 r1         r2                 -            [3]
       s390x       svc 0                 r1         r2                 -            [3]
       superh      trap #0x17            r3         r0                 -            [4]
       sparc/32    t 0x10                g1         o0                 psr/csr      [1]
       sparc/64    t 0x6d                g1         o0                 psr/csr      [1]
       tile        swint1                R10        R00                R01          [1]
       x86_64      syscall               rax        rax                -            [5]
       x32         syscall               rax        rax                -            [5]
       xtensa      syscall               a2         a2                 -

       ÐамеÑаниÑ:

           [1] Ðа некоÑоÑÑÑ Ð°ÑÑиÑекÑÑÑÐ°Ñ Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°
               оÑказа ÑиÑÑемного вÑзова иÑполÑзÑеÑÑÑ
               ÑегиÑÑÑ Ñ Ð¿ÑоÑÑÑм логиÑеÑким знаÑением (0
               â Ð½ÐµÑ Ð¾Ñибки, -1 â оÑибка). ÐаÑÑоÑÑее
               знаÑение оÑибки вÑÑ Ñавно ÑодеÑжиÑÑÑ Ð²
               ÑегиÑÑÑе возвÑаÑа. Ðа sparc, вмеÑÑо
               полного ÑегиÑÑÑа иÑполÑзÑеÑÑÑ Ð±Ð¸Ñ
               пеÑеноÑа (csr) в ÑегиÑÑÑе ÑоÑÑоÑниÑ
               пÑоÑеÑÑоÑа (psr).

           [2] NR â Ð½Ð¾Ð¼ÐµÑ ÑиÑÑемного вÑзова.

           [3] ÐÐ»Ñ s390 и s390x NR (Ð½Ð¾Ð¼ÐµÑ ÑиÑÑемного вÑзова)
               Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑÑÑ Ð½Ð°Ð¿ÑÑмÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
               svc NR, еÑли он менÑÑе 256.

           [4] Ðа SuperH, Ð½Ð¾Ð¼ÐµÑ Ð»Ð¾Ð²ÑÑки (trap number)
               конÑÑолиÑÑÐµÑ Ð¼Ð°ÐºÑималÑное колиÑеÑÑво
               пеÑедаваемÑÑ Ð°ÑгÑменÑов.trap #0x10 можно
               иÑполÑзоваÑÑ ÑолÑко Ñ ÑиÑÑемнÑми
               вÑзовами без аÑгÑменÑов, trap #0x11 можно
               иÑполÑзоваÑÑ ÑолÑко Ñ ÑиÑÑемнÑми
               вÑзовами без или Ñ Ð¾Ð´Ð½Ð¸Ð¼ аÑгÑменÑом и
               Ñак далее до trap #0x17 (7 аÑгÑменÑов в
               ÑиÑÑемном вÑзове).

           [5] РпÑогÑаммном инÑеÑÑейÑе x32 иÑполÑзÑÑÑÑÑ
               Ñе же инÑÑÑÑкÑии ÑÑо и в x86_64 и иÑполÑзÑÑÑÑÑ
               на ÑÐµÑ Ð¶Ðµ пÑоÑеÑÑоÑаÑ. РазниÑа в Ñом, ÑÑо
               Ð´Ð»Ñ ÑиÑÑемнÑÑ Ð²Ñзовов в пÑогÑаммном
               инÑеÑÑейÑе x32 биÑÐ¾Ð²Ð°Ñ Ð¼Ð°Ñка __X32_SYSCALL_BIT
               побиÑово ÑкладÑваеÑÑÑ Ñ Ð½Ð¾Ð¼ÐµÑом
               ÑиÑÑемного вÑзова. ÐÑи ÑÑом доÑÑÑÐ¿Ð½Ñ Ð¾Ð±Ðµ
               ÑаблиÑÑ ÑиÑÑемнÑÑ Ð²Ñзовов и ÑÑÑановка
               биÑа не ÑвлÑеÑÑÑ Ð±Ð¾Ð»ÑÑим ÑÑебованием.


       Ðо вÑоÑой ÑаблиÑе Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑегиÑÑÑÑ, коÑоÑÑе
       иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑедаÑи аÑгÑменÑов в
       ÑиÑÑемнÑй вÑзов.

       аÑÑ/ABI      arg1  arg2  arg3  arg4  arg5  arg6  arg7  замеÑаниÑ
       _
       alpha         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    -
       blackfin      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    -
       microblaze    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   -
       powerpc       r3    r4    r5    r6    r7    r8    r9
       s390          r2    r3    r4    r5    r6    r7    -
       s390x         r2    r3    r4    r5    r6    r7    -
       superh        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    -

       ÐамеÑаниÑ:

           [1] Ðо ÑоглаÑÐµÐ½Ð¸Ñ Ð² mips/o32 аÑгÑменÑÑ ÑиÑÑемнÑÑ
               вÑзовов Ñ 5 по 8 пеÑедаÑÑÑÑ ÑеÑез
               полÑзоваÑелÑÑкий ÑÑек.


       ÐамеÑим, ÑÑо ÑÑи ÑаблиÑÑ Ð½Ðµ опиÑÑваÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ
       ÑоглаÑение о вÑзове â некоÑоÑÑе аÑÑиÑекÑÑÑÑ
       могÑÑ Ð·Ð°ÑиÑаÑÑ Ð´ÑÑгие ÑегиÑÑÑÑ Ð¸ ÑÑо здеÑÑ Ð½Ðµ
       опиÑано.

ÐÐ ÐÐÐÐ
       #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);
           tid = syscall(SYS_tgkill, getpid(), tid, SIGHUP);
       }

СÐÐТРÐТРТÐÐÐÐ
       _syscall(2), intro(2), syscalls(2), errno(3), vdso(7)



Linux                             2016-03-15                        SYSCALL(2)