Systemanrop

Hva er et Linux-systemanrop?

Hva er et Linux-systemanrop?

Første ting først

Før vi går inn i definisjonen av et Linux-systemanrop og undersøker detaljene for 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 for å gi tidssnitt for å utføre flere programmer parallelt.

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

Ridning av 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 å samhandle med de andre elementene i datamaskinen og omverdenen, ville ikke programmene være i stand til å oppnå mye av noe.

For å gjøre det lettere å samhandle, utpeker kjernen en programvaregate som lar det kjørende programmet be om at kjernen handler på dens vegne. Dette grensesnittet er kjent som en systemanrop.

Siden Linux følger UNIX-filosofien om "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 kan du for eksempel bruke en funksjon som heter CryptGenRandom for å få tilgang til tilfeldige byte. Men på Linux kan dette gjøres ved ganske enkelt å åpne "filen" / dev / urandom og lese byte fra den ved hjelp av standard inn- / utdata-systemanrop. Denne avgjørende forskjellen muliggjør et enklere systemanropsgrensesnitt.

Wafer-Thin Wrapper

I de fleste applikasjoner blir ikke systemanrop foretatt direkte til kjernen. Nesten alle programmer 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 deretter utgir den tilsvarende Linux-systemanropet. Når data mottas fra samtalen, tolker innpakningen resultatene og returnerer dem tilbake til programmet på en jevn måte.

Bak scenen

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

ugyldig hoved ()

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

gcc ctest.c-o ctest

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

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

ugyldig _start ()
asm ("movl $ 1,% eax;"
"xorl% ebx,% ebx;"
"int $ 0x80");

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

Hvis vi sammenstiller vårt nye eksempel, kalt asmtest.c, og fjern symbolene og ekskluder standardbiblioteket:

gcc -s -nostdlib asmtest.c-o asmtest

vi 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å direkte Linux-systemanrop.

For alle praktiske formål

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

Hvordan programmere systemanropsveiledninger

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

Slik installerer du League Of Legends på Ubuntu 14.04
Hvis du er fan av League of Legends, er dette en mulighet for deg å prøvekjør League of Legends. Merk at LOL støttes på PlayOnLinux hvis du er en linu...
Installer det siste OpenRA-strategispillet på Ubuntu Linux
OpenRA er en Libre / Free Real Time Strategy-spillmotor som gjenskaper de tidlige Westwood-spillene som den klassiske Command & Conquer: Red Alert. Di...
Installer nyeste Dolphin Emulator for Gamecube & Wii på Linux
Dolphin Emulator lar deg spille de valgte Gamecube- og Wii-spillene dine på Linux Personal Computers (PC). Som en fritt tilgjengelig og åpen kildekod...