Provided by: manpages-de-dev_4.21.0-2_all bug

BEZEICHNUNG

       syscall - indirekter Systemaufruf

BIBLIOTHEK

       Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT

       #include <sys/syscall.h>      /* Definition der SYS_*-Konstanten */
       #include <unistd.h>

       long syscall(long Nummer, …);

   Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)):

       syscall():
           Seit Glibc 2.19:
               _DEFAULT_SOURCE
           Vor Glibc 2.19:
               _BSD_SOURCE || _SVID_SOURCE

BESCHREIBUNG

       syscall()    ist    eine    kleine    Bibliotheksfunktion,   die   den   Systemaufruf   auslöst,   dessen
       Assemblersprachen-Schnittstelle in Nummer mit den festgelegten Argumenten angegeben  wurde.  Der  Einsatz
       von  syscall()  ist  beispielsweise  hilfreich,  wenn  ein Systemaufruf ausgelöst werden soll, der in der
       C-Bibliothek keine Wrapper-Funktion hat.

       syscall() speichert CPU-Register vor der Durchführung des Systemaufrufs, stellt  die  Register  nach  der
       Rückkehr  von dem Systemaufruf wieder her und speichert alle vom Systemaufruf zurückgelieferten Fehler in
       errno(3).

       Die symbolischen Konstanten für  die  Systemaufrufnummern  können  in  der  Header-Datei  <sys/syscall.h>
       gefunden werden.

RÜCKGABEWERT

       Der Rückgabewert wird durch den ausgelösten Systemaufruf definiert. Im Allgemeinen zeigt ein Rückgabewert
       0 einen Erfolg an.  Ein  Rückgabewert  -1  zeigt  einen  Fehler  und  eine  Fehlernummer  wird  in  errno
       gespeichert.

ANMERKUNGEN

       syscall() erschien erstmalig in 4BSD.

   Architekturspezifische Anforderungen
       Jede  Architektur-ABI  hat  ihre  eigenen  Anforderungen,  wie  Argumente für Systemaufrufe an den Kernel
       übergeben werden. Für Systemaufrufe mit Glibc-Wrapper (beispielsweise die meisten Systemaufrufe) handhabt
       Glibc  die  Details  des  Kopierens  der  Argumente in die richtigen Register auf eine Weise, die für die
       Architektur angemessen ist. Wird allerdings  syscall()  zum  Durchführen  eines  Systemaufrufs  verwandt,
       könnte  der  Aufrufende die architekturabhängigen Details selber handhaben müssen. Diese Anforderung wird
       auf bestimmten 32-bit-Architekturen am häufigsten angetroffen.

       Auf dem ABI der eingebetteten ARM-Architektur (EABI) muss beispielsweise ein 64-bit-Wert (z.B. long long)
       an   ein  gerades  Registerpaar  ausgerichtet  werden.  Wird  daher  syscall()  anstelle  des  von  Glibc
       bereitgestellten Wrappers verwandt, müsste der Systemaufruf readahead(2) in der folgenden Weise  auf  der
       ARM-Architektur mit dem ABI im Modus »little endian« ausgelöst werden:

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

       Da  das  Argument  »offset«  64  bit  beträgt  und das erste Argument (fd) an r0 übergeben wird, muss der
       aufrufende den 64-bit-Wert manuell zerteilen und ausrichten,  so  dass  er  an  das  Register-Paar  r2/r3
       übergeben  wird.  Das  bedeutet,  dass  ein Blindwert in r1 (dem zweiten Argument von 0) eingefügt werden
       muss. Es muss auch darauf geachtet werden, dass die Zerteilung den Endian-Konventionen folgt  (gemäß  der
       C-ABI dieser Plattform).

       Ähnliche  Probleme  können  auf  MIPS  mit dem O32-ABI, auf PowerPC und Parisc mit dem 32-bit-ABI und auf
       Xtensa auftreten.

       Beachten  Sie,  dass  das  Parisc-C-ABI  zwar  auch  ausgerichtete  Registerpaare  verwendet,  aber  eine
       Ausgleichs-Schicht verwendet, um das Problem vor dem Anwendungsraum zu verstecken.

       Die   betroffenen  Systemaufrufe  sind  fadvise64_64(2),  ftruncate64(2),  posix_fadvise(2),  pread64(2),
       pwrite64(2), readahead(2), sync_file_range(2) und truncate64(2).

       Dies  betrifft  Systemaufrufe,  die  manuell  64-bit-Werte  auseinandernehmen  und  zusammensetzen,   wie
       _llseek(2),  preadv(2), preadv2(2), pwritev(2) und pwritev2(2), nicht. Willkomen in der wundervollen Welt
       der historischen Altlasten.

   Architekturabhängige Aufrufkonventionen
       Jede Architektur hat ihre eigene Art, den Kernel aufzurufen und Argumente zu übergeben. Die  Details  für
       die verschiedenen Architekturen sind in zwei nachfolgenden Tabellen dargestellt.

       Die  erste  Tabelle  führt die Anweisungen auf, die zum Übergang in den Kernelmodus verwandt werden (dies
       könnte nicht die schnellste oder beste Art zum Übergang in den Kernel sein, bitte  schauen  Sie  auch  in
       vdso(7)),  das  Register,  das zur Angabe der Systemaufrufnummer, das oder die Register, die zur Rückgabe
       des Ergebnisses des Systemaufrufs und das Register, das zur Signalisierung eines Fehlers verwandt wird.

       Arch/ABI    Anweisung             System    Rück  Rück  Fehler   Hinweise
                                         Aufruf #  Wert  Wert2
       ──────────────────────────────────────────────────────────────────────────
       alpha       callsys               v0        v0    a4    a3       1, 6
       Arc         trap0                 r8        r0    -     -
       Arm/OABI    swi NR                -         r0    -     -        2
       Arm/EABI    swi 0x0               r7        r0    r1    -
       Arm64       svc #0                w8        x0    x1    -
       Blackfin    excpt 0x0             P0        R0    -     -
       I386        int $0x80             eax       eax   edx   -
       Ia64        break 0x100000        r15       r8    r9    r10      1, 6
       Loongarch   syscall 0             a7        a0    -     -
       M68k        trap #0               d0        d0    -     -
       Microblaze  brki r14,8            r12       r3    -     -
       Mips        syscall               v0        v0    v1    a3       1, 6
       Nios II     trap                  r2        r2    -     r7
       PA-RISC     ble 0x100(%sr2, %r0)  r20       r28   -     -
       PowerPC     sc                    r0        r3    -     r0       1
       PowerPC64   sc                    r0        r3    -     cr0.SO   1
       riscv       ecall                 a7        a0    a1    -
       S390        svc 0                 r1        r2    r3    -        3
       S390x       svc 0                 r1        r2    r3    -        3
       SuperH      trapa #31             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    -     -

       Hinweise:

       •  Auf einigen Architekturen wird ein Register als logischer Wert verwandt (0 zeigt an, dass kein  Fehler
          vorliegt  und  -1 zeigt Fehler an), um mitzuteilen, dass der Systemaufruf fehlschlug. Der tatsächliche
          Fehlerwert ist weiterhin in dem Rückliefer-Register enthalten. Auf Sparc wird  das  Zweierübergangsbit
          (csr)  im Prozessorstatusregister (psr) anstelle eines vollständigen Registers verwandt. Auf PowerPC64
          wird das zusammenfassende Überlaufbit (SO) im Feld 0 des Bedingungsregisters (cr0) verwandt.

       •  NR ist die Nummer des Systemaufrufs.

       •  Für S390 und S390x kann NR (die Nummer des Systemaufrufs) direkt mit svc NR  übergeben  werden,  falls
          sie kleiner als 256 ist.

       •  Auf  SuperH  werden aus historischen Gründen zusätzliche Nummern für Ausnahmebehandlungen unterstützt,
          aber trapa#31 ist die empfohlene »vereinigte« ABI.

       •  Das x32-ABI nutzt die Systemaufruf-Tabelle der x86-64-ABI mit, es gibt aber kleine Nuancen:

          •  Um anzuzeigen, dass  ein  Systemaufruf  unter  der  x32-ABI  erfolgt,  wird  ein  zusätzliches  Bit
             (__X32_SYSCALL_BIT)  durch  ein  bitweises ODER mit der Systemaufrufnummer verknüpft. Das von einem
             Prozess verwandte ABI betrifft einige Prozessverhalten, einschließlich der Signalverarbeitung  oder
             dem Neustarten von Systemaufrufen.

          •  Da  x32  andere  Größen für long und Zeigertypen hat, ist das Layout einiger Strukturen (aber nicht
             aller: struct timeval oder struct rlimit sind beispielsweise 64 bit) anders.  Um  damit  umzugehen,
             werden  zusätzliche  Systemaufrufe zu der Systemaufruftabelle hinzugefügt, beginnend bei Nummer 512
             (ohne das __X32_SYSCALL_BIT). Beispielsweise ist __NR_readv als  19  für  das  x86-64-ABI  und  als
             __X32_SYSCALL_BIT  |  515  für das x32-ABI definiert. Die meisten dieser zusätzlichen Systemaufrufe
             sind tatsächlich zu den Systemaufrufen, die zur  Bereitstellung  der  i386-Kompatibilität  verwandt
             werden,  identisch.  Es  gibt  allerdings  ein  paar  bemerkenswerte Ausnahmen, wie preadv2(2), das
             Einheiten struct  iovec  mit  4-byte-Zeigern  und  Größen  (»compat_iovec«  in  der  Kernelsprache)
             verwendet, aber ein 8-byte Argument pos in einem einzelnen Register (und nicht in zweien) übergibt,
             wie dies in jedem anderen ABI erfolgt.

       •  Einige Architekturen (konkret Alpha, IA-64, MIPS, SuperH, Sparc/32 und Sparc/64) verwenden ein zweites
          Register  (»Rückwert2«  in  der  obigen  Tabelle),  um einen zweiten Rückgabewert von dem Systemaufruf
          pipe(2)  zurückzugeben.  Alpha  verwendet  diese   Technik   auch   in   den   architekturspezifischen
          Systemaufrufen  getxpid(2),  getxuid(2)  und  getxgid(2).  Andere  Architekturen  verwenden das zweite
          Rückgaberegister in der Systemaufrufschnittstelle nicht, selbst wenn es in der System-V-ABI  definiert
          ist.

       Die zweite Tabelle zeigt die Register, die zur Übergabe der Systemaufrufargumente verwandt werden.

       Arch/ABI      Arg1  Arg2  Arg3  Arg4  Arg5  Arg6  Arg7  Hinweise
       ─────────────────────────────────────────────────────────────────
       alpha         a0    a1    a2    a3    a4    a5    -
       Arc           r0    r1    r2    r3    r4    r5    -
       Arm/OABI      r0    r1    r2    r3    r4    r5    r6
       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  -
       Loongarch     a0    a1    a2    a3    a4    a5    a6
       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    -
       Nios II       r4    r5    r6    r7    r8    r9    -
       PA-RISC       r26   r25   r24   r23   r22   r21   -
       PowerPC       r3    r4    r5    r6    r7    r8    r9
       PowerPC64     r3    r4    r5    r6    r7    r8    -
       riscv         a0    a1    a2    a3    a4    a5    -
       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    -

       Hinweise:

       •  Die Systemaufrufkonvention von MIPS/o32 übergibt die Argumente 5 bis 8 über den Benutzer-Stack.

       Beachten  Sie,  dass  diese  Tabellen  nicht  die  gesamte Aufrufkonvention abdecken–einige Architekturen
       könnten rücksichtslos andere, hier nicht aufgeführte Register belegen.

BEISPIELE

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

       int
       main(void)
       {
           pid_t tid;

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

SIEHE AUCH

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

ÜBERSETZUNG

       Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.

       Diese Übersetzung  ist  Freie  Dokumentation;  lesen  Sie  die  GNU  General  Public  License  Version  3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE
       HAFTUNG übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte  eine  E-Mail  an  die
       Mailingliste der Übersetzer ⟨debian-l10n-german@lists.debian.org⟩.