Ugrás a tartalomhoz

system call

A Wikiszótárból, a nyitott szótárból


Főnév

system call (tsz. system calls)

  1. (informatika) rendszerhívás

A modern számítógépes rendszerek egyik alapvető építőeleme a system call, vagy magyarul rendszerhívás. Ez az a mechanizmus, amely lehetővé teszi, hogy a felhasználói programok (user space) kommunikáljanak az operációs rendszer (kernel space) szolgáltatásaival. A rendszerhívásokon keresztül történik például fájlok megnyitása, memóriafoglalás, folyamatok létrehozása vagy hálózati kommunikáció.



Mi az a system call?

A system call az operációs rendszer által biztosított funkciók elérésének szabványos módja. Mivel a felhasználói programok nem férhetnek hozzá közvetlenül a hardverhez vagy az operációs rendszer magjához (kernel), egy közvetett, ellenőrzött útra van szükség: ezt biztosítja a system call.

Például ha egy program egy fájlt akar megnyitni, akkor nem nyúlhat közvetlenül a fájlrendszerhez, hanem egy rendszerhívással kéri meg az operációs rendszert, hogy végezze el a feladatot.



A működés lépései

  1. A program rendszerhívást kér – meghív egy függvényt (pl. open(), read()).
  2. A rendszerhívás belép a kernel módba – CPU vált user módról kernel módra.
  3. Az operációs rendszer végrehajtja a kérést.
  4. Az eredményt visszaadja a felhasználói programnak.

Ez a folyamat garantálja, hogy a rendszer biztonságos, stabil és ellenőrzött módon működjön.



Példák rendszerhívásokra

Az alábbiakban néhány tipikus rendszerhívást mutatunk be a Linux operációs rendszer kontextusában (a C nyelvű POSIX API-n keresztül):

1. Fájlműveletek

  • open() – fájl megnyitása
  • read() – olvasás fájlból
  • write() – írás fájlba
  • close() – fájl lezárása
int fd = open("adat.txt", O_RDONLY);
char buffer[100];
read(fd, buffer, 100);
close(fd);

2. Folyamatkezelés

  • fork() – új folyamat létrehozása
  • exec() – másik program indítása
  • wait() – gyermekfolyamat befejeződésére vár
pid_t pid = fork();
if (pid == 0) {
    execl("/bin/ls", "ls", NULL);
} else {
    wait(NULL);
}

3. Memóriakezelés

  • mmap() – memória leképezése
  • brk() / sbrk() – heap memória kezelése

4. Hálózati kommunikáció

  • socket() – hálózati socket létrehozása
  • connect(), bind(), accept(), send(), recv() – socket műveletek



User space vs. kernel space

A számítógépes rendszerek biztonsága és stabilitása érdekében megkülönböztetünk:

  • User space: ahol a felhasználói alkalmazások futnak, korlátozott hozzáféréssel.
  • Kernel space: ahol az operációs rendszer fut, teljes hozzáféréssel a hardverhez.

A rendszerhívások a két világ közötti „kapuk”, amelyek szabályozzák az információáramlást.



Rendszerhívások implementálása

A rendszerhívások nem közvetlenül C-függvények, hanem általában egy wrapper függvény hívja meg őket (pl. a C szabványkönyvtár glibc biztosítja ezeket). A háttérben a kernelhívás rendszerregisztereken és megszakításokon (interrupt) keresztül történik.

Például Linuxon a read() függvény valójában a sys_read kernelhívást aktiválja egy int 0x80 vagy syscall gépi utasítással.



Miért szükséges a rendszerhívás?

  • Védelem: megakadályozza, hogy a programok közvetlenül manipulálják a hardvert.
  • Hozzáférés biztosítása: lehetővé teszi a jogosultságon alapuló hozzáférést a rendszererőforrásokhoz.
  • Erőforrás-kezelés: az operációs rendszer kontrollálja a fájlokat, folyamatokat, memóriát stb.
  • Konzisztencia: egységes, szabványosított módja a műveletek végrehajtásának.



System call táblázat

Minden operációs rendszer system call táblázatot használ, amely minden rendszerhívást egyedi azonosítóval lát el. Például Linuxon az open() rendszerhívás azonosítója 2 lehet, míg a read() az 0.

Ezeket az azonosítókat a kernel használja a megfelelő rendszerhívás végrehajtására.



Rendszerhívások hibakezelése

A rendszerhívások általában hibakóddal térnek vissza (pl. -1), és a errno globális változó segítségével megmondható, hogy pontosan mi volt a hiba oka. A fejlesztőknek mindig ellenőrizniük kell a visszatérési értékeket.

int fd = open("nincsilyen.txt", O_RDONLY);
if (fd == -1) {
    perror("Hiba a fájl megnyitásakor");
}

Teljesítmény és biztonság

  • A rendszerhívások lassabbak, mint a sima függvényhívások, mivel a user-kernel váltás CPU-szinten történik.
  • Viszont nélkülözhetetlenek a rendszer erőforrásainak védelme és kontrollált használata szempontjából.



Platformspecifikus megjegyzések

  • Linux: strace segédprogrammal lehet követni a rendszerhívásokat.
  • Windows: hasonló mechanizmus, de más API-kon keresztül, pl. CreateFile, ReadFile.
  • macOS: szintén POSIX-szabványokat követ, de saját rendszerhívás-rendszerrel.



Rendszerhívások és API

A system call az alacsony szintű interfész a kernel felé, míg a felhasználói API (pl. a C standard könyvtár) magasabb szintű, barátságosabb interfészt biztosít.

Például:

  • fopen() → belsőleg meghívja az open() rendszerhívást.
  • fprintf() → írás közben write() rendszerhívást használ.



Összefoglalás

A system call a modern operációs rendszerek egyik alapvető fogalma. Segítségével a felhasználói alkalmazások vezérelhetik a hardvert és az operációs rendszer szolgáltatásait, miközben az erőforrásokhoz való hozzáférés szabályozott és biztonságos marad. Bár a rendszerhívások technikaiak és alacsony szintűek, minden modern alkalmazás működése mögött ott vannak, akár közvetlenül, akár közvetve.