Rendszerhívások

Mi az a Linux rendszerhívás?

Mi az a Linux rendszerhívás?

Először is

Mielőtt elmélyednénk egy 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önféle szoftverrétegeinek meghatározásával kezdjük.

A Linux kernel egy speciális program, amely a hardveren elérhető legalacsonyabb szinten indul és fut. Feladata a számítógépen futó összes hangszerelése, ideértve a billentyűzet, a lemez és a hálózati események kezelését, az időszeletek biztosításával több program párhuzamos futtatásához.

Amikor a kern egy felhasználói szintű programot hajt végre, akkor virtualizálja a memóriaterületet, így a programok azt hiszik, hogy ők az egyetlen folyamat a memóriában. A hardver és szoftver elszigetelésének ez a védőbuborékja növeli a biztonságot és a megbízhatóságot. Egy kiváltságtalan alkalmazás nem tud hozzáférni más programokhoz tartozó memóriához, és ha ez a program összeomlik, a kernel leáll, így nem károsíthatja a rendszer többi részét.

Az akadály megszakítása Linux rendszerhívásokkal

Ez a kiváltságtalan alkalmazások közötti elszigeteltség kiváló határt nyújt a rendszer többi alkalmazásának és felhasználójának védelmében. Azonban a számítógép és a külvilág többi elemével való interakció valamilyen módja nélkül a programok nem képesek sok minden megvalósítására.

Az interakció megkönnyítése érdekében a kern kijelöl egy szoftverkaput, amely lehetővé teszi a futó program számára, hogy kérje a kernelt a nevében. Ezt az interfészt rendszerhívásnak nevezik.

Mivel a Linux a „minden fájl” UNIX filozófiáját követi, sok funkció elvégezhető egy fájl megnyitásával, olvasásával vagy írásával, amely eszköz lehet. Windows rendszeren például használhatja a CryptGenRandom nevű függvényt a véletlenszerű bájtok eléréséhez. De Linuxon ezt megtehetjük úgy, hogy egyszerűen megnyitjuk a „file” / dev / urandom fájlt, és bájtokat olvasunk belőle standard fájlbemeneti / kimeneti rendszerhívások segítségével. Ez a döntő különbség egyszerűbb rendszerhívási felületet tesz lehetővé.

Ostya-vékony burkoló

A legtöbb alkalmazásban a rendszerhívások nem közvetlenül a kernelre érkeznek. Gyakorlatilag az összes program összekapcsolódik a standard C könyvtárban, amely vékony, de fontos burkolatot biztosít a Linux rendszer hívásai köré. A könyvtár gondoskodik arról, hogy a függvény argumentumok átkerüljenek a helyes processzorregiszterekbe, majd kiadja a megfelelő Linux rendszerhívást. Amikor adatokat kap a hívásból, a csomagoló értelmezi az eredményeket, és következetes módon visszaküldi a programnak.

A színfalak mögött

A program minden olyan funkciója, amely interakcióba lép a rendszerrel, végül rendszerhívássá válik. Ahhoz, hogy ezt működésben lássuk, kezdjünk egy alapvető példával.

void main ()

Ez valószínűleg a legtriviálisabb C program, amelyet valaha is látni fog. Egyszerűen megszerzi az irányítást a fő belépési ponton keresztül, majd kilép. Nem is ad vissza értéket, mivel a mainot érvénytelennek definiálják. Mentse a fájlt ctestként.c és állítsuk össze:

gcc ctest.c -o ctest

A fordítás után 8664 bájt fájlméretet láthatunk. Ez kissé eltérhet a rendszerétől, de kb. 8k körül kell lennie. Ez sok kód csak a belépéshez és a kilépéshez! A 8k oka az, hogy a libc futásideje szerepel benne. Még ha lepucoljuk is a szimbólumokat, akkor is 6k felett van.

Egy még egyszerűbb példában felhívhatjuk a Linux rendszert a kilépéshez, nem pedig a C futási időtől függően, hogy ezt nekünk tegyük.

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

Itt áthelyezünk 1-et az EAX regiszterbe, kitisztítjuk az EBX regisztert (amely egyébként tartalmazná a visszatérési értéket), majd hívjuk meg a Linux rendszer hívásmegszakítását 0x80 (vagy 128 tizedesjegyig). Ez a megszakítás indítja a kernelt a hívásunk feldolgozására.

Ha összeállítjuk új, asmtest nevű példánkat.c, és távolítsa el a szimbólumokat, és zárja ki a szokásos könyvtárat:

gcc -s -nostdlib asmtest.c -o asmtest

1k-nál kisebb bináris értéket állítunk elő (a rendszeremen 984 bájtot ad). Ennek a kódnak a nagy része futtatható fejlécek. Most felhívjuk a közvetlen Linux rendszerhívást.

Minden gyakorlati célra

Szinte minden esetben soha nem kell közvetlen rendszerhívást kezdeményeznie a C programjaiban. Ha azonban összeállítási nyelvet használ, felmerülhet az igény. Az optimalizálás során azonban az lenne a legjobb, ha hagynánk, hogy a C könyvtár függvények kezdeményezzék a rendszer hívásait, és csak a teljesítménykritikus kódot ágyazzák be az összeszerelési irányelvekbe.

A rendszerhívás-oktatóanyagok programozása

Az összes rendszerhívás listája

Ha meg szeretné tekinteni az összes rendelkezésre álló Linux-rendszerhívást, akkor ellenőrizze ezeket a hivatkozási oldalakat: A Linux-rendszerhívások teljes listájaHint.com, filippo.io / linux-syscall-table / és vagy syscalls.kernelgrok.com

Az FPS-számláló megjelenítése a Linux-játékokban
A Linux játék komoly lendületet kapott, amikor a Valve 2012-ben bejelentette a Linux támogatását a Steam kliensnek és játékaiknak. Azóta sok AAA és in...
Sid Meier Civilization VI letöltése és lejátszása Linuxon
Bevezetés a játékba A Civilization 6 egy modern felvétel a Age of Empires játékok sorozatában bevezetett klasszikus koncepcióra. Az ötlet meglehetősen...
A Doom telepítése és lejátszása Linuxon
Bevezetés a Doom-ba A Doom sorozat a 90-es években keletkezett az eredeti Doom megjelenése után. Azonnali sláger volt, és ettől kezdve a játéksorozat ...