Mi az a Linux rendszerhívás?

What Is Linux System Call



Mielőtt elmélyednénk a Linux rendszerhívás definíciójában, és megvizsgálnánk a végrehajtásának részleteit, a legjobb, ha egy tipikus Linux rendszer különböző szoftverrétegeinek meghatározásával kezdjük.

A Linux kernel egy speciális program, amely a hardver legalacsonyabb elérhető szintjén indul és fut. Feladata, hogy megszervezze a számítógépen futó mindent, beleértve a billentyűzet, a lemez és a hálózati események kezelését, hogy időszeleteket biztosítson több program párhuzamos végrehajtásához.







Amikor a kernel felhasználói szintű programot hajt végre, virtualizálja a memóriaterületet, így a programok azt hiszik, hogy csak ők futnak a memóriában. Ez a hardver- és szoftverizolációs védőbuborék növeli a biztonságot és a megbízhatóságot. Egy jogosulatlan alkalmazás nem férhet hozzá más programokhoz tartozó memóriához, és ha a program összeomlik, a rendszermag leáll, így nem károsíthatja a rendszer többi részét.



A sorompó átlépése Linux rendszerhívásokkal

Ez a kiváltságtalan alkalmazások közötti elszigeteltségi réteg kiváló határvonalat biztosít a többi alkalmazás és felhasználó védelmére a rendszeren. Azonban a számítógép és a külvilág többi elemével való interfész nélkül a programok nem lennének képesek semmire.



Az interakció megkönnyítése érdekében a kernel kijelöl egy szoftverkaput, amely lehetővé teszi a futó program számára, hogy kérje, hogy a kernel lépjen fel a nevében. Ezt a felületet rendszerhívásnak nevezik.





Mivel a Linux a UNIX filozófiáját követi, minden fájlnak minősül, ezért számos funkció végrehajtható egy fájl megnyitásával, olvasásával vagy írásával, amely lehet egy eszköz. Windows rendszeren például használhatja a CryptGenRandom nevű függvényt a véletlenszerű bájtok eléréséhez. De Linux alatt ezt megteheti úgy, hogy egyszerűen megnyitja a/dev/urandom fájlt, és bájtokat olvas ki belőle a szabványos fájlbeviteli/kimeneti rendszerhívások használatával. Ez a lényeges különbség egyszerűbb rendszerhívási felületet tesz lehetővé.

Ostya-vékony csomagoló

A legtöbb alkalmazásban a rendszerhívások nem közvetlenül a rendszermagba mennek. Gyakorlatilag minden program hivatkozik a szabványos C könyvtárba, amely vékony, de fontos csomagolást biztosít a Linux rendszerhívások körül. A könyvtár gondoskodik arról, hogy a függvény argumentumokat a megfelelő processzorregiszterekbe másolja, majd kiadja a megfelelő Linux rendszerhívást. Amikor adatok érkeznek a hívásból, a csomagoló értelmezi az eredményeket, és következetesen visszaadja azokat a programnak.



A színfalak mögött

A program minden funkciója, amely kölcsönhatásba lép a rendszerrel, végül rendszerhívássá alakul. Ha ezt látni akarjuk, akkor kezdjünk egy alapvető példával.

üresfő-() {
}

Ez valószínűleg a legtriviálisabb C program, amit valaha látni fog. Egyszerűen átveszi az irányítást a fő belépési ponton keresztül, majd kilép. Még csak nem is ad vissza értéket, mivel a main érvénytelen. Mentse a fájlt ctest.c néven, és fordítsuk össze:

gcc ctest.c -a ctest

A fordítást követően a fájl mérete 8664 bájt. Ez kissé eltérhet a rendszeren, de 8k körül kell lennie. Ez sok kód csak a belépéshez és a kilépéshez! Ennek oka az, hogy a 8k az, hogy a libc futási ideje szerepel. Még akkor is, ha lecsupaszítjuk a szimbólumokat, még mindig egy kicsivel több mint 6 ezer.

Egy még egyszerűbb példában felhívhatjuk a Linux rendszert a kilépésre, és nem a C futási idő függvényében, hogy ezt megtegye helyettünk.

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

Itt áthelyezzük az 1 -et az EAX regiszterbe, töröljük az EBX regisztert (amely egyébként a visszatérési értéket tartalmazná), majd a Linux rendszerhívás megszakítását 0x80 -nak (vagy 128 -at tizedes) hívjuk. Ez a megszakítás arra készteti a kernelt, hogy feldolgozza a hívásunkat.

Ha összeállítjuk az új, asmtest.c nevű példánkat, és eltávolítjuk a szimbólumokat, és kizárjuk a szabványos könyvtárat:

gcc-s-nostdlib asmtest.c -o asmtest

1k -nál kisebb bináris számot készítünk (az én rendszeren 984 bájt ad ki). Ennek a kódnak a nagy része végrehajtható fejléc. Most a közvetlen Linux rendszerhívást hívjuk.

Minden gyakorlati célra

Szinte minden esetben soha nem kell közvetlen rendszerhívásokat kezdeményeznie a C programokban. Ha azonban az assembly nyelvet használja, szükség lehet rá. Az optimalizálás során azonban a legjobb lenne, ha a C könyvtár funkciói kezdeményeznék a rendszerhívásokat, és csak az Ön teljesítménykritikus kódja lenne beépítve az összeszerelési irányelvekbe.

Hogyan kell programozni a rendszerhívási oktatóanyagokat

Az összes rendszerhívás listája

Ha meg szeretné tekinteni a Linux számára elérhető összes rendszerhívás listáját, ellenőrizze ezeket a referenciaoldalakat: A rendszerhívások teljes listája a LinuxHint.com webhelyen, filippo.io/linux-syscall-table/ és vagy syscalls.kernelgrok.com