Før vi fordyper definisjonen av et Linux -systemanrop og undersøker detaljene om utførelsen, er det best å starte med å definere de forskjellige programvarelagene i 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 oppgaven med å orkestrere alt som kjører på datamaskinen, inkludert håndtering av tastatur, disk og nettverkshendelser for å gi tidsskiver for å utføre flere programmer parallelt.
Når kjernen utfører et brukernivåprogram, virtualiserer det minneområdet slik at programmer mener at de er den eneste prosessen som kjører i minnet. Denne beskyttende boblen av maskinvare- og programvareisolasjon øker sikkerheten og påliteligheten. En uprivilegert applikasjon kan ikke få tilgang til minnet som tilhører andre programmer, og hvis det programmet krasjer, avsluttes kjernen slik at det ikke kan skade resten av systemet.
Breeching barrieren med Linux -systemanrop
Dette laget av isolasjon mellom uprivilegerte applikasjoner gir en utmerket grense for å beskytte andre applikasjoner og brukere på systemet. Uten noen måte å grensesnitt mot de andre elementene i datamaskinen og omverdenen, ville ikke programmer være i stand til å oppnå mye av noe.
For å lette samspillet, utpeker kjernen en programvareport som lar det løpende programmet be om at kjernen handler på dens vegne. Dette grensesnittet er kjent som et systemanrop.
Siden Linux følger UNIX -filosofien om "Everything Is A File", 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 som heter CryptGenrandom for å få tilgang til tilfeldige byte. Men på Linux kan dette gjøres ved bare. Denne avgjørende forskjellen gir et enklere systemanropgrensesnitt.
Wafer-Thin Wrapper
I de fleste applikasjoner gjøres ikke systemanrop direkte til kjernen. Så godt som alle programmene lenker i standard C -biblioteket, som gir en tynn, men viktig innpakning rundt Linux -systemanrop. Biblioteket sørger for at funksjonsargumentene blir kopiert til de riktige prosessorregistrene og utsteder den tilsvarende Linux -systemanropet. Når data mottas fra samtalen, tolker innpakningen resultatene og returnerer den tilbake til programmet på en jevn 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.
void main ()Dette er sannsynligvis det mest trivielle C -programmet du noensinne vil se. Det får ganske enkelt kontroll via hovedinngangspunktet og går deretter ut. Det gir ikke en gang en verdi siden hoved er definert som tomrom. Lagre filen som CTEST.C og la oss sammenstille det:
GCC CTEST.C -o CTESTNår den er samlet, kan vi se filstørrelsen som 8664 byte. Det kan variere litt på systemet ditt, men det skal være rundt 8K. Det er mye kode bare for å gå inn og avslutte! Årsaken til at det er 8K er at LIBC -runtime blir inkludert. Selv om vi striper symbolene, er det fortsatt litt over 6k.
I et enda enklere eksempel kan vi gjøre Linux -systemet til å avslutte i stedet for avhengig av C -runtime for å gjøre det for oss.
void _Start ()Her flytter vi 1 inn i EAX -registeret, rydder ut EBX -registeret (som ellers vil inneholde returverdien) og ring Linux System Call Interrupt 0x80 (eller 128 i desimal). Dette avbrutt utløser kjernen til å behandle samtalen vår.
Hvis vi kompilerer vårt nye eksempel, kalt Asptest.C, og striper ut symbolene og ekskluderer standardbiblioteket:
GCC -S -NOSTDLIB ASMTEST.C -o AsmtestVi produserer en binær mindre enn 1K (på systemet mitt gir det 984 byte). Det meste av denne koden er kjørbare overskrifter. Vi ringer nå Direct Linux System Call.
For alle praktiske formål
I nesten alle tilfeller trenger du aldri å ringe direkte systemer i C -programmene dine. Hvis du bruker samlingsspråk, kan imidlertid behovet oppstå. I optimalisering vil det imidlertid være best å la C-bibliotekfunksjonene ringe systemanropene og har bare din ytelseskritiske kode innebygd i monteringsdirektivene.
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