Sistemski klici

Kaj je sistemski klic Linuxa?

Kaj je sistemski klic Linuxa?

Najprej najprej

Preden se poglobimo v definicijo sistemskega klica Linux in preučimo podrobnosti njegovega izvajanja, je najbolje začeti z določitvijo različnih slojev programske opreme tipičnega sistema Linux.

Jedro Linuxa je specializiran program, ki se zažene in deluje na najnižji razpoložljivi ravni vaše strojne opreme. Naloga je organizirati vse, kar se izvaja v računalniku, vključno z ravnanjem s tipkovnico, diskom in omrežnimi dogodki, da zagotovi časovne rezine za vzporedno izvajanje več programov.

Ko jedro zažene program na uporabniški ravni, virtualizira pomnilniški prostor, tako da programi verjamejo, da so edini postopek, ki se izvaja v pomnilniku. Ta zaščitni mehurček izolacije strojne in programske opreme povečuje varnost in zanesljivost. Neprivilegirana aplikacija ne more dostopati do pomnilnika, ki pripada drugim programom, in če se ta program zruši, se jedro konča, tako da ne more škoditi ostalemu sistemu.

Odprava ovire s sistemskimi klici Linux

Ta plast izolacije med privilegiranimi aplikacijami je odlična meja za zaščito drugih aplikacij in uporabnikov v sistemu. Vendar brez kakršnega koli načina za vmesnik z drugimi elementi v računalniku in zunanjem svetu programi ne bi mogli doseči veliko česar koli.

Za lažjo interakcijo jedro določa programska vrata, ki omogočajo delujočemu programu, da zahteva, da jedro deluje v njegovem imenu. Ta vmesnik je znan kot sistemski klic.

Ker Linux sledi filozofiji UNIX »vse je datoteka«, lahko številne funkcije izvajamo tako, da odpremo in preberemo ali zapišemo v datoteko, ki je lahko naprava. Na primer v sistemu Windows lahko za dostop do naključnih bajtov uporabite funkcijo CryptGenRandom. Toda v Linuxu je to mogoče storiti tako, da preprosto odprete datoteko / dev / urandom in iz nje preberete bajte z uporabo standardnih sistemskih klicev za vhod / izhod datotek. Ta ključna razlika omogoča preprostejši vmesnik sistemskih klicev.

Obloga iz tankih oblatov

V večini aplikacij sistemski klici niso opravljeni neposredno v jedro. Skoraj vsi programi se povezujejo v standardni knjižnici C, ki zagotavlja tanek, a pomemben ovoj okoli sistemskih klicev Linuxa. Knjižnica poskrbi, da se argumenti funkcije kopirajo v pravilne registre procesorja, nato izda ustrezen sistemski klic Linuxa. Ko iz klica prejme podatke, ovoj ovrednoti rezultate in jih dosledno vrne v program.

V zakulisju

Vsaka funkcija v programu, ki deluje s sistemom, se sčasoma prevede v sistemski klic. Da bi to videli v akciji, začnimo z osnovnim primerom.

void main ()

To je verjetno najbolj trivialni program C, ki ga boste kdaj videli. Preprosto pridobi nadzor prek glavne vstopne točke in nato izstopi. Vrednosti niti ne vrne, saj je main definiran kot void. Datoteko shranite kot ctest.c in ga sestavimo:

gcc ctest.c -o ctest

Ko je sestavljena, lahko vidimo velikost datoteke kot 8664 bajtov. V vašem sistemu se lahko nekoliko razlikuje, vendar bi moral biti približno 8k. To je veliko kode samo za vstop in izstop! Razlog za to, da je 8k, je vključitev izvajalnega okolja libc. Tudi če odstranimo simbole, je vseeno nekaj več kot 6k.

V še enostavnejšem primeru lahko sistemski klic sistema Linux naredimo tako, da izstopi, namesto da bi bil to odvisen od izvajalnega okolja C.

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

Tu premaknemo 1 v register EAX, izbrišemo register EBX (ki bi sicer vseboval vrnjeno vrednost) in nato pokličemo sistemsko klicno prekinitev Linuxa 0x80 (ali 128 v decimalni številki). Ta prekinitev sproži jedro, da obdela naš klic.

Če zberemo naš novi primer, imenovan asmtest.c, odstranite simbole in izključite standardno knjižnico:

gcc -s -nostdlib asmtest.c -o asmtest

izdelali bomo binarno datoteko, manjšo od 1k (v mojem sistemu dobimo 984 bajtov). Večina te kode je izvršljivih glav. Zdaj kličemo neposredni sistemski klic Linuxa.

Za vse praktične namene

V skoraj vseh primerih vam nikoli ne bo treba izvajati neposrednih sistemskih klicev v vaših programih C. Če uporabljate montažni jezik, pa se lahko pojavi potreba. Pri optimizaciji pa bi bilo najbolje, če bi funkcije knjižnice C dovolile sistemske klice, v direktive o montaži pa bi bila vdelana samo vaša kritična koda.

Kako programirati vaje za sistemske klice

Seznam vseh sistemskih klicev

Če si želite ogledati seznam vseh razpoložljivih sistemskih klicev za Linux, lahko preverite te referenčne strani: Celoten seznam sistemskih klicev v Linuxu Namig.com, filippo.io / linux-syscall-table / in ali syscalls.kernelgrok.com

SuperTuxKart za Linux
SuperTuxKart je odličen naslov, zasnovan tako, da vam brezplačno ponuja izkušnjo Mario Kart v vašem sistemu Linux. Igrati je precej zahtevno in zabavn...
Vadnica za bitko za Wesnoth
Bitka za Wesnoth je ena izmed najbolj priljubljenih odprtokodnih strateških iger, ki jih lahko trenutno igrate. Ne samo, da se ta igra razvija že zelo...
0 A.D. Vadnica
Od številnih strateških iger tam 0 A.D. uspe izstopati kot izčrpen naslov in zelo globoka, taktična igra, čeprav je odprtokodna. Razvoj igre deluje ze...