Kas yra „Linux“ sistemos skambutis?

What Is Linux System Call



Prieš gilindamiesi į „Linux“ sistemos iškvietimo apibrėžimą ir išnagrinėję jo vykdymo detales, geriausia pradėti nuo įvairių tipinės „Linux“ sistemos programinės įrangos sluoksnių apibrėžimo.

„Linux“ branduolys yra specializuota programa, kuri paleidžiama ir veikia žemiausiu jūsų aparatūros lygiu. Jos užduotis yra organizuoti viską, kas veikia kompiuteryje, įskaitant klaviatūros, disko ir tinklo įvykių tvarkymą, kad būtų pateiktos laiko atkarpos kelioms programoms lygiagrečiai vykdyti.







Kai branduolys vykdo vartotojo lygio programą, jis virtualizuoja atminties vietą, kad programos manytų, jog jos yra vienintelis procesas, veikiantis atmintyje. Šis apsauginis aparatinės ir programinės įrangos izoliacijos burbulas padidina saugumą ir patikimumą. Neprivilegijuota programa negali pasiekti atminties, priklausančios kitoms programoms, o jei ši programa sugenda, branduolys nutraukiamas, kad ji negalėtų pakenkti likusiai sistemos daliai.



Įveikti barjerą naudojant „Linux“ sistemos skambučius

Šis izoliacijos sluoksnis tarp privilegijuotų programų suteikia puikią ribą, kad apsaugotų kitas programas ir sistemos vartotojus. Tačiau be tam tikro būdo prisijungti prie kitų kompiuterio ir išorinio pasaulio elementų, programos negalėtų daug ką pasiekti.



Siekiant palengvinti sąveiką, branduolys nurodo programinės įrangos vartus, leidžiančius veikiančiai programai paprašyti, kad branduolys veiktų jo vardu. Ši sąsaja yra žinoma kaip sistemos skambutis.





Kadangi „Linux“ vadovaujasi UNIX filosofija, kad viskas yra failas, daugelį funkcijų galima atlikti atidarant ir skaitant arba rašant į failą, kuris gali būti įrenginys. Pavyzdžiui, sistemoje „Windows“ galite naudoti funkciją „CryptGenRandom“, kad pasiektumėte atsitiktinius baitus. Tačiau „Linux“ tai galima padaryti tiesiog atidarius failą/dev/urandom ir skaitant iš jo baitus naudojant standartinius failų įvesties/išvesties sistemos skambučius. Šis esminis skirtumas leidžia sukurti paprastesnę sistemos skambučių sąsają.

Plonas vaflinis įvyniojimas

Daugelyje programų sistemos skambučiai nėra atliekami tiesiogiai į branduolį. Praktiškai visos programos yra susietos standartinėje C bibliotekoje, kuri suteikia ploną, bet svarbų „Linux“ sistemos skambučių paketą. Biblioteka užtikrina, kad funkcijos argumentai būtų nukopijuoti į teisingus procesoriaus registrus, tada išduoda atitinkamą „Linux“ sistemos iškvietimą. Kai gaunami duomenys iš skambučio, įvyniojimas interpretuoja rezultatus ir nuosekliai grąžina juos programai.



Užkuliusiuose

Kiekviena programos funkcija, kuri sąveikauja su sistema, galiausiai paverčiama sistemos iškvietimu. Norėdami tai pamatyti, pradėkime nuo pagrindinio pavyzdžio.

tuštumapagrindinis() {
}

Tai turbūt pati trivialiausia C programa, kurią kada nors matysite. Jis tiesiog įgyja kontrolę per pagrindinį įėjimo tašką ir tada išeina. Tai net negrąžina vertės, nes main yra apibrėžta kaip negaliojanti. Išsaugokite failą kaip ctest.c ir sukompiliuokite:

gcc ctest.c -ctestas

Kai jis bus sudarytas, matysime failo dydį kaip 8664 baitus. Tai gali šiek tiek skirtis jūsų sistemoje, tačiau turėtų būti apie 8 tūkst. Tai daug kodo tik norint įeiti ir išeiti! Priežastis 8k yra ta, kad įtraukiamas libc vykdymo laikas. Net jei nuimame simbolius, tai vis tiek yra šiek tiek daugiau nei 6 tūkst.

Dar paprastesniame pavyzdyje galime priversti „Linux“ sistemą paskambinti išeiti, o ne priklausomai nuo „C“ vykdymo laiko, kad tai padarytų už mus.

tuštuma_pradėk() {
asm('movl $ 1,%eax;'
'xorl %ebx, %ebx;'
„$ 0x80“);
}

Čia mes perkeliame 1 į EAX registrą, išvalome EBX registrą (kuriame priešingu atveju būtų grąžinimo vertė), tada paskambinsime „Linux“ sistemos skambučio pertraukimui 0x80 (arba 128 dešimtaine dalimi). Šis pertraukimas skatina branduolį apdoroti mūsų skambutį.

Jei sudarysime naują pavyzdį, vadinamą asmtest.c, ir pašalinsime simbolius bei neįtrauksime standartinės bibliotekos:

gcc-s-nostdlib asmtest.c -o asmtestas

mes pagaminsime dvejetainę, mažesnę nei 1 k (mano sistemoje tai duoda 984 baitus). Dauguma šio kodo yra vykdomosios antraštės. Dabar mes skambiname tiesioginiu „Linux“ sistemos skambučiu.

Visiems praktiniams tikslams

Beveik visais atvejais jums niekada nereikės tiesiogiai skambinti C programose. Tačiau, jei naudojate surinkimo kalbą, gali prireikti. Tačiau optimizuojant geriausia būtų leisti C bibliotekos funkcijoms skambinti sistemai ir surinkimo direktyvose įterpti tik jūsų veikimui svarbų kodą.

Kaip užprogramuoti sistemos skambučių vadovus

Visų sistemos skambučių sąrašas

Jei norite pamatyti visų galimų „Linux“ sistemos iškvietimų sąrašą, galite patikrinti šiuos informacinius puslapius: Visas sistemos skambučių sąrašas „LinuxHint.com“, filippo.io/linux-syscall-table/ ir arba syscalls.kernelgrok.com