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.
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.
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.
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.
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.
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 öt nagy kategóriába sorolhatók:
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:
Az operációs rendszerek szempontjai | |||||
---|---|---|---|---|---|
| |||||
Típusok |
| ||||
Sejtmag |
| ||||
Folyamatmenedzsment _ |
| ||||
Memóriakezelés és címzés | |||||
Betöltési és inicializálási eszközök | |||||
Héj | |||||
Egyéb | |||||
Kategória Wikimedia Commons Wikikönyvek Wikiszótár |