Systémová volání

Co je volání systému Linux?

Co je volání systému Linux?

Pěkně popořádku

Než se ponoříme do definice systémového volání systému Linux a prozkoumáme podrobnosti jeho provádění, 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 organizovat vše, co běží na počítači, včetně zpracování událostí na klávesnici, disku a v síti, až po časové úseky pro paralelní provádění více programů.

Když jádro spouští program na úrovni uživatele, virtualizuje paměťový prostor, takže programy věří, že jsou jediným procesem spuštěným v paměti. Tato ochranná bublina izolace hardwaru a softwaru zvyšuje zabezpečení a spolehlivost. Neprivilegovaná aplikace nemůže přistupovat 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.

Překonat bariéru se systémovými voláními systému Linux

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ětem by však programy nedokázaly dosáhnout ničeho.

Pro usnadnění interakce určuje jádro softwarovou bránu, která umožňuje spuštěnému programu požadovat, aby jádro jednalo jeho jménem. Toto rozhraní se nazývá systémové volání.

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

Oplatka-tenká balička

Ve většině aplikací se systémová volání neprovádějí přímo do jádra. Prakticky všechny programy odkazují na standardní knihovnu C, která poskytuje tenký, ale důležitý obal kolem systémových volání systému Linux. Knihovna zajistí, že jsou argumenty funkcí zkopírovány do správných registrů procesorů, a poté vydá odpovídající systémové volání systému Linux. Když jsou data přijata z hovoru, obálka interpretuje výsledky a konzistentním způsobem je vrací zpět do programu.

V zákulisí

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

void main ()

Toto je pravděpodobně nejvíce triviální program C, jaký kdy uvidíte. Jednoduše získá kontrolu přes hlavní vstupní bod a poté opustí. Nevrací ani hodnotu, protože main je definován jako neplatný. Uložte soubor jako ctest.ca pojďme to sestavit:

gcc ctest.c -o ctest

Jakmile je kompilován, můžeme vidět velikost souboru jako 8664 bajtů. Může se mírně lišit ve vašem systému, ale měl by být kolem 8k. To je spousta kódu jen pro vstup a výstup! Důvod, proč je to 8k, je ten, že je zahrnut běh libc. I když odstraníme symboly, je to stále něco přes 6k.

V ještě jednodušším příkladu můžeme zavolat systémové linuxové volání k ukončení, spíše než v závislosti na běhovém prostředí C, abychom to udělali za nás.

void _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í volání systému Linux 0x80 (nebo 128 v desítkové soustavě). Toto přerušení spouští jádro, aby zpracovalo náš hovor.

Pokud sestavíme náš nový příklad zvaný asmtest.c a odstranit symboly a vyloučit standardní knihovnu:

gcc -s -nostdlib asmtest.c -o zkouška

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

Pro všechny praktické účely

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

Jak programovat výukové programy pro systémová volání

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

Chcete-li zobrazit seznam všech dostupných systémových volání pro Linux, můžete zkontrolovat tyto referenční stránky: Úplný seznam systémových volání v systému Linux.com, filippo.io / linux-syscall-table / nebo syscalls.kernelgrok.com

Top 5 ergonomických produktů pro počítačové myši pro Linux
Způsobuje dlouhodobé používání počítače bolest zápěstí nebo prstů? Trpíte ztuhlými klouby a neustále si musíte třást ruce? Cítíte pálivou bolest pokaž...
Jak změnit nastavení myši a touchpadu pomocí Xinput v Linuxu
Většina linuxových distribucí je ve výchozím nastavení dodávána s knihovnou „libinput“ pro zpracování vstupních událostí v systému. Může zpracovávat v...
Přemapujte tlačítka myši odlišně pro jiný software pomocí ovládání myší X-Mouse
Možná potřebujete nástroj, který by mohl změnit ovládání myši u každé aplikace, kterou používáte. V takovém případě můžete vyzkoušet aplikaci s názvem...