Sistemos skambučiai

Kas yra „Linux“ sistemos skambutis?

Kas yra „Linux“ sistemos skambutis?

Visų pirmą

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

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

Kai branduolys vykdo vartotojo lygio programą, ji virtualizuoja atminties vietą, kad programos manytų, jog tai yra vienintelis procesas, vykdomas atmintyje. Šis apsauginis aparatinės ir programinės įrangos izoliacijos burbulas padidina saugumą ir patikimumą. Neprivilegijuota programa negali pasiekti atminties, priklausančios kitoms programoms, ir jei ši programa užstringa, branduolys nutrūksta, kad negalėtų pakenkti likusiai sistemai.

„Linux“ sistemos skambučių iškėlimas

Šis neprivilegijuotų programų izoliacijos sluoksnis suteikia puikią apsaugą kitoms sistemos programoms ir vartotojams. Tačiau be tam tikro būdo sąveikauti su kitais kompiuterio ir išorinio pasaulio elementais, programos negalėtų daug ko pasiekti.

Siekdamas palengvinti sąveiką, branduolys nurodo programinės įrangos vartus, kurie leidžia vykdomai programai prašyti, kad branduolys veiktų jos vardu. Ši sąsaja yra žinoma kaip sistemos iškvietimas.

Kadangi „Linux“ vadovaujasi UNIX filosofija „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. Bet naudojant „Linux“, tai galima padaryti tiesiog atidarant „file“ / dev / urandom ir skaitant iš jo baitus naudojant standartinius failų įvesties / išvesties sistemos skambučius. Šis esminis skirtumas leidžia paprastesnę sistemos skambučio sąsają.

Vaflių plonas vyniotuvas

Daugumoje programų sistemos skambučiai nėra atliekami tiesiai į branduolį. Praktiškai visos programos susieja standartinėje C bibliotekoje, kuri suteikia ploną, bet svarbų apvalkalą aplink „Linux“ sistemos skambučius. 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, apvalkalas interpretuoja rezultatus ir nuosekliai grąžina juos atgal į programą.

Užkuliusiuose

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

negaliojantis pagrindinis ()

Tai turbūt pati nereikšmingiausia C programa, kurią kada nors pamatysite. Jis tiesiog įgauna kontrolę per pagrindinį įėjimo tašką ir tada išeina. Jis net negrąžina vertės, nes pagrindinis yra apibrėžiamas kaip negaliojantis. Išsaugokite failą kaip ctest.c ir sudarykime jį:

gcc ctest.c -o ctest

Jį sukompiliavus, failo dydis matomas kaip 8664 baitai. Tai gali šiek tiek skirtis jūsų sistemoje, tačiau ji turėtų būti maždaug 8 tūkst. Tai yra daug kodų, kad tik įvestumėte ir išeitumėte! Priežastis, kad tai 8k, yra ta, kad įtraukiamas „libc“ vykdymo laikas. Net jei nuimame simbolius, tai vis tiek viršija 6 tūkst.

Dar paprastesniame pavyzdyje galime priversti „Linux“ sistemą kviesti išeiti, o ne priklausomai nuo „C“ vykdymo laiko, kad tai padarytume mums.

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

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

Jei sudarysime savo naują pavyzdį, vadinamą asmtest.c, išimkite simbolius ir neįtraukite standartinės bibliotekos:

gcc -s -nostdlib asmtest.c -o asmtest

sukursime dvejetainį failą, mažesnį nei 1k (mano sistemoje gaunami 984 baitai). Didžioji šio kodo dalis yra vykdomosios antraštės. Dabar skambiname tiesioginiu „Linux“ sistemos skambučiu.

Visiems praktiniams tikslams

Beveik visais atvejais jums nereikės tiesiogiai skambinti sistemai į savo C programas. Tačiau jei naudojate surinkimo kalbą, gali kilti poreikis. Tačiau optimizuojant geriausia būtų leisti C bibliotekos funkcijoms atlikti sistemos skambučius ir surinkimo direktyvose įterpti tik jūsų kritinį našumą.

Kaip užprogramuoti sistemos skambučių pamokas

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

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

Kaip užfiksuoti ir perduoti savo žaidimų sesiją sistemoje „Linux“
Anksčiau žaidimai buvo laikomi tik pomėgiu, tačiau laikui bėgant lošimų pramonė labai augo technologijų ir žaidėjų skaičiaus atžvilgiu. Žaidimų audito...
Geriausi žaidimai, kuriuos reikia žaisti naudojant rankos stebėjimą
„Oculus Quest“ neseniai pristatė puikią rankos stebėjimo be valdiklių idėją. „Oculus Quest“ rankų sekimo žaidimai iki šiol buvo ribojami, kai žaidimų ...
Kaip rodyti OSD perdangą viso ekrano „Linux“ programose ir žaidimuose
Žaisdami viso ekrano žaidimus arba naudodamiesi programomis be išsiblaškymo viso ekrano režimu, galite nutraukti nuo susijusios sistemos informacijos,...