Hva er et Linux System Call?

What Is Linux System Call



Før vi går nærmere inn på definisjonen av et Linux -systemanrop og undersøker detaljene i utførelsen, er det best å begynne med å definere de forskjellige programvarelagene til et typisk Linux -system.

Linux -kjernen er et spesialisert program som starter og kjører på det laveste tilgjengelige nivået på maskinvaren din. Den har til oppgave å organisere alt som kjører på datamaskinen, inkludert håndtering av tastatur, disk og nettverkshendelser til å gi tidssnitt for å utføre flere programmer parallelt.







Når kjernen utfører et program på brukernivå, virtualiserer det minneplassen slik at programmene tror de er den eneste prosessen som kjøres i minnet. Denne beskyttende boblen med isolasjon av maskinvare og programvare øker sikkerheten og påliteligheten. Et uprivilegert program kan ikke få tilgang til minne som tilhører andre programmer, og hvis programmet krasjer, avsluttes kjernen slik at den ikke kan skade resten av systemet.



Breeching the Barrier med Linux System Calls

Dette isolasjonslaget mellom uprivilegerte applikasjoner gir en utmerket grense for å beskytte andre applikasjoner og brukere på systemet. Uten noen måte å koble til de andre elementene i datamaskinen og omverdenen, ville imidlertid programmer ikke kunne utrette mye av noe.



For å lette interaksjonen angir kjernen en programvareport som lar det kjørende programmet be om at kjernen handler på dens vegne. Dette grensesnittet er kjent som et systemanrop.





Siden Linux følger UNIX -filosofien om at alt er en fil, kan mange funksjoner utføres ved å åpne og lese eller skrive til en fil, som kan være en enhet. På Windows, for eksempel, kan du bruke en funksjon kalt CryptGenRandom for å få tilgang til tilfeldige byte. Men på Linux kan dette gjøres ved å åpne filen/dev/urandom og lese byte fra den ved hjelp av standard filinngangs-/utdatasystemanrop. Denne viktige forskjellen gir et enklere systemanropsgrensesnitt.

Wafer-Thin Wrapper

I de fleste applikasjoner blir det ikke foretatt systemanrop direkte til kjernen. Nesten alle programmer lenker til i standard C -bibliotek, som gir en tynn, men viktig innpakning rundt Linux -systemanrop. Biblioteket sørger for at funksjonsargumentene blir kopiert til de riktige prosessorregistrene, og sender deretter ut det tilsvarende Linux -systemanropet. Når data mottas fra samtalen, tolker pakkeren resultatene og returnerer dem tilbake til programmet på en konsekvent måte.



Bak scenen

Hver funksjon i et program som samhandler med systemet blir til slutt oversatt til et systemanrop. For å se dette i aksjon, la oss starte med et grunnleggende eksempel.

tomromhoved-() {
}

Dette er sannsynligvis det mest trivielle C -programmet du noen gang vil se. Den får ganske enkelt kontroll via hovedinngangspunktet og går deretter ut. Det returnerer ikke engang en verdi siden main er definert som ugyldig. Lagre filen som ctest.c og la oss kompilere den:

gcc ctest.c -ctest

Når den er kompilert, kan vi se filstørrelsen som 8664 byte. Det kan variere noe på systemet ditt, men det bør være rundt 8k. Det er mye kode bare for å gå inn og ut! Grunnen til at det er 8k er at libc -kjøretiden er inkludert. Selv om vi fjerner symbolene, er det fortsatt litt over 6k.

I et enda enklere eksempel kan vi få Linux -systemet til å avslutte i stedet for å avhenge av C -kjøretiden for å gjøre det for oss.

tomrom_start() {
asm('movl $ 1,%eax;'
'xorl %ebx, %ebx;'
'int $ 0x80');
}

Her flytter vi 1 inn i EAX -registeret, tømmer EBX -registeret (som ellers ville inneholde returverdien) og kaller deretter Linux -systemets avbrudd 0x80 (eller 128 i desimal). Dette avbruddet utløser kjernen for å behandle samtalen vår.

Hvis vi kompilerer vårt nye eksempel, kalt asmtest.c, og fjerner symbolene og ekskluderer standardbiblioteket:

gcc-s-nostdlib asmtest.c -o test

vi produserer en binær mindre enn 1k (på systemet mitt gir den 984 byte). Det meste av denne koden er kjørbare overskrifter. Vi kaller nå det direkte Linux -systemanropet.

For alle praktiske formål

I nesten alle tilfeller trenger du aldri å foreta direkte systemanrop i C -programmene dine. Hvis du bruker monteringsspråk, kan imidlertid behovet oppstå. Imidlertid, ved optimalisering, ville det være best å la C-biblioteksfunksjonene foreta systemanrop og bare ha den ytelseskritiske koden innebygd i monteringsdirektivene.

Slik programmerer du systemoppringingsopplæringer

Liste over alle systemanrop

Hvis du vil se en liste over alle tilgjengelige systemanrop for Linux, kan du sjekke disse referansesidene: Full liste over systemanrop på LinuxHint.com, filippo.io/linux-syscall-table/ og eller syscalls.kernelgrok.com