Co je to systémové volání Linuxu?

What Is Linux System Call



Než se ponoříme do definice systémového volání Linuxu a prozkoumáme podrobnosti o jeho provedení, je nejlepší začít s definováním různých softwarových vrstev typického systému Linux.

Linuxové jádro je specializovaný program, který se spouští a běží na nejnižší dostupné úrovni vašeho hardwaru. Má za úkol zorganizovat vše, co běží na počítači, včetně zpracování událostí klávesnice, disku a sítě, a poskytovat časové úseky pro paralelní spouštění více programů.







Když jádro spustí program na úrovni uživatele, virtualizuje paměťový prostor, takže programy věří, že jsou jediným procesem běžícím v paměti. Tato ochranná bublina izolace hardwaru a softwaru zvyšuje bezpečnost a spolehlivost. Neprivilegovaná aplikace nemůže získat přístup k paměti patřící jiným programům a pokud tento program spadne, jádro se ukončí, aby nemohlo poškodit zbytek systému.



Breeching the Barrier with Linux System calls

Tato vrstva izolace mezi neprivilegovanými aplikacemi poskytuje vynikající hranici pro ochranu ostatních aplikací a uživatelů v systému. Bez nějakého způsobu propojení s ostatními prvky v počítači a vnějším světě by však programy nebyly schopny dosáhnout ničeho.



Pro usnadnění interakce jádro označuje softwarovou bránu, která umožňuje běžícímu programu požadovat, aby jádro jednalo jeho jménem. Toto rozhraní je známé jako systémové volání.





Protože Linux dodržuje filozofii UNIX, vše je soubor, mnoho funkcí lze provádět otevřením a čtením nebo zápisem do souboru, což může být zařízení. V systému Windows můžete například použít funkci nazvanou CryptGenRandom pro přístup k náhodným bytům. Ale v Linuxu to lze provést jednoduše otevřením souboru/dev/urandom a načtením bajtů z něj pomocí standardních systémových volání vstupu/výstupu souboru. Tento zásadní rozdíl umožňuje jednodušší rozhraní systémových volání.

Obal na tenké plátky

Ve většině aplikací nejsou systémová volání prováděna přímo do jádra. Prakticky všechny programy jsou propojeny ve standardní knihovně C, která poskytuje tenký, ale důležitý obal kolem systémových volání Linuxu. Knihovna zajistí, aby byly argumenty funkcí zkopírovány do správných registrů procesorů, a poté vydá odpovídající systémové volání Linuxu. Když jsou data přijata z volání, modul wrapper interpretuje výsledky a vrátí je zpět do programu konzistentním způsobem.



V zákulisí

Každá funkce v programu, která interaguje se systémem, je nakonec převedena do systémového volání. Abychom to viděli v akci, začněme základním příkladem.

prázdnéhlavní() {
}

Toto je pravděpodobně nejtriviálnější program C, jaký kdy uvidíte. Jednoduše získá kontrolu přes hlavní vstupní bod a poté skončí. Nevrací ani hodnotu, protože main je definován jako neplatný. Uložte soubor jako ctest.c a pojďme jej zkompilovat:

gcc ctest.C -ctest

Jakmile je zkompilován, vidíme velikost souboru 8664 bytů. Ve vašem systému se to může mírně lišit, ale mělo by to být kolem 8 kB. To je spousta kódu jen pro vstup a výstup! Důvodem, proč je to 8k, je to, že je zahrnut běhový modul libc. I když odstraníme symboly, stále je to něco málo přes 6 tis.

V ještě jednodušším příkladu můžeme zavolat systémové volání Linuxu, aby skončilo, a ne v závislosti na době běhu C.

prázdné_Start() {
asm('movl $ 1,%eax;'
'xorl %ebx, %ebx;'
'int $ 0x80');
}

Zde přesuneme 1 do registru EAX, vymažeme registr EBX (který by jinak obsahoval návratovou hodnotu) a poté zavoláme přerušení systémového volání Linuxu 0x80 (nebo 128 v desítkové soustavě). Toto přerušení spustí jádro ke zpracování našeho hovoru.

Pokud zkomplikujeme náš nový příklad s názvem asmtest.c a odstraníme symboly a vyloučíme standardní knihovnu:

gcc-s-nostdlib asmtest.C -o asmtest

vyrobíme binární soubor menší než 1 kB (v mém systému to dává 984 bajtů). Většina tohoto kódu jsou spustitelné hlavičky. Nyní voláme přímé systémové volání Linuxu.

Pro všechny praktické účely

Téměř ve všech případech nebudete muset ve svých programech C provádět přímé systémové hovory. Pokud však používáte jazyk sestavení, může to nastat. Při optimalizaci by však bylo nejlepší nechat funkce knihovny C provádět systémová volání a mít v direktivách sestavení vložen pouze váš kritický kód.

Jak naprogramovat návody na volání systému

Seznam všech systémových volání

Pokud chcete zobrazit seznam všech dostupných systémových volání pro Linux, můžete se podívat na tyto referenční stránky: Úplný seznam systémových volání na LinuxHint.com, filippo.io/linux-syscall-table/ a nebo syscalls.kernelgrok.com