table of contents
| syscalls(2) | System Calls Manual | syscalls(2) |
NAVN¶
syscalls - Linuxsystemkald
SYNOPSIS¶
Linuxsystemkald.
BESKRIVELSE¶
Systemkaldet er en fundamental grænseflade mellem et program og Linuxkernen.
Systemkald og biblioteksomslagsfunktioner¶
Systemkald startes generelt ikke direkte, men snarere via omslagsfunktioner i glibc (eller måske et andet bibliotek). For detaljer om direkte igangsættelse af et systemkald, se intro(2). Ofte, men ikke altid, er navnet for omslagsfunktionen det samme som navnet på systemkaldet, som det igangsætter. For eksempel indeholder glibc en funktion chdir(), der igangsætter det underliggende »chdir«-systemkald.
Ofte er glibc-omslagsfunktionen ret tynd, gør ikke meget andet end at kopiere argumenter til det korrekte register før igangsættelse af systemkaldet, og så angivelse af errno på passende vis efter systemkaldet er returneret. (Det er de samme trin, der udføres af syscall(2), det kan bruges til at igangsætte systemkald, hvor der ikke tilbydes en omslagsfunktion). Bemærk: systemkald indikerer en fejl ved at returnere et negativt fejlnummer til kalderen på arkitekturer uden et separat fejlregister/flag, som noteret i syscall(2); når dette sker, negerer omslagsfunktionen det returnerede fejlnummer (for at gøre det positivt), kopier det til errno, og returnerer -1 til kalderen af omslaget.
Nogle gange udfører omslagsfunktionen dog lidt ekstra arbejde før igangsættelse af systemkaldet. For eksempel er der i dag (af årsager beskrevet nedenfor) to relaterede systemkald, truncate(2) og truncate64(2), og glibc-omslagsfunktionen truncate() tjekker hvilket af disse systemkald der tilbydes af kernen og bestemmer hvilken der skal udrulles.
Systemkaldliste¶
Nedenfor er en liste over Linuxsystemkald. I listen indikerer kolonnen Kernel kerneversionen for disse systemkald, der var nye i Linux 2.2, eller er kommet siden den kerneversion. Bemærk de følgende punkter:
- •
- Hvor ingen kerneversion er indikeret, så kom systemkaldet i Linux 1.0 eller tidligere.
- •
- Hvor et systemkald er markeret »1.2«, betyder dette at systemkaldet sandsynligvis fremkom i en Linux 1.1.x-kerneversion og først var i en stabil kerne med 1.2. (Udviklingen af Linux 1.2-kernen blev igangsat fra en gren af Linux 1.0.6 via den ustabile kerneserie Linux 1.1.x).
- •
- Hvor et systemkald er markeret »2.0«, betyder dette at systemkaldet sandsynligvis fremkom i en Linux 1.3.x-kerneversion og først var i en stabil kerne med Linux 2.0. (Udviklingen af Linux 2.0-kernen blev igangsat fra en gren af Linux 1.2.x, cirka omkring Linux 1.2.10, via den ustabile kerneserie Linux 1.3.x).
- •
- Hvor et systemkald er markeret »2.2«, betyder dette at systemkaldet sandsynligvis fremkom i en Linux 2.1.x-kerneversion og først var i en stabil kerne med Linux 2.2.0. (Udviklingen af Linux 2.2-kernen blev igangsat fra en gren af Linux 2.0.21, via den ustabile kerneserie Linux 2.1.x).
- •
- Hvor et systemkald er markeret »2.4«, betyder dette at systemkaldet sandsynligvis fremkom i en Linux 2.3.x-kerneversion og først var i en stabil kerne med Linux 2.4.0. (Udviklingen af Linux 2.4-kernen blev igangsat fra en gren af Linux 2.2.8, via den ustabile kerneserie Linux 2.3.x).
- •
- Hvor et systemkald er markeret »2.6«, betyder dette at systemkaldet sandsynligvis fremkom i en Linux 2.5.x-kerneversion og først var i en stabil kerne med Linux 2.6.0. (Udviklingen af Linux 2.6-kernen blev igangsat fra en gren af Linux 2.4.15, via den ustabile kerneserie Linux 2.5.x).
- •
- Startende med Linux 2.6.0 blev udviklingsmodellen ændret, og nye systemkald kan komme i hver Linux 2.6.x-udgivelse. I dette tilfælde vises det præcise versionsnummer hvor systemkaldet opstod. Denne konvention fortsætter med Linux 3.x-kerneserien, der fulgte fra Linux 2.6.39; og Linux 4.x-kerneserien, der fulgte fra Linux 4.20; og Linux 6.x-kerneserien, der fulgte fra Linux 5.19.
- •
- I nogle tilfælde blev et systemkald tilføjet til en stabil kerneserie efter denne blev forgrenet fra en tidligere stabil kerneserie, og så tilbageomkodet til den tidligere stabile kerneserie. For eksempel blev nogle systemkald der fremkom i Linux 2.6.x også tilbageomkodet til en Linux 2.4.x-udgivelse efter Linux 2.4.15. Når det er sådan, vises versionen hvor systemkaldet fremkom i begge hovedkerneserier.
Listen over systemkald der er tilgængelige fra og med Linux 5.14 (eller i nogle få tilfælde på ældre kerner) er som følger:
På mange platforme, inklusive x86-32 bliver sokkelkald mulitplexede (via glibc-omslagsfunktioner) via socketcall(2) og på samme måde bliver System V IPC-kald multiplexede via ipc(2).
Selvom pladser er reserveret for dem i systemkaldtabellen, så er de følgende systemkald ikke implementeret i standardkernen: : afs_syscall(2), break(2), ftime(2), getpmsg(2), gtty(2), idle(2), lock(2), madvise1(2), mpx(2), phys(2), prof(2), profil(2), putpmsg(2), security(2), stty(2), tuxcall(2), ulimit(2) og vserver(2) (se også unimplemented(2)). ftime(3), profil(3) og ulimit(3) findes dog som biblioteksrutiner. Pladsen for phys(2) er i brug siden Linux 2.1.116 for umount(2); phys(2) vil aldrig blive implementeret. Kaldene getpmsg(2) og putpmsg(2) er for kerner tilrettet for at understøtte STRØMME, og kommer måske aldrig i standardkernen.
Der var i kort tid set_zone_reclaim(2), tilføjet i Linux 2.6.13 og fjernet i Linux 2.6.16; dette systemkald var aldrig tilgængelig for brugerrummet.
Systemkald på fjernede omkodninger¶
Nogle systemkald fandtes kun på Linuxarkitekturer, der siden er blevet fjernet fra kernen:
- •
- bfin_spinlock(2) (tilføjet i Linux 2.6.22)
- •
- dma_memcpy(2) (tilføjet i Linux 2.6.22)
- •
- sram_alloc(2) (tilføjet i Linux 2.6.22)
- •
- sram_free(2) (tilføjet i Linux 2.6.22)
- •
- metag_get_tls(2) (tilføj i Linux 3.9)
- •
- metag_set_fpu_flags(2) (tilføj i Linux 3.9)
- •
- metag_set_tls(2) (tilføj i Linux 3.9)
- •
- metag_setglobalbit(2) (tilføjet i Linux 3.9)
- •
- cmpxchg_badaddr(2) (tilføjet i Linux 2.6.36)
NOTER¶
Overordnet set kan koden tilhørende til systemkaldet med nummeret __NR_xxx defineret i /usr/include/asm/unistd.h findes i Linuxkernekilden i rutinen sys_xxx(). Der er dog mange undtagelser, hovedsagelig fordi ældre systemkald blev erstattet af nye og dette er blevet ordnet noget usystematisk. På platforme med proprietær emulering af operativsystemet såsom sparc, sparc64 og alpha, er der mange yderligere systemkald; mips64 indeholder også et fuldt sæt af 32-bit systemkald.
Over tid er ændringer til grænsefladerne for nogle systemkald blevet nødvendige. En årsag til sådanne ændringer var behovet for at øge størrelsen på strukturer eller skalerbare værdier sendt til systemkaldet. På grund af disse ændringer har bestemte arkitekturer (specielt, langvarige 32-bit arkitekturer såsom i386) nu diverse grupper af relaterede systemkald (f.eks. truncate(2) og truncate64(2)) der udfører ligennde opgaver, men kan variere i detaljer såsom størrelsen på deres argumenter. (Som nævnt tidligere er programmer generelt ikke opmærksomme på dette: glibc-omslagsfunktionerne gør lidt arbejde for at sikre, at det rigtige systemkald igangsættes, og at ABI-kompatibilitet bevares for ældre binære filer). Eksempler på systemkald der findes i flere versioner er som følger:
- •
- Der er nu tre forskellige versioner af stat(2): sys_stat() (plads __NR_oldstat), sys_newstat() (plads __NR_stat) og sys_stat64() (plads __NR_stat64), for den sidste er den nyeste. En lignende historie gælder for lstat(2) og fstat(2).
- •
- På samme måde refererer __NR_oldolduname, __NR_olduname og __NR_uname til rutinerne sys_olduname(), sys_uname() og sys_newuname().
- •
- I LInux 2.0 kom en ny version af vm86(2), med den gamle og de nye kernerutiner navngivet sys_vm86old() og sys_vm86().
- •
- I Linux 2.4 kom en ny version af getrlimit(2), med den gamle og nye kernerutiner navngivet sys_old_getrlimit() (plads __NR_getrlimit) og sys_getrlimit() (plads __NR_ugetrlimit).
- •
- Linux 2.4 øgede størrelsen på bruger- og gruppe-id'er fra 16 til 32 bit. For at understøtte denne ændring blev en vifte af systemkald tilføjet (f.eks. chown32(2), getuid32(2), getgroups32(2), setresuid32(2)), der efterfulgte tidligere kald med det samme navn uden »32«-suffiks.
- •
- Linux 2.4 tilføjede understøttelse for programmer på 32-bit arkitekturer for at tilgå store filer (dvs. filer hvor størrelserne og filforskydningerne ikke kan repræsenteres i 32 bit). For at understøtte denne ændring, var erstatninger kræver for systemkald der håndterer filforskydninger og størrelser. De følgende systemkald blev derfor tilføjet: fcntl64(2), getdents64(2), stat64(2), statfs64(2), truncate64(2) og deres analoger der fungerer med fildeskriptorer og symbolske henvisninger. Disse systemkald efterfølger ældre systemkald, der med undtagelse af »stat«-kald har de samme navne uden »64«-suffikset.
- På nyere platforme der kun har 64-bit filadgang og 32-bit UID'er/GID'er (f.eks. alpha, ia64, s390x, x86-64), er der kun en enkelt version af systemkaldene for UID/GID og filadgang. På platforme (typisk 32-bit platforme) hvor *64- og *32-kald findes, er de andre versioner forældet.
- •
- Kaldene rt_sig* blev tilføjet i Linux 2.2 for at understøtte tilføjelsen af realtids signaler (se signal(7)). Disse systemkald efterfølger de ældre systemkald med det samme navn uden »rt_«-præfikset.
- •
- Systemkaldene select(2) og mmap(2) bruger fem eller flere argumenter, hvilket medførte problemer i måden argumentdirigering blev brugt på i386. Mens andre arkitekturer har sys_select() og sys_mmap() svarende til __NR_select og __NR_mmap, så finder man på i386 old_select() og old_mmap() (rutiner der bruger en peger til en argumentblok) i stedet for. I disse dage er fem argumenter ikke et problem længere, og der er en __NR__newselect, der svarer direkte til sys_select() og tilsvarende for __NR_mmap2. s390x er den eneste 64-bit arkitektur, der har old_mmap().
Arkitekturspecifikke detaljer: Alpha¶
- getxgid(2)
- returnerer et par af UID og effektiv UID via registrene r0 og r20; tilbydes i stedet for getgid(2) og getegid(2).
- getxpid(2)
- returnerer et par af PID og over-PID via registrene r0 and r20; tilbydes i stedet for getpid(2) og getppid(2).
- old_adjtimex(2)
- er en variant af adjtimex(2), der bruger struct timeval32, for kompatibilitet med OSF/1.
- getxuid(2)
- returnerer et par af UID og effektiv UID via registrene r0 og r20; tilbydes i stedet for getuid(2) og geteuid(2).
- sethae(2)
- bruges til at konfigurere Host Address Extension-registeret på prisbillige Alphaer for at tilgå adresserum udover de første 27 bit.
SE OGSŶ
intro(2), syscall(2), unimplemented(2), errno(3), libc(7), vdso(7), ausyscall(8)
OVERSÆTTELSE¶
Oversættere af denne manual til dansk Joe Hansen <joedalton2@yahoo.dk>
Denne oversættelse er gratis dokumentation; læs GNU General Public License version 3 eller nyere for ophavsretbetingelser. Der er INGEN ANSVAR.
Hvis du støder på fejl i oversættelsen af denne vejledning, skal du sende en besked til debian-l10n-danish@lists.debian.org.
| 8. februar 2026 | Linux man-pages (ej udgivet) |