Sistemski pozivi

Što je Linux sistemski poziv?

Što je Linux sistemski poziv?

Prvo najprije

Prije nego što uđemo u definiciju Linux sistemskog poziva i ispitamo detalje njegovog izvođenja, najbolje je započeti s definiranjem različitih softverskih slojeva tipičnog Linux sustava.

Linux kernel je specijalizirani program koji pokreće i izvodi na najnižoj dostupnoj razini vašeg hardvera. Zadatak je orkestrirati sve što se izvodi na računalu, uključujući rukovanje tipkovnicom, diskom i mrežnim događajima, pružajući vremenske odsječke za paralelno izvršavanje više programa.

Kad jezgra izvrši program na razini korisnika, on virtualizira memorijski prostor tako da programi vjeruju da su jedini proces pokrenut u memoriji. Ovaj zaštitni balon izolacije hardvera i softvera povećava sigurnost i pouzdanost. Neprivilegirana aplikacija ne može pristupiti memoriji koja pripada drugim programima, a ako se taj program sruši, jezgra se prekida tako da ne može naštetiti ostatku sustava.

Otklanjanje barijere pozivima Linux sustava

Ovaj sloj izolacije između privilegiranih aplikacija pruža izvrsnu granicu za zaštitu drugih aplikacija i korisnika u sustavu. Međutim, bez nekog načina povezivanja s ostalim elementima u računalu i vanjskim svijetom, programi ne bi mogli postići mnogo od svega.

Da bi se olakšala interakcija, kernel određuje softverska vrata koja omogućuju pokrenutom programu da zahtijeva da kernel djeluje u njegovo ime. Ovo sučelje poznato je kao sistemski poziv.

Budući da Linux slijedi UNIX-ovu filozofiju "sve je datoteka", mnoge se funkcije mogu izvršiti otvaranjem i čitanjem ili pisanjem u datoteku, koja može biti uređaj. Na primjer, u sustavu Windows za pristup slučajnim bajtovima možete koristiti funkciju koja se naziva CryptGenRandom. Ali na Linuxu se to može učiniti jednostavnim otvaranjem "datoteke" / dev / urandom i čitanjem bajtova iz nje pomoću standardnih sistemskih poziva za unos / izlaz datoteka. Ova presudna razlika omogućuje jednostavnije sučelje sistemskog poziva.

Tanki omot za oblatne

U većini aplikacija sistemski pozivi ne upućuju se izravno jezgri. Gotovo svi programi povezuju se u standardnu ​​C biblioteku, koja pruža tanki, ali važan omot oko Linux sistemskih poziva. Biblioteka osigurava kopiranje argumenata funkcije u ispravne registre procesora, a zatim izdaje odgovarajući Linux sistemski poziv. Kad se iz poziva prime podaci, omot interpretira rezultate i na dosljedan način ih vraća natrag u program.

Iza scene

Svaka funkcija u programu koja komunicira sa sustavom na kraju se prevede u sistemski poziv. Da bismo to vidjeli na djelu, krenimo s osnovnim primjerom.

void main ()

Ovo je vjerojatno najtrivijalniji C program koji ćete ikad vidjeti. Jednostavno stječe kontrolu preko glavne ulazne točke, a zatim izlazi. Ne vraća čak ni vrijednost jer je main definiran kao void. Spremite datoteku kao ctest.c i hajde da ga kompajliramo:

gcc ctest.c -o ctest

Jednom kad je kompilirana, možemo vidjeti veličinu datoteke kao 8664 bajta. Može se malo razlikovati na vašem sustavu, ali trebao bi biti oko 8k. To je puno koda samo za ulazak i izlazak! Razlog zašto je 8k je taj što je uključeno vrijeme izvođenja libc. Čak i ako skinemo simbole, to je ipak malo više od 6k.

U još jednostavnijem primjeru, možemo izvršiti Linux sistemski poziv za izlaz, umjesto da ovisno o C izvedbi to učinimo umjesto nas.

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

Ovdje premještamo 1 u EAX registar, uklanjamo EBX registar (koji bi inače sadržavao povratnu vrijednost), a zatim pozivamo sistemski prekid Linux poziva 0x80 (ili 128 u decimalu). Ovaj prekid pokreće kernel da obradi naš poziv.

Ako kompajliramo naš novi primjer, nazvan asmtest.c, i uklonite simbole i izuzmite standardnu ​​knjižnicu:

gcc -s -nostdlib asmtest.c -o asmtest

proizvest ćemo binarnu datoteku manju od 1k (na mom sustavu donosi 984 bajta). Većina ovog koda su izvršna zaglavlja. Sada pozivamo izravni sistemski poziv Linuxa.

U sve praktične svrhe

U gotovo svim slučajevima nikada nećete morati upućivati ​​izravne sistemske pozive u svojim C programima. Međutim, ako koristite montažni jezik, može se pojaviti potreba. Međutim, u optimizaciji bi bilo najbolje dopustiti funkcijama knjižnice C da vrše sistemske pozive i da u direktive o montaži bude ugrađen samo vaš kôd kritičan prema performansama.

Kako programirati tutorijale za sistemske pozive

Popis svih sistemskih poziva

Ako želite vidjeti popis svih dostupnih sistemskih poziva za Linux, možete provjeriti ove referentne stranice: Cjelovit popis sistemskih poziva na LinuxHint.com, filippo.io / linux-syscall-table / i ili syscalls.kernelgrok.com

Luke komercijalnih igara s otvorenim kodom
Besplatne igre s otvorenim kodom i više platformi mogu se koristiti za igranje starih, kao i nekih prilično nedavnih naslova igara. U ovom će se člank...
Najbolje igre naredbenog retka za Linux
Naredbeni redak nije samo vaš najveći saveznik pri korištenju Linuxa - on također može biti izvor zabave jer ga možete koristiti za igranje mnogih zab...
Najbolje aplikacije za mapiranje gamepada za Linux
Ako volite igrati igre na Linuxu s gamepadom umjesto tipičnim sustavom za unos tipkovnice i miša, za vas postoji nekoliko korisnih aplikacija. Mnoge r...