Systémové volání
Systémové volání (anglicky system call, syscall) je v informatice mechanismus používaný aplikacemi k volání funkcí operačního systému, který se používá u jader systému monolitického typu. Najdeme je u všech unixových systémů. Systémy Microsoft Windows mají hybridní jádro a používají meziprocesovou komunikaci prostřednictvím Windows API, kde programátor nerozlišuje mezi knihovní funkcí a využíváním služeb operačního systému.
Popis funkce
Moderní procesory umožňují spouštět procesy ve vlastním adresním prostoru (v rámci tzv. user space). Aplikační program může požadovat data nebo služby nabízené operačním systémem resp. jeho jádrem, které běží v jaderném prostoru (kernel space). Příkladem může být přístup k hardwarovým zařízením (grafická, síťová nebo zvuková karta) nebo komunikace s jinými procesy.
Nesprávné použití systémového volání (tj. nesprávný vstup do kódu jádra) by mohlo způsobit pád nebo poškození systému. Proces proto nemůže jednoduše skočit do kódu jádra na požadovanou rutinu, nýbrž musí využít systémové volání, které je tak jedinou možností, jak si proces může korektně službu jádra vyvolat.
Návrh architektury mikroprocesorů u prakticky všech moderních systémů proto nabízí několik privilegovaných úrovní:
- nižší privilegovaná úroveň, ve které jsou spouštěny aplikace, znemožňuje spouštěnému programu přístup nebo změnu operačního systému a ostatních procesů. Každá normální aplikace ale potřebuje komunikovat s okolním prostředím, to se děje pomocí volání operačního systému.
- vyšší privilegovaná úroveň, ve které běží operační systém. Operační systém nabízí aplikacím služby přístupné pomocí systémového volání, které jsou často implementovány pomocí přerušení. Pokud je to povoleno, tak systém vstoupí do vyššího privilegované úrovně, provede specifické úkony, které nemohl volající proces vykonat přímo, a vrátí se k vykonávání kódu v nižší privilegované úrovni. Tento koncept také zvyšuje bezpečnost.
S vývojem rozdílných operačních módů s různými privilegovanými úrovněmi tento mechanismus je potřeba k bezpečnému přenesení kontroly z nižších privilegovaných úrovní k vyšším úrovním. Méně privilegovaný kód nemůže změnit svojí privilegovanou úroveň na vyšší v libovolném bodě. Umožnění těchto změn by mohlo znamenat porušení bezpečnosti. Například by mohlo dojít ke spuštění privilegovaného kódu ve špatném pořadí.
Knihovna jako prostředník
Obvykle operační systém nabízí knihovnu, která zprostředkovává obyčejným programům přístup ke službám operačního systému, například glibc. Tato knihovna skrývá detaily předávání informací operačnímu systému, přepínání privilegovaného módu, provádí případné změny reprezentace dat, odstiňuje detaily operačního systému od programu a tím zvětšuje přenositelnost.
Implementace
Každé systémové volání má přiřazeno unikátní číslo. Toto číslo vloží knihovní funkce do registru a provede instrukci TRAP. Parametry se předávají přes zásobník, registr nebo tabulku; adresa se předává v registru nebo zásobníku.
Externí odkazy
- (anglicky) Linux system calls – systemové volání pro Linuxové jádro 2.2
- (anglicky) How System Calls Work on Linux/i86
- (anglicky) Sysenter Based System Call Mechanism in Linux 2.6
- (anglicky) Kernel command using Linux system calls – IBM developerWorks