Prvé veci ako prvé
Predtým, ako sa ponoríme do definície systémového volania systému Linux a preskúmame podrobnosti jeho vykonania, je najlepšie začať s definíciou rôznych softvérových vrstiev typického systému Linux.
Linuxové jadro je špecializovaný program, ktorý sa na vašom hardvéri spúšťa a spúšťa na najnižšej dostupnej úrovni. Má za úlohu orchestrovať všetko, čo na počítači beží, vrátane spracovania udalostí na klávesnici, disku a v sieti, až po časové úseky na paralelné vykonávanie viacerých programov.
Keď jadro vykoná program na úrovni používateľa, virtualizuje pamäťový priestor, takže programy veria, že sú jediným procesom bežiacim 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 dôjde k jej zlyhaniu, jadro sa ukončí, aby nemohlo poškodiť zvyšok systému.
Prekročenie bariéry systémovými hovormi systému Linux
Táto vrstva izolácie medzi neprivilegovanými aplikáciami poskytuje vynikajúce hranice na ochranu ostatných aplikácií a používateľov v systéme. Bez nejakého spôsobu prepojenia s ostatnými prvkami v počítači a vonkajšom svete by však programy nedokázali dosiahnuť nič.
Na uľahčenie interakcie jadro označuje softvérovú bránu, ktorá umožňuje spustenému programu požadovať, aby jadro konalo v jeho mene. Toto rozhranie je známe ako systémové volanie.
Pretože Linux sa riadi filozofiou systému UNIX „všetko je súbor“, mnoho funkcií sa dá vykonať otvorením a čítaním alebo zápisom do súboru, ktorým by mohlo byť zariadenie. Napríklad v systéme Windows môžete na prístup k náhodným bajtom použiť funkciu s názvom CryptGenRandom. Ale v Linuxe 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 vstupných / výstupných systémových volaní. Tento zásadný rozdiel umožňuje jednoduchšie rozhranie pre volanie systému.
Obal na tenké oblátky
Vo väčšine aplikácií sa systémové volania nevykonávajú priamo do jadra. Prakticky všetky programy odkazujú na štandardnú knižnicu C, ktorá poskytuje tenký, ale dôležitý obal okolo systémových hovorov systému Linux. Knižnica zabezpečí, aby sa argumenty funkcie skopírovali do správnych registrov procesora, a potom vydá príslušné systémové volanie systému Linux. Keď sú údaje prijaté z hovoru, obálka interpretuje výsledky a konzistentným spôsobom ich vracia 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.
void main ()Toto je pravdepodobne najtriviálnejší program C, aký kedy uvidíte. Jednoducho získa kontrolu cez hlavný vstupný bod a potom vystúpi. Nevracia ani hodnotu, pretože main je definované ako neplatné. Uložte súbor ako test.ca poďme to zostaviť:
gcc ctest.c -o ctestPo zostavení môžeme vidieť veľkosť súboru ako 8664 bajtov. Vo vašom systéme sa môže mierne líšiť, ale malo by to byť okolo 8 tis. To je veľa kódu iba na vstup a výstup! Dôvodom je 8k je to, že je zahrnutý runtime libc. Aj keď symboly odstránime, stále je to len niečo cez 6k.
V ešte jednoduchšom príklade môžeme urobiť, aby systém Linux volal po ukončení, než aby sme to robili za nás, v závislosti od runtime C.
void _start ()asm ("movl $ 1,% eax;"
„xorl% ebx,% ebx;“
„int $ 0x80“);
Tu presunieme 1 do registra EAX, vymažeme register EBX (ktorý by inak obsahoval návratovú hodnotu), potom zavoláme prerušenie hovoru systému Linux 0x80 (alebo 128 v desatinnom čísle). Toto prerušenie spustí jadro spracovať náš hovor.
Keby sme zostavili náš nový príklad zvaný asmtest.c a vyradiť symboly a vylúčiť štandardnú knižnicu:
gcc -s -nostdlib asmtest.c -o asmtestvyprodukujeme binárny súbor menší ako 1 kB (v mojom systéme to dá 984 bajtov). Väčšinu tohto kódu tvoria 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 už nebudete musieť vo svojich programoch C uskutočňovať priame systémové volania. Ak však použijete montážny jazyk, môže vzniknúť potreba. V rámci optimalizácie by však bolo najlepšie nechať funkcie knižnice C uskutočňovať systémové volania a mať v smerniciach zostavy zabudovaný iba váš kritický výkonový kód.
Ako programovať výukové programy pre systémové volania
- Spustiť systémové volanie
- Systémové volanie vidlice
- Systémové volanie Stat
Zoznam všetkých systémových volaní
Ak si chcete pozrieť zoznam všetkých dostupných systémových volaní pre systém Linux, môžete skontrolovať tieto referenčné stránky: Celý zoznam systémových volaní pre systém Linux.com, filippo.io / linux-syscall-table / alebo syscalls.kernelgrok.com