Rendszerhívás

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. június 17-én felülvizsgált verziótól ; az ellenőrzésekhez 10 szerkesztés szükséges .

A rendszerhívás ( eng.  system call ) a programozásban és számítástechnikában  egy olyan alkalmazási program , amely meghívja az operációs rendszer kernelt valamilyen művelet végrehajtására.

A modern operációs rendszerek (OS) biztosítják az idő megosztását a futó számítási folyamatok között (multitasking) és a hatáskörök szétválasztását , ami megakadályozza, hogy a végrehajtható programok hozzáférjenek más programok és berendezések adataihoz. Az operációs rendszer kernel a processzor privilegizált üzemmódjában fut . Folyamatközi vagy hardver hozzáférést igénylő művelet végrehajtásához a program meghívja a kernelt, amely a hívó folyamat engedélyeitől függően végrehajtja vagy megtagadja az ilyen hívást.

A programozó szemszögéből a rendszerhívás általában úgy néz ki, mint egy szubrutin vagy függvény hívása egy rendszerkönyvtárból . A rendszerhívást azonban, mint egy ilyen függvény vagy szubrutin meghívásának speciális esetét, meg kell különböztetni a rendszerkönyvtár általánosabb hívásától, mivel ez utóbbihoz nem szükséges privilegizált műveletek végrehajtása.

Kiváltságok

A modern processzorok architektúrája lehetővé teszi a védett mód használatát több szintű jogosultsággal: az alkalmazások általában a címterükre korlátozódnak oly módon, hogy nem tudnak hozzáférni vagy módosítani az operációs rendszeren futó más alkalmazásokat vagy magát az operációs rendszert, és általában nem tud közvetlenül hozzáférni a rendszererőforrásokhoz (merevlemezekhez, videokártyákhoz, hálózati eszközökhöz stb.).

A rendszererőforrásokkal való interakcióhoz az alkalmazások rendszerhívásokat használnak, amelyek lehetővé teszik az operációs rendszer számára, hogy biztonságosan hozzáférjen hozzájuk. A rendszerhívások átadják az irányítást az operációs rendszer kernelének, amely meghatározza, hogy a kért erőforrásokat megadja-e az alkalmazásnak. Ha rendelkezésre állnak erőforrások, a kernel végrehajtja a kért műveletet, majd visszaadja a vezérlést az alkalmazásnak.

Rendszerhívás interfész

A rendszerhívások közvetlen végrehajtásához a syscall funkció elérhető a sys/syscall.h Linux kernel fejlécfájljában . A Linux rendszerhívási táblázat dokumentált, és a Linux API része.

Windows NT rendszeren a rendszerhívási felület az ntdll.dll könyvtárban található Native API része ; ez egy dokumentálatlan API, amelyet a szokásos Windows API implementációi használnak, és néhány Windows rendszeralkalmazás közvetlenül használ.

Középfokú könyvtár

A rendszer általában egy könyvtárat vagy API -t biztosít , amely egy normál alkalmazás és az operációs rendszer között helyezkedik el. Egy ilyen könyvtár kényelmes felületet biztosít a programozó számára az operációs rendszerrel való munkavégzéshez interfész funkciók formájában. A könyvtár interfész funkciói a szokásos függvényhívási konvenciókat biztosítják a rendszerhívások használatához, és egységesebbé teszik a rendszerhívásokat. Egy függvény meghívása egy ilyen könyvtárban önmagában nem okoz kernel módba váltást, és egy normál szubrutinhívás.

Példák és eszközök

Unix , Unix - szerű és más POSIX -kompatibilis operációs rendszereken a népszerű rendszerhívások a következők: open, read, write, close, wait, exec, fork, exités kill. Sok modern operációs rendszer több száz rendszerhívást tartalmaz. Például a Linuxnak és az OpenBSD - nek körülbelül 380 különböző hívása van [1] [2] , a NetBSD -nek körülbelül 500 [3] , a FreeBSD -nek több mint 500 [4] , míg a 9-es tervnek 51. [5]

Az olyan eszközök, mint a strace , sysdig és a truss a folyamat kezdetétől figyelik a folyamat végrehajtását, és kinyomtatják a folyamat összes rendszerhívását, vagy kapcsolódhatnak egy már futó folyamathoz, és elfoghatják az adott folyamat által kezdeményezett összes rendszerhívást. mindaddig, amíg a műveletek nem sértik a felhasználói engedélyeket.

Tipikus megvalósítások

A rendszerhívások megvalósítása megköveteli az irányítás átadását, amely magában foglal néhány architektúra-specifikus részletet. Megvalósításának klasszikus módja a megszakítások (megszakítás, csapda) alkalmazása. Megszakítja az átviteli vezérlést az operációs rendszer kernel felé, miközben az alkalmazásnak be kell írnia a rendszerhívás számát és a szükséges argumentumokat bizonyos processzorregiszterekbe, és végre kell hajtania a szoftver megszakítás generálási utasítását.

Sok RISC processzor esetében ez az egyetlen mód, de a CISC architektúrák (beleértve a széles körben használt x86 és x86 64 ) további módszereket is tartalmaznak. Például a SYSCALL/SYSRET vagy a SYSENTER/SYSEXIT speciális utasítások (ezt a két mechanizmust az AMD és az Intel egymástól függetlenül fejlesztette ki, de lényegében ugyanazokat a funkciókat látja el). Ezek „gyors” átviteli utasítások, amelyek célja, hogy megszakítás nélkül átadják a vezérlést az operációs rendszernek a rendszerhívásokhoz.

A rendszerhívások kategóriái

A rendszerhívások öt nagy kategóriába sorolhatók:

  1. Folyamatmenedzsment
    • Betöltés
    • végrehajtani
    • vége (kilépés), megszakítás
    • folyamat létrehozása ( forkUnix-szerű, NtCreateProcessWindows_NT Native API -ban )
    • folyamat leállítása
    • folyamatattribútumok beszerzése/beállítása
    • várakozási idő, események , jelesemények
    • lefoglalni , felszabadítani a memóriát
  2. Fájlokkal való munka
    • fájl létrehozása, fájl törlése
    • nyit zár
    • olvasni, írni, áthelyezni
    • fájlattribútumok beszerzése/beállítása
  3. Eszköz kezelés
    • készülék kérése, eszköz kioldása
    • olvasni, írni, áthelyezni
    • eszközattribútumok beszerzése/beállítása
    • logikusan csatlakoztatja vagy leválasztja az eszközöket
  4. Információkkal való munka
    • idő vagy dátum lekérése/beállítása
    • rendszeradatok beszerzése/beállítása
    • folyamat-, fájl- vagy eszközattribútumok beszerzése/beállítása
  5. Kommunikáció, kommunikáció
    • kommunikációs kapcsolat létrehozása, törlése
    • üzeneteket küldeni, fogadni
    • állapotinformációk átvitele
    • távoli eszközök csatlakoztatása vagy leválasztása

Processzor mód és környezetváltás

A Unix-szerű rendszerek rendszerhívásait a rendszer kernel módban kezeli, ami a processzor végrehajtási módját egy privilegizáltabbra emeli , de a folyamatkörnyezet módosítása nem szükséges - azonban a jogosultsági kontextus megváltozik. A rendszererőforrások a processzorregiszter állapotán alapuló végrehajtási módban működnek, a folyamatok pedig egyfajta absztrakciót jelentenek az operációs rendszer által. A rendszerhívás általában nem igényel kontextusváltást egy másik folyamatra, éppen ellenkezőleg, annak a folyamatnak a kontextusában hajtódik végre, amelyik meghívta.

A többszálú folyamatokban a rendszerhívások különböző szálakból származhatnak . Az ilyen rendszerhívások kezelése teljes mértékben az operációs rendszer architektúrájától függ. Az alábbiak a kernelek által használt tipikus modellek:

Jegyzetek

  1. syscalls(2) - Linux kézikönyv oldal . Letöltve: 2015. április 10. Az eredetiből archiválva : 2020. január 15.
  2. OpenBSD. Rendszerhívási nevek (kern/syscalls.c) . BSD kereszthivatkozás (2013. szeptember 14.). Letöltve: 2015. április 10. Az eredetiből archiválva : 2014. december 3..
  3. NetBSD. Rendszerhívási nevek (kern/syscalls.c) . BSD kereszthivatkozás (2013. október 17.). Letöltve: 2015. április 10. Az eredetiből archiválva : 2015. február 2..
  4. FreeBSD syscalls.c, a syscall nevek és azonosítók listája . Letöltve: 2015. április 10. Az eredetiből archiválva : 2013. május 30.
  5. Plan 9 sys.h, a syscall nevek és azonosítók listája . Letöltve: 2015. április 10. Az eredetiből archiválva : 2015. február 16..

Linkek