V oblasti výpočetní techniky a systémové volání je programový způsob, kterým počítačový program požaduje službu od jádra operačního systému, na kterém je spouštěn. Systémové volání je způsob, jak to mohou programy provést komunikovat s operačním systémem . Počítačový program zavolá systémové volání, když zadá požadavek na jádro operačního systému. Systémové volání poskytuje služby operačního systému uživatelským programům prostřednictvím aplikačního programového rozhraní (API). Poskytuje rozhraní mezi procesem a operačním systémem, které umožňuje procesům na uživatelské úrovni požadovat služby operačního systému. Systémová volání jsou jedinými vstupními body do jádro Systém. Všechny programy vyžadující prostředky musí používat systémová volání.
Uživatelský program může interagovat s operačním systémem pomocí systémového volání. Program vyžaduje řadu služeb a operační systém reaguje spuštěním řady systémových volání, aby požadavek splnil. Systémové volání lze zapsat v jazycích vyšší úrovně, jako je C nebo Pascal, nebo v jazyce symbolických instrukcí. Pokud je použit vysokoúrovňový jazyk, operační systém může přímo vyvolat systémová volání, což jsou předdefinované funkce.
Systémové volání je mechanismus používaný programy k vyžádání služeb od serveru operační systém (OS). Jednodušeji řečeno, je to způsob interakce programu se základním systémem, jako je přístup k hardwarovým prostředkům nebo provádění privilegovaných operací.
Systémové volání je iniciováno tím, že program provede specifickou instrukci, která spustí přepnutí na jádro režim, který umožňuje programu požadovat službu z operačního systému. OS pak požadavek zpracuje, provede potřebné operace a vrátí výsledek zpět programu.
Systémová volání jsou nezbytná pro správné fungování operačního systému, protože poskytují programům standardizovaný způsob přístupu k systémovým zdrojům. Bez systémových volání by každý program musel implementovat své vlastní metody pro přístup k hardwaru a systémovým službám, což by vedlo k nekonzistentnímu chování náchylnému k chybám.
Služby poskytované systémovými voláními
- Tvorba a řízení procesů
- Správa hlavní paměti
- Správa přístupu k souborům, adresářů a souborového systému
- Manipulace se zařízením (I/O)
- Ochrana
- Networking atd.
- Kontrola procesu: ukončit, přerušit, vytvořit, ukončit, alokovat a uvolnit paměť.
- Správa souborů: vytvářet, otevírat, zavírat, mazat, číst soubory atd.
- Správa zařízení
- Údržba informací
- Sdělení
Vlastnosti systémových volání
- Rozhraní: Systémová volání poskytují dobře definované rozhraní mezi uživatelskými programy a operačním systémem. Programy zadávají požadavky voláním konkrétních funkcí a operační systém reaguje provedením požadované služby a vrácením výsledku.
- Ochrana: Systémová volání se používají pro přístup k privilegovaným operacím, které nejsou dostupné běžným uživatelským programům. Operační systém používá toto oprávnění k ochraně systému před škodlivým nebo neoprávněným přístupem.
- Režim jádra: Při systémovém volání se program dočasně přepne z uživatelského režimu do režimu jádra. V režimu jádra má program přístup ke všem systémovým prostředkům, včetně hardwaru, paměti a dalších procesů.
- Přepínání kontextu: Systémové volání vyžaduje přepnutí kontextu, které zahrnuje uložení stavu aktuálního procesu a přepnutí do režimu jádra pro provedení požadované služby. To může představovat režii, která může ovlivnit výkon systému.
- Vypořádání se s chybou: Systémová volání mohou vracet chybové kódy indikující problémy s požadovanou službou. Programy musí tyto chyby zkontrolovat a náležitě je zpracovat.
- Synchronizace: Systémová volání lze použít k synchronizaci přístupu ke sdíleným prostředkům, jako jsou soubory nebo síťová připojení. Operační systém poskytuje synchronizační mechanismy, jako jsou zámky nebo semafory, aby bylo zajištěno, že k těmto prostředkům může bezpečně přistupovat více programů.
Výhody systémových volání
- Přístup k hardwarovým prostředkům: Systémová volání umožňují programům přístup k hardwarovým prostředkům, jako jsou diskové jednotky, tiskárny a síťová zařízení.
- Správa paměti: Systémová volání poskytují programům způsob, jak alokovat a uvolnit paměť, stejně jako přistupovat k hardwarovým zařízením mapovaným v paměti.
- Řízení procesu: Systémová volání umožňují programům vytvářet a ukončovat procesy a také řídit meziprocesovou komunikaci.
- Bezpečnostní: Systémová volání poskytují programům způsob, jak přistupovat k privilegovaným prostředkům, jako je například možnost upravovat nastavení systému nebo provádět operace, které vyžadují oprávnění správce.
- Standardizace: Systémová volání poskytují standardizované rozhraní pro interakci programů s operačním systémem a zajišťují konzistenci a kompatibilitu napříč různými hardwarovými platformami a verzemi operačního systému.
Jak funguje systémové volání?
Zde je podrobné vysvětlení krok za krokem, jak systémová volání fungují:
- Uživatel potřebuje speciální zdroje: Někdy programy potřebují udělat některé speciální věci, které nelze provést bez povolení OS, jako je čtení ze souboru, zápis do souboru, získávání jakýchkoli informací z hardwaru nebo vyžádání místa v paměti.
- Program zadá požadavek na systémové volání: Existují speciální předdefinované instrukce pro zadání požadavku do operačního systému. Tyto instrukce nejsou nic jiného než jen systémové volání. Program používá tato systémová volání ve svém kódu v případě potřeby.
- Operační systém vidí systémové volání: Když OS zaznamená systémové volání, uzná, že program v tuto chvíli potřebuje pomoc, a tak dočasně zastaví provádění programu a přenechá veškerou kontrolu speciální své části zvané ‚Kernel‘. Nyní „kernel“ řeší potřebu programu.
- Operační systém provádí operace: Nyní operační systém provede operaci, kterou program požaduje. Příklad: čtení obsahu ze souboru atd.
- Operační systém vrátí řízení programu: Po provedení speciální operace předá OS řízení programu zpět k dalšímu provádění programu.
Příklady systémového volání ve Windows a Unixu
Systémová volání pro Windows a Unix přicházejí v mnoha různých podobách. Ty jsou uvedeny v tabulce níže takto:
vypnutí vývojářského režimu androidu
Proces | Okna | Unix |
---|---|---|
Kontrola procesu | CreateProcess() ExitProcess() WaitForSingleObject() | Vidlička() Výstup() Počkejte() |
Manipulace se soubory | CreateFile() ReadFile() WriteFile() | OTEVŘENO() Číst() Napsat() Zavřít() |
Správa zařízení | SetConsoleMode() ReadConsole() WriteConsole() | Ioctl() Číst() Napsat() |
Údržba informací | GetCurrentProcessID() SetTimer() Spát() | Getpid() Poplach() Spát() |
Sdělení | CreatePipe() CreateFileMapping() MapViewOfFile() | Trubka() Shmget() java regulární výraz pro Mmap() |
Ochrana | SetFileSecurity() InitializeSecurityDescriptor() SetSecurityDescriptorgroup() | Chmod() odhalit() Chown() |
OTEVŘENO(): Přístup k souboru v systému souborů je možný pomocí systémového volání open(). Poskytuje souborové prostředky, které potřebuje, a rukojeť, kterou může proces použít. Soubor lze otevřít více procesy současně nebo pouze jedním procesem. Vše je založeno na struktuře a systému souborů.
číst(): Data ze souboru v souborovém systému se načítají pomocí něj. Obecně přijímá tři argumenty:
- Popis souboru.
- Vyrovnávací paměť pro ukládání načtených dat.
- Kolik bajtů se má přečíst ze souboru
Před čtením může být čtený soubor identifikován podle jeho deskriptoru souboru a otevřen pomocí funkce open().
Počkejte(): V některých systémech může být nutné proces před pokračováním pozastavit, dokud jiný proces neskončí. Když nadřazený proces vytvoří podřízený proces, provádění nadřazeného procesu se zastaví, dokud nebude podřízený proces dokončen. Rodičovský proces je zastaven pomocí systémového volání wait(). Nadřazený proces znovu získá kontrolu, jakmile podřízený proces skončí.
napsat(): Data z uživatelské vyrovnávací paměti se pomocí ní zapisují do zařízení, jako je soubor. Pomocí toho může program produkovat data jedním způsobem systémové volání . obecně existují tři argumenty:
- Popis souboru.
- Odkaz na vyrovnávací paměť, kde jsou uložena data.
- Množství dat, která budou zapsána z vyrovnávací paměti v bajtech.
Vidlička(): Systémové volání fork() používají procesy k vytváření svých kopií. Je to jedna z nejčastěji používaných metod v operačních systémech k vytváření procesů. Když nadřazený proces vytvoří podřízený proces, provádění nadřazeného procesu je pozastaveno, dokud nebude podřízený proces dokončen. Nadřazený proces znovu získá kontrolu, jakmile podřízený proces skončí.
výstup(): K ukončení programu se používá systémové volání s názvem exit(). V prostředích s více vlákny toto volání označuje, že provádění vlákna je dokončeno. Po použití systémové funkce exit() operační systém obnoví prostředky použité procesem.
Metody předávání parametrů OS
Pokud dojde k systémovému volání, musíme předat parametr do Kernal části operačního systému.
Podívejte se například na dané OTEVŘENO() systémové volání:
C
//function call example> #include> int> open(> const> char> *pathname,> int> flags, mode_t mode);> |
>
>
Tady název cesty , vlajky a režim_t jsou parametry.
Je tedy třeba poznamenat, že:
- Parametry nemůžeme předávat přímo jako při běžném volání funkce.
- V režimu jádra existuje jiný způsob, jak provést volání funkce.
Nemůžeme jej tedy spustit v normálním adresním prostoru, který proces již vytvořil, a proto nemůžeme umístit parametry na začátek zásobníku, protože nejsou dostupné jádru operačního systému ke zpracování. takže musíme přijmout jakékoli jiné metody pro předání parametrů jádru operačního systému.
Dokážeme to přes,
- Předávání parametrů v registrech
- Adresa bloku je předána jako parametr v registru.
- Parametry se vloží do zásobníku.
Pojďme diskutovat o každém bodu podrobně:
1. Předávání parametrů v registrech.
- Je to nejjednodušší metoda ze tří
- Zde přímo předáváme parametry registrům.
- Ale bude to omezeno, když je počet parametrů větší než počet registrů.
- Zde je kód programu C:
C
// Passing parameters in registers.> #include> #include> int> main()> {> > const> char> * pathname => 'example.txt'> ;> > int> flags = O_RDONLY;> > mode_t mode = 0644;> > int> fd = open(pathname, flags, mode);> > // in function call open(), we passed the parameters pathanme,flags,mode to the kernal directly> > if> (fd == -1) {> > perror> (> 'Error opening file'> );> > return> 1;> > }> > // File operations here...> > close(fd);> > return> 0;> }> |
>
java int jako řetězec
>
2.Adresa bloku je předána jako parametry
- Lze jej použít, když je počet parametrů větší než počet registrů.
- Parametry jsou uloženy v blocích nebo v tabulce.
- Adresa bloku je předána registru jako parametr.
- Nejčastěji se používá v Linuxu a Solarisu.
- Zde je kód programu C:
C
//Address of the block is passed as parameters> #include> #include> int> main() {> > const> char> *pathname => 'example.txt'> ;> > int> flags = O_RDONLY;> > mode_t mode = 0644;> > int> params[3];> > // Block of data(parameters) in array> > params[0] = (> int> )pathname;> > params[1] = flags;> > params[2] = mode;> > int> fd = syscall(SYS_open, params);> > // system call> > if> (fd == -1) {> > perror> (> 'Error opening file'> );> > return> 1;> > }> > // File operations here...> > close(fd);> > return> 0;> }> |
>
>
3.Parametry jsou vloženy do zásobníku
- V této metodě lze parametry vložit pomocí programu a vyskakovat pomocí operačního systému
- Kernal tak může snadno přistupovat k datům získáváním informací z horní části zásobníku.
- Zde je kód programu C
C
architektura úlu
//parameters are pushed into the stack> #include> #include> #include> int> main() {> > const> char> *pathname => 'example.txt'> ;> > int> flags = O_RDONLY;> > mode_t mode = 0644;> > int> fd;> > asm> volatile> (> > 'mov %1, %%rdi
'> > 'mov %2, %%rsi
'> > 'mov %3, %%rdx
'> > 'mov , %%rax
'> > 'syscall'> > :> '=a'> (fd)> > :> 'r'> (pathname),> 'r'> (flags),> 'r'> (mode)> > :> '%rdi'> ,> '%rsi'> ,> '%rdx'> > );> > if> (fd == -1) {> > perror> (> 'Error opening file'> );> > return> 1;> > }> > // File operations here...> > close(fd);> > return> 0;> }> |
>
>
Často kladené dotazy
Otázka 1: Jak funguje systémové volání?
Odpovědět:
Když program provede systémové volání, přejde z uživatelského režimu do režimu jádra, což je režim s vyššími privilegii. Přechod je typicky zahájen vyvoláním specifické funkce nebo přerušením instrukce poskytnuté programovacím jazykem nebo operačním systémem.
Jakmile je systém v režimu jádra, je systémové volání zpracováváno operačním systémem. Jádro provede požadovanou operaci jménem programu a vrátí výsledek. Poté je řízení vráceno programu na uživatelské úrovni, který pokračuje ve svém provádění.
Otázka 2: Proč jsou nezbytná systémová volání?
Odpovědět:
Systémová volání jsou nezbytná z několika důvodů:
Přístup k privilegovaným operacím: Mnoho operací, jako je správa hardwarových zařízení nebo úprava konfigurací systému, vyžaduje vyšší oprávnění, která jsou dostupná pouze prostřednictvím systémových volání.
Správa zdrojů: Systémová volání poskytují standardizované rozhraní pro přidělování a správu systémových prostředků, jako je paměť, soubory a zařízení, zajišťující spravedlivý a řízený přístup různých procesů.
Abstrakce: Systémová volání abstrahují základní složitosti operačního systému a umožňují vývojářům aplikací interagovat se systémem na vyšší úrovni a nezávisle na platformě.
Bezpečnost a ochrana: Systémová volání vynucují kontrolu přístupu a bezpečnostní zásady, zabraňují neoprávněnému přístupu k citlivým zdrojům a chrání integritu systému.