Čo je to systémové volanie systému Linux?

What Is Linux System Call



Predtým, ako sa ponoríme do definície systémového volania systému Linux a preskúmame podrobnosti o jeho vykonaní, je najlepšie začať s definovaním rôznych softvérových vrstiev typického systému Linux.

Linuxové jadro je špecializovaný program, ktorý sa spúšťa a beží na najnižšej dostupnej úrovni vášho hardvéru. Jeho úlohou je zorganizovať všetko, čo beží na počítači, vrátane obsluhy udalostí klávesnice, disku a siete, a poskytnúť časové úseky na paralelné spustenie viacerých programov.







Keď jadro spustí program na úrovni používateľa, virtualizuje pamäťový priestor, takže programy veria, že sú jediným procesom, ktorý beží v pamäti. Táto ochranná bublina izolácie hardvéru a softvéru zvyšuje bezpečnosť a spoľahlivosť. Neprivilegovaná aplikácia nemôže získať prístup k pamäti patriacej iným programom a ak tento program zlyhá, jadro sa ukončí, aby nemohlo poškodiť zvyšok systému.



Zastavenie bariéry pomocou systémových hovorov systému Linux

Táto vrstva izolácie medzi neprivilegovanými aplikáciami poskytuje vynikajúcu hranicu na ochranu ostatných aplikácií a používateľov v systéme. Bez nejakého spôsobu prepojenia s inými prvkami v počítači a vonkajšom svete by programy nedokázali dosiahnuť veľa.



Na uľahčenie interakcie jadro označuje softvérovú bránu, ktorá umožňuje spustenému programu požiadať, aby jadro konalo v jeho mene. Toto rozhranie je známe ako systémové volanie.





Pretože Linux dodržiava filozofiu UNIXu, všetko je súbor, mnoho funkcií je možné vykonávať otvorením a čítaním alebo zápisom do súboru, ktorým môže byť zariadenie. V systéme Windows napríklad môžete na prístup k náhodným bajtom použiť funkciu s názvom CryptGenRandom. Ale v systéme Linux to možno urobiť jednoduchým otvorením súboru/dev/urandom a načítaním bajtov z neho pomocou štandardných systémových hovorov pre vstup/výstup súborov. Tento zásadný rozdiel umožňuje jednoduchšie rozhranie systémových hovorov.

Oblátka-tenký obal

Vo väčšine aplikácií sa systémové hovory neuskutočňujú priamo do jadra. Prakticky všetky programy sú prepojené so štandardnou knižnicou C, ktorá poskytuje tenký, ale dôležitý obal okolo systémových hovorov Linuxu. Knižnica zaistí, že sa funkčné argumenty skopírujú do správnych registrov procesora, a potom vydá zodpovedajúce systémové volanie systému Linux. Keď sú z hovoru prijaté údaje, modul wrapper interpretuje výsledky a konzistentným spôsobom ich vráti späť do programu.



V zákulisí

Každá funkcia v programe, ktorá interaguje so systémom, sa nakoniec prevedie na systémové volanie. Aby sme to videli v praxi, začnime základným príkladom.

prázdnyHlavná() {
}

Toto je pravdepodobne najtriviálnejší program C, aký kedy uvidíte. Jednoducho získa kontrolu prostredníctvom hlavného vstupného bodu a potom skončí. Nevracia ani hodnotu, pretože main je definovaný ako neplatný. Uložte súbor ako ctest.c a zostavme ho:

gcc ctest.c -ctest

Akonáhle je kompilovaný, vidíme veľkosť súboru 8664 bajtov. Vo vašom systéme sa môže mierne líšiť, ale malo by byť asi 8 kB. To je veľa kódu na zadanie a ukončenie! Dôvodom, prečo je to 8 kB, je to, že je zahrnutý runtime libc. Aj keď odstránime symboly, stále je to niečo cez 6 000.

V ešte jednoduchšom príklade môžeme nechať systémové volanie Linuxu skončiť, nie v závislosti od runtime C, ktoré to urobí za nás.

prázdny_start() {
asm('movl $ 1,%eax;'
'xorl %ebx, %ebx;'
„int $ 0x80“);
}

Tu presunieme 1 do registra EAX, vyčistíme register EBX (ktorý by inak obsahoval návratovú hodnotu) a potom zavoláme prerušenie systémového hovoru Linux 0x80 (alebo 128 v desatinnom čísle). Toto prerušenie spustí jadro, aby spracovalo náš hovor.

Ak zostavíme náš nový príklad s názvom asmtest.c a odstránime symboly a vylúčime štandardnú knižnicu:

gcc-s-nostdlib asmtest.c -o asmtest

vytvoríme binárku menšiu ako 1 kB (v mojom systéme to poskytne 984 bajtov). Väčšina tohto kódu sú spustiteľné hlavičky. Teraz voláme priame systémové volanie systému Linux.

Na všetky praktické účely

Takmer vo všetkých prípadoch nebudete vo svojich programoch C musieť nikdy uskutočňovať priame systémové hovory. Ak však používate jazyk zostavy, môže to nastať. Pri optimalizácii by však bolo najlepšie nechať funkcie knižnice C uskutočňovať systémové hovory a mať v smerniciach o zostavení vložený iba váš kritický kód.

Ako naprogramovať návody na systémové volanie

Zoznam všetkých systémových hovorov

Ak chcete vidieť zoznam všetkých dostupných systémových hovorov pre Linux, môžete sa pozrieť na tieto referenčné stránky: Úplný zoznam systémových volaní na LinuxHint.com, filippo.io/linux-syscall-table/ a alebo syscalls.kernelgrok.com