Mikä on Linux -järjestelmäpuhelu?

What Is Linux System Call



Ennen kuin syvennymme Linux -järjestelmäkutsun määritelmään ja tutkimme sen suorittamisen yksityiskohtia, on parasta aloittaa määrittämällä tyypillisen Linux -järjestelmän eri ohjelmistokerrokset.

Linux -ydin on erikoistunut ohjelma, joka käynnistyy ja toimii laitteistosi alimmalla mahdollisella tasolla. Sen tehtävänä on järjestää kaikki tietokoneella suoritettavat asiat, mukaan lukien näppäimistön, levyn ja verkkotapahtumien käsittely, aikajaksojen tarjoamiseksi useiden ohjelmien samanaikaiseen suorittamiseen.







Kun ydin suorittaa käyttäjätason ohjelman, se virtualisoi muistitilan niin, että ohjelmat uskovat olevansa ainoa prosessi, joka toimii muistissa. Tämä laitteiston ja ohjelmiston eristyksen suojakupla lisää turvallisuutta ja luotettavuutta. Käyttöoikeudeton sovellus ei voi käyttää muiden ohjelmien muistia, ja jos ohjelma kaatuu, ydin lopettaa niin, ettei se voi vahingoittaa koko järjestelmää.



Esteen ylittäminen Linux -järjestelmäpuheluilla

Tämä eristäytymättömien sovellusten välinen kerros tarjoaa erinomaisen rajan muiden sovellusten ja järjestelmän käyttäjien suojaamiseksi. Ohjelmat eivät kuitenkaan pystyisi saavuttamaan paljon mitään ilman tiettyä tapaa liittyä tietokoneen muihin osiin ja ulkomaailmaan.



Vuorovaikutuksen helpottamiseksi ydin nimeää ohjelmistoportin, jonka avulla käynnissä oleva ohjelma voi pyytää ytimen toimimaan sen puolesta. Tätä käyttöliittymää kutsutaan järjestelmäkutsuksi.





Koska Linux noudattaa UNIX -filosofiaa, että kaikki on tiedosto, monet toiminnot voidaan suorittaa avaamalla ja lukemalla tai kirjoittamalla tiedostoon, joka voi olla laite. Esimerkiksi Windowsissa voit käyttää CryptGenRandom -funktiota päästäksesi satunnaisiin tavuihin. Mutta Linuxissa tämä voidaan tehdä yksinkertaisesti avaamalla tiedosto/dev/urandom ja lukemalla tavuja siitä tavallisilla tiedoston syöttö-/tulostusjärjestelmäpuheluilla. Tämä ratkaiseva ero mahdollistaa yksinkertaisemman järjestelmäkutsuliittymän.

Ohut vohvelikääre

Useimmissa sovelluksissa järjestelmäpuheluja ei tehdä suoraan ytimeen. Lähes kaikki ohjelmat linkittävät C -vakiokirjastoon, joka tarjoaa ohuen mutta tärkeän paketin Linux -järjestelmäpuheluiden ympärille. Kirjasto varmistaa, että funktion argumentit kopioidaan oikeisiin prosessorirekistereihin ja antaa sitten vastaavan Linux -järjestelmäkutsun. Kun tietoja vastaanotetaan puhelusta, kääre tulkitsee tulokset ja palauttaa ne takaisin ohjelmalle johdonmukaisella tavalla.



Kulissien takana

Ohjelman jokainen toiminto, joka on vuorovaikutuksessa järjestelmän kanssa, muutetaan lopulta järjestelmäkutsuksi. Jos haluat nähdä tämän toiminnassa, aloitetaan perusesimerkillä.

mitätöntärkein() {
}

Tämä on luultavasti triviaalin C -ohjelma, jonka näet. Se yksinkertaisesti saa hallinnan pääsisäänkäynnin kautta ja poistuu sitten. Se ei edes palauta arvoa, koska main on määritetty tyhjäksi. Tallenna tiedosto nimellä ctest.c ja kääntäkää se:

gcc ctest.c -ctest

Kun se on koottu, voimme nähdä tiedoston koon 8664 tavua. Se voi vaihdella hieman järjestelmästäsi, mutta sen pitäisi olla noin 8 kt. Se on paljon koodia vain sisään ja ulos! Syy 8k on se, että libc -ajonaika sisältyy. Vaikka poistaisimme symbolit, se on silti hieman yli 6 000.

Vielä yksinkertaisemmassa esimerkissä voimme pyytää Linux -järjestelmää poistumaan sen sijaan, että olisimme riippuvaisia ​​sen suorittamisesta C -ajasta.

mitätön_alkaa() {
asm('movl $ 1,%eax;'
'xorl %ebx, %ebx;'
'$ 0x80');
}

Tässä siirrämme 1 EAX -rekisteriin, tyhjennämme EBX -rekisterin (joka muuten sisältäisi palautusarvon) ja kutsumme sitten Linux -järjestelmän puhelun keskeytystä 0x80 (tai 128 desimaalilukuna). Tämä keskeytys saa ytimen käsittelemään puhelumme.

Jos koomme uuden esimerkkimme, nimeltään asmtest.c, ja poistamme symbolit ja suljemme pois vakiokirjaston:

gcc-s-nostdlib asmtest.c -o asmtesti

tuotamme alle 1 kt: n binaarin (järjestelmässäni se tuottaa 984 tavua). Suurin osa tästä koodista on suoritettavia otsikoita. Soitamme nyt suoraa Linux -järjestelmäkutsua.

Käytännössä

Lähes kaikissa tapauksissa sinun ei tarvitse koskaan soittaa suoria järjestelmäpuheluita C -ohjelmissasi. Jos kuitenkin käytät kokoonpanokieltä, tarve saattaa ilmetä. Optimoinnissa olisi kuitenkin parasta antaa C-kirjastotoimintojen soittaa järjestelmäpuheluita ja saada vain suorituskyvyn kannalta kriittinen koodisi upotettuna kokoonpanodirektiiviin.

Järjestelmäpuheluiden opetusohjelmien ohjelmointi

Luettelo kaikista järjestelmäpuheluista

Jos haluat nähdä luettelon kaikista saatavilla olevista Linux -järjestelmäpuheluista, voit tarkistaa nämä viitesivut: Täysi luettelo järjestelmäpuheluista osoitteessa LinuxHint.com, filippo.io/linux-syscall-table/ ja tai syscalls.kernelgrok.com