GNU/Linux >> Znalost Linux >  >> Linux

Co jsou systémová volání a funkce knihovny Linuxu?

Počítačový software je vyvíjen za účelem automatizace některých úkolů nebo řešení některých problémů. Ať tak či onak, software dosáhne cíle pomocí logiky, kterou píše vývojář tohoto softwaru. Každá logika vyžaduje některé služby, jako je výpočet délky řetězce, otevření souboru atd. Standardní služby zajišťují některé funkce nebo volání, které jsou poskytovány pouze pro tento účel.

Stejně jako pro výpočet délky řetězce existuje existuje standardní funkce jako strlen(), pro otevření souboru existují funkce jako open() a fopen(). Tyto funkce nazýváme standardními funkcemi, protože je může používat jakákoli aplikace.

Tyto standardní funkce lze rozdělit do dvou hlavních kategorií:

  1. Volání funkcí knihovny.
  2. Volání systémových funkcí.

V tomto článku se pokusíme diskutovat o konceptu, který stojí za voláním systému a knihoven, ve formě různých bodů a kdykoli to bude potřeba, uvedu rozdíl mezi těmito dvěma.

1. Funkce knihovny versus systémová volání

Funkce, které jsou součástí standardní knihovny C, jsou známé jako funkce knihovny. Například standardní funkce pro manipulaci s řetězci jako strcmp(), strlen() atd. jsou všechny funkce knihovny.

Funkce, které mění režim provádění programu z uživatelského režimu na režim jádra, jsou známé jako systémová volání. Tato volání jsou vyžadována v případě, že některé služby jsou vyžadovány programem od jádra. Pokud například chceme změnit datum a čas systému nebo pokud chceme vytvořit síťový soket, pak tyto služby může poskytovat pouze jádro, a proto tyto případy vyžadují systémová volání. Například socket() je systémové volání.

2. Proč potřebujeme systémová volání?

Systémová volání fungují jako vstupní bod do jádra OS. Existují určité úlohy, které lze provést pouze v případě, že proces běží v režimu jádra. Příklady těchto úloh mohou být interakce s hardwarem atd. Takže pokud chce proces provádět takový druh úlohy, pak by vyžadoval, aby běžel v režimu jádra, což umožňují systémová volání.

3. Typy knihovních funkcí

Knihovní funkce mohou být dvou typů:

  • Funkce, které nevolají žádné systémové volání.
  • Funkce, které provádějí systémové volání.

Existují funkce knihovny, které neprovádějí žádné systémové volání. Do této kategorie spadají například funkce pro manipulaci s řetězci jako strlen() atd. Existují také knihovní funkce, které dále provádějí systémová volání, například funkce fopen(), což je standardní knihovní funkce, ale interně používá volání systému open().

4. Interakce mezi komponentami

Následující diagram znázorňuje, jak se funkce knihovny, systémová volání a kód aplikace vzájemně ovlivňují.


Z výše uvedeného diagramu je zřejmé, že kód aplikace může interagovat s funkcemi knihovny nebo systémovými voláními. Knihovní funkce může také volat systémové funkce zevnitř. Ale pouze systémová volání mají přístup k jádru, které dále může přistupovat k počítačovému hardwaru.

5. fopen() vs open()

Někteří z nás mohou namítat, že proč máme dvě funkce pro stejnou operaci, tj. otevření souboru?

No, odpovědí na to je fakt, že fopen() je knihovní funkce, která poskytuje I/O služby s vyrovnávací pamětí pro otevření souboru, zatímco open() je systémové volání, které poskytuje I/O služby bez vyrovnávací paměti. Ačkoli je funkce open() k dispozici také pro aplikace, ale aplikace by se ji neměla přímo používat.

Obecně platí, že pokud existuje funkce knihovny odpovídající systémovému volání, pak by aplikace měly funkci knihovny používat, protože:

  • Funkce knihovny jsou přenosné, což znamená, že aplikace využívající standardní knihovní funkce poběží na všech systémech. Zatímco na druhé straně aplikace spoléhající na odpovídající systémové volání nemusí běžet na každém systému, protože rozhraní systémových volání se může systém od systému lišit.
  • Odpovídající knihovní funkce někdy snižuje zatížení systémových volání, což má za následek méně časté přepínání z uživatelského režimu do režimu jádra. Pokud například existuje aplikace, která velmi často čte data ze souboru, pak by použití fread() místo read() poskytlo I/O s vyrovnávací pamětí, což znamená, že ne každé volání fread() by mělo za následek volání systémového volání read. (). Funkce fread() může číst větší část dat (než vyžaduje uživatel) najednou, a proto následující funkce fread() nebude vyžadovat volání systémové funkce read().

6. Je malloc() systémové volání?

Toto je jedna z velmi populárních mylných představ, které lidé mají. Ujasněme si, že malloc() není systémové volání. Volání funkce malloc() je volání funkce knihovny, které dále používá systémové volání brk() nebo sbrk() pro alokaci paměti.

7. Systémová volání :Přepínání režimů provádění

Tradičně se používal mechanismus zvýšení přerušení „int $0x80“ do jádra. Po zachycení přerušení je jádro zpracuje a změní režim provádění z uživatelského na režim jádra. Dnes se pro přepínání režimu provádění používají instrukce systenter/sysexit.

8. Některé další rozdíly

Kromě výše uvedeného je zde několik dalších rozdílů mezi voláním systému a knihovny:

  • Funkce knihovny je propojena s uživatelským programem a spouští se v uživatelském prostoru, zatímco systémové volání není propojeno s uživatelským programem a spouští se v prostoru jádra.
  • Doba provedení funkce knihovny se započítává do času na úrovni uživatele, zatímco doba provedení systémového volání se počítá jako součást systémového času.
  • Funkce knihovny lze snadno ladit pomocí ladicího programu, zatímco systémová volání nelze ladit, protože je provádí jádro.

Linux
  1. Jaká je aktuální úroveň běhu systému Linux?

  2. Linux – celosystémové monitorování volání do funkce knihovny?

  3. Jaká jsou nativní volání OS/systému Windows a Linuxu prováděná z malloc()?

  1. Co je vdso a vsyscall?

  2. Jaký je rozdíl mezi funkcemi rodiny systémových volání exec, jako je exec a execve?

  3. Jak se naučit vnitřní části systému Linux

  1. Pochopení systémových volání na Linuxu pomocí strace

  2. Co je příkaz Chown v Linuxu a jak jej používat

  3. Co je to linuxový kontejner a linuxový hypervizor?