Mis on Linuxi süsteemikõne?

What Is Linux System Call



Enne kui süveneme Linuxi süsteemikõne määratlusse ja uurime selle täitmise üksikasju, on kõige parem alustada tüüpilise Linuxi süsteemi erinevate tarkvarakihtide määratlemisega.

Linuxi kernel on spetsiaalne programm, mis käivitub ja töötab teie riistvara madalaimal saadaoleval tasemel. Selle ülesanne on korraldada kõik, mis arvutis töötab, sealhulgas klaviatuuri, ketta ja võrgusündmuste käsitlemine, et pakkuda ajakavasid mitme programmi paralleelseks täitmiseks.







Kui kernel käivitab kasutaja tasemel programmi, virtualiseerib see mäluruumi nii, et programmid usuvad, et need on ainsad mälus töötavad protsessid. See riist- ja tarkvaraisolatsiooni kaitsev mull suurendab turvalisust ja töökindlust. Privileegitu rakendus ei pääse juurde teiste programmide mälule ja kui see programm jookseb kokku, lõpetab tuum nii, et see ei kahjusta ülejäänud süsteemi.



Tõkke ületamine Linuxi süsteemikõnedega

See isoleeritud kiht privilegeerimata rakenduste vahel annab suurepärase piiri teiste rakenduste ja süsteemi kasutajate kaitsmiseks. Kuid ilma arvuti ja välismaailma teiste elementidega liideseta poleks programmid võimelised palju saavutama.



Suhtlemise hõlbustamiseks määrab kernel tarkvaravärava, mis võimaldab töötaval programmil taotleda, et kernel tegutseks tema nimel. Seda liidest nimetatakse süsteemikõneks.





Kuna Linux järgib UNIX -i filosoofiat, et kõik on fail, saab paljusid funktsioone täita, avades ja lugedes või kirjutades faili, mis võib olla seade. Näiteks Windowsis võite juhuslikele baitidele juurdepääsemiseks kasutada funktsiooni CryptGenRandom. Kuid Linuxis saab seda teha, lihtsalt avades faili/dev/urandom ja lugedes sellest baite, kasutades standardseid failisisestus-/väljundsüsteemi kõnesid. See oluline erinevus võimaldab lihtsamat süsteemikõne liidest.

Vahvel-õhuke ümbris

Enamikus rakendustes süsteemikõnesid otse kernelisse ei tehta. Praktiliselt kõik programmid lingivad tavalises C -raamatukogus, mis pakub õhukest, kuid olulist ümbrist Linuxi süsteemikõnede ümber. Raamatukogu hoolitseb selle eest, et funktsiooni argumendid oleks kopeeritud õigetesse protsessoriregistritesse, ja väljastab seejärel vastava Linuxi süsteemikõne. Kui kõnest saadakse andmeid, tõlgendab ümbris tulemusi ja tagastab need järjekindlalt programmile tagasi.



Lava taga

Iga programmi funktsioon, mis suhtleb süsteemiga, teisendatakse lõpuks süsteemikõneks. Selle toimimise nägemiseks alustame põhinäitega.

tühinepeamine() {
}

See on ilmselt kõige triviaalsem C -programm, mida kunagi näete. See lihtsalt saavutab kontrolli peamise sisenemispunkti kaudu ja seejärel väljub. See ei tagasta isegi väärtust, kuna peamine on määratletud kui tühine. Salvestage fail nimega ctest.c ja kompileerime selle:

gcc ctest.c -ctest

Kui see on koostatud, näeme faili suurust 8664 baiti. See võib teie süsteemis pisut erineda, kuid see peaks olema umbes 8 000. See on palju koodi lihtsalt sisenemiseks ja väljumiseks! Põhjus, miks see on 8k, on see, et libc käitusaeg on kaasatud. Isegi kui me sümbolid eemaldame, on see ikkagi veidi üle 6 000.

Veelgi lihtsamas näites saame Linuxi süsteemi kutsuda väljumiseks, mitte olenevalt sellest, mis C -aeg meie eest seda teeb.

tühine_hakatus() {
asm('movl $ 1,%eax;'
'xorl %ebx, %ebx;'
'$ 0x80');
}

Siin liigume 1 EAX -registrisse, tühjendame EBX -registri (mis muidu sisaldaks tagastamisväärtust) ja nimetame Linuxi süsteemi kõne katkestuseks 0x80 (või 128 kümnendkohani). See katkestus käivitab kerneli meie kõne töötlema.

Kui koostame oma uue näite, nimega asmtest.c, eemaldame sümbolid ja jätame standardtee välja:

gcc-s-nostdlib asmtest.c -o asmtest

toodame binaarfaili vähem kui 1k (minu süsteemis annab see 984 baiti). Enamik sellest koodist on käivitatavad päised. Nüüd kutsume otse Linuxi süsteemikõnet.

Kõigil praktilistel eesmärkidel

Peaaegu kõigil juhtudel ei pea te oma C -programmides kunagi otseseid süsteemikõnesid tegema. Kui aga kasutate koostamiskeelt, võib see vajadus tekkida. Optimeerimisel oleks aga kõige parem lasta C-teegi funktsioonidel süsteemikõnesid teha ja montaažidirektiividesse manustada ainult teie jõudluskriitiline kood.

Kuidas programmeerida süsteemikõnede õpetusi

Kõigi süsteemikõnede loend

Kui soovite näha kõigi Linuxi jaoks saadaolevate süsteemikõnede loendit, saate vaadata neid viitelehti: Täielik süsteemikõnede loend saidil LinuxHint.com, filippo.io/linux-syscall-table/ ja või syscalls.kernelgrok.com