syscall(2) System Calls Manual syscall(2) NAVN syscall - indirekte systemkald BIBLIOTEK C-standardbibliotek (libc, -lc) SYNOPSIS #include /* Definition af SYS_* konstanter */ #include long syscall(long nummer, ...); Feature Test Macro Requirements for glibc (se feature_test_macros(7)): syscall(): Siden glibc 2.19: _DEFAULT_SOURCE For glibc 2.19: _BSD_SOURCE || _SVID_SOURCE BESKRIVELSE syscall() er en lille biblioteksfunktion, der igangsaetter systemkaldet hvis assembly-sproggraenseflade har det angivne nummer med de angivne argumenter. Anvendelse af syscall() er nyttig, for eksempel, nar et systemkald igangsaettes uden en omslagsfunktion i C-biblioteket. syscall() gemmer cpu-registre for der laves systemkald, gendanner registrerne ved returnering fra systemkaldet og lagrer eventuelle fejl returneret af systemkaldet i errno(3). Symbolske konstanter for systemkaldnumre kan findes i teksthovedfilen . RETURVAERDI Returvaerdien er defineret af systemkaldet der igangsaettes. Generelt indikerer en 0 returvaerdi succes. En returvaerdi pa -1 indikerer en fejl og et fejlnummer lagres i errno. FEJL ENOSYS Det anmodet systemkaldnummer er ikke implementeret. Andre fejl er specifikke for det igangsatte systemkald. HISTORIK syscall() kom forst i 4BSD. NOTER Arkitekturspecifikke krav Hver arkitektur-ABI har sine egne krav til hvordan systemkaldargumenter sendes til kernen. For systemkald der har et glibc-omslag (f.eks. de fleste systemkald), sa handterer glibc detaljerne ved at kopiere argumenter til de korrekte registre pa en made egnet for arkitekturen. Nar syscall() bruges til at lave et systemkald, sa skal kalderen maske handtere detaljer, der afhaenger af arkitekturen; dette krav ses oftest pa bestemte 32-bit arkitekturer. For eksempel pa den ARM architecture Embedded ABI (EABI) skal en 64-bit vaerdi (f.eks. long long) vaere justeret til et lige registerpar. Brug af syscall() i stedet for omslaget tilbudt af glibc, vil gore at systemkaldet readahead(2) bliver igangsat som vist efterfolgende pa ARM-arkitekturen med EABI i little endian-tilstand: syscall(SYS_readahead, fd, 0, (unsigned int) (offset & 0xFFFFFFFF), (unsigned int) (offset >> 32), count); Da forskydningsargumentet er 64 bit og det forste argument (fd) sendes i r0, skal kalderen manuelt opdele og justere 64-bit vaerdien, sa den sendes i registerparret r2/r3. Det betyder indsaettelse af en erstatningsvaerdi i r1 (det andet argument for 0). Der skal tages speciel hensyn til at opdelingen folger endian-konventionerne (jaevnfor C ABI'en for platformen). Lignende problemstillinger kan opsta pa MIPS med 032 ABI'en, pa PowerPC og parisc med 32-bit ABI*en og pa Xtensa. Bemaerk at mens parisc C-ABI'en ogsa bruger justerede registerpar, sa bruges et shim-lag til at skjule problemstillingen fra brugerummet. De pavirkede systemkald er fadvise64_64(2), ftruncate64(2), posix_fadvise(2), pread64(2), pwrite64(2), readahead(2), sync_file_range(2) og truncate64(2). Dette pavirker ikke systemkald, der manuelt opdeler og samler 64-bit vaerdier sasom _llseek(2), preadv(2), preadv2(2), pwritev(2) og pwritev2(2). Velkommen til den vidunderlige verden med historisk bagage. Arkitekturkaldende konventioner Hver arkitektur har sin egen made at igangsaette og sende argumenter til kernen. Detaljerne for de forskellige arkitekturer er vistn i de to tabeller nedenfor. Den forste tabel viser instruktionen brugt til overgangen til kernetilstand (som maske ikke er den hurtigste eller bedste made at lave overgang til kernen, sa du skal maske referere til vdso(7)), registret brugt til at indikere systemkaldnummeret, registrene brugt til at returnere systemkaldresultatet, og registret brugt til at signalere en fejl. Arch/ABI Instruktion System Ret Ret Fejl Noter kald # val val2 ------------------------------------------------------------------- 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 nios2 trap r2 r2 - r7 parisc 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 eax rax rdx - 5 x32 syscall eax rax rdx - 5 xtensa syscall a2 a2 - - Noter: [1] Pa nogle fa arkitekturer bruges et register som en boolesk fejl (0 indikerer fejl og -1 indikerer en fejl) til at signalere at systemkaldet fejlede. Den faktiske fejlvaerdi er stadig indeholdet i returregistret. Pa sparc bruges den baerende del (csr) i processorstatusregistret (psr) i stedet for et fuldt register. Pa powerpc64 bruges den summerende overflydende del (SO) i felt 0 for betingelsesregistret (cr0). [2] NR er systemkaldets nummer. [3] For s390 og s390x kan NR (systemkaldnummeret) sendes direkte med svc NR hvis det er mindre end 256. [4] Pa SuperH er yderligere trap-numre understottet af historiske arsager, men trapa#31 er den anbefalede >>forenet<< ABI. [5] x32-ABI'en deler systemkaldtabel med x86-64-ABI'en, men der er nogle nuancer: o For at indikere at et systemkald kaldes under x32-ABI'en bliver en yderligere del, __X32_SYSCALL_BIT, stykvis ORed med systemkaldnummeret. ABI'en brugt af en proces der pavirker nogle procesopforelser, inklusive signalhandtering eller genstart af systemkald. o Da x32 for forskellige storrelser for long og pegertyper, er layout for nogle (men ikke alle; struct timeval eller struct rlimit er f.eks. 64-bit) strukturer forskellige. For at kunne handtere dette tilfojes yderligere systemkald til systemkaldtabellen, startende fra nummer 512 (uden __X32_SYSCALL_BIT). For eksempel er __NR_readv defineret som 19 for x86-64-ABI og som __X32_SYSCALL_BIT | 515 for x32-ABI'en. De fleste af disse yderligere systemkald er faktisk identiske med systemkaldene brugt til at tilbyde i386 compat. Der er dog nogle bemaerkelsesvaerdige undtagelser sasom preadv2(2), der bruger struct iovec-entiteter med 4-byte pegere og storrelser (>>compat_iovec<< i kernetermer), men sender et 8-byte pos-argument i et enkelt register og ikke to, som det gores i enhver anden ABI. [6] Nogle arkitekturer (navnlig, Alpha, IA-64, MIPS, SuperH, sparc/32 og sparc/64) bruger et yderligere register (>>Retval2<< i den ovenstaende tabel) til at sende en anden returvaerdi fra systemkaldet pipe(2); Alpha bruger ogsa denne teknik i de for arkitekturen specifikke systemkald getxpid(2), getxuid(2) og getxgid(2). Andre arkitekturer bruger ikke det andet returvaerdiregistrer i systemkaldgraensefladen, selv om den er defineret i System V ABI'en. Den anden tabel viser registrene brugt til at sende systemkaldargumenterne. Arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7 Noter -------------------------------------------------------------- alpha a0 a1 a2 a3 a4 a5 - arc r0 r1 r2 r3 r4 r5 - arm/OABI r0 r1 r2 r3 r4 r5 r7 arm/EABI r0 r1 r2 r3 r4 r5 r7 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 r7 r7 r8 r9 r10 - mips/o32 a0 a1 a2 a3 - - - 1 mips/n32,64 a0 a1 a2 a3 a4 a5 - nios2 r4 r5 r7 r7 r8 r9 - parisc r26 r25 r24 r23 r22 r21 - powerpc r3 r4 r5 r7 r7 r8 r9 powerpc64 r3 r4 r5 r7 r7 r8 - riscv a0 a1 a2 a3 a4 a5 - s390 r2 r3 r4 r5 r7 r7 - s390x r2 r3 r4 r5 r7 r7 - superh r4 r5 r7 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 - Noter: [1] Mips/o32-systemkaldkonventionen sender argumenterne 5 til 8 pa brugerstakken. Bemaerk at disse tabeller ikke daekker hele den kaldende konvention--nogle arkitekturer kan vilkarligt ogsa ramme andre registre hardt, der ikke er anfort her. EKSEMPLER #define _GNU_SOURCE #include #include #include #include int main(void) { pid_t tid; tid = syscall(SYS_gettid); syscall(SYS_tgkill, getpid(), tid, SIGHUP); } SE OGSA _syscall(2), intro(2), syscalls(2), errno(3), vdso(7) OVERSAETTELSE Oversaettere af denne manual til dansk Joe Hansen Denne oversaettelse er gratis dokumentation; laes GNU General Public License version 3 eller nyere for ophavsretbetingelser. Der er INGEN ANSVAR. Hvis du stoder pa fejl i oversaettelsen af denne vejledning, skal du sende en besked til . Linux man-pages 6.18 2. februar 2026 syscall(2)