Vyvolání služeb OS, zpracování přerušení
Z FAV wiki
(Rozdíly mezi verzemi)
| (Nejsou zobrazeny 3 mezilehlé verze od 3 uživatelů.) | |||
| Řádka 1: | Řádka 1: | ||
Většina moderních CPU: 2 řežimy: | Většina moderních CPU: 2 řežimy: | ||
| − | Privilegovaný - režim jádra, všechny instrukce jsou povoleny, v tomto běží pouze OS | + | * Privilegovaný - režim jádra, všechny instrukce jsou povoleny, v tomto běží pouze jádro OS |
| − | Uživatelský - některé instrukce (I/O) jsou zakázány, v tomto běží ostatní programy | + | * Uživatelský - některé instrukce (I/O) jsou zakázány, v tomto běží ostatní programy |
Aby uživ. aplikace mohla provádět zakázané instrukce, musí požádat OS o jejich provedení následujícím způsobem (Vyvolání služby): | Aby uživ. aplikace mohla provádět zakázané instrukce, musí požádat OS o jejich provedení následujícím způsobem (Vyvolání služby): | ||
| − | Aplikace si uloži parametry pro službu na předem určené místo (registry, zásobník,...) | + | * Aplikace si uloži parametry pro službu na předem určené místo (registry, zásobník,...) |
| − | Zavolá metodu volání služby jádra (např. v C je to syscall( )) | + | * Zavolá metodu volání služby jádra (např. v C je to syscall( )) |
| − | Ta podle parametrů zjistí jaká složba je požadována, která přepne CPU do režimu jádra, a vyvolá obsluhu | + | * Ta podle parametrů zjistí jaká složba je požadována, která přepne CPU do režimu jádra, a vyvolá obsluhu |
| − | Ta službu provede a při návratu do uživatelského programu přepne CPU zpět do uživatelského režimu | + | * Ta službu provede a při návratu do uživatelského programu přepne CPU zpět do uživatelského režimu |
[[Soubor:Vyvolani-sluzby.jpg]] | [[Soubor:Vyvolani-sluzby.jpg]] | ||
| Řádka 14: | Řádka 14: | ||
Programovací jazyky skrývají volání funkcí jádra tak, aby vypadaly jako běžné knihovní funkce. | Programovací jazyky skrývají volání funkcí jádra tak, aby vypadaly jako běžné knihovní funkce. | ||
| − | Zpracování přerušení | + | |
| + | == Zpracování přerušení == | ||
Přerušení je událost, která pokud nastane, je třeba ji v krátkém čase obsloužit. Je tedy přerušeno vykonávání instrukcí, provedena obsluha události a po té se pokračuje v předchozí činnosti. Provedení tohoto je v režimu jádra. | Přerušení je událost, která pokud nastane, je třeba ji v krátkém čase obsloužit. Je tedy přerušeno vykonávání instrukcí, provedena obsluha události a po té se pokračuje v předchozí činnosti. Provedení tohoto je v režimu jádra. | ||
Druhy: | Druhy: | ||
| − | HW přerušení (vnější) - generuje jej I/O zařízení, asynchronně, například přijetí paketu, stisknutí klávesy,... Stará se o ně řadič přerušení (priority atd) | + | * HW přerušení (vnější) - generuje jej I/O zařízení, asynchronně, například přijetí paketu, stisknutí klávesy,... Stará se o ně řadič přerušení (priority atd) |
| − | Vnitřní přerušení - generuje proces, například dělení nulou, výpadek stránky, ... | + | * Vnitřní přerušení - generuje proces, například dělení nulou, výpadek stránky, ... |
| − | Softwarové - synchronní, generováno aplikací jako takovou, záměrně, volání služby OS je příkladem | + | * Softwarové - synchronní, generováno aplikací jako takovou, záměrně, volání služby OS je příkladem |
| − | |||
| − | Vektor přerušení - ukazatel, kde pro daný typ přerušení (a jeho číslo) začíná program pro jeho obsluhu. | + | [http://cs.wikipedia.org/wiki/P%C5%99eru%C5%A1en%C3%AD Přerušení na Wiki] |
| + | |||
| + | '''Vektor přerušení''' - ukazatel, kde pro daný typ přerušení (a jeho číslo) začíná program pro jeho obsluhu. | ||
Obsluha: | Obsluha: | ||
| − | Přijde signalizace přerušení | + | * Přijde signalizace přerušení |
| − | Je dokončena právě prováděná instrukce v CPU | + | * Je dokončena právě prováděná instrukce v CPU |
| − | Adresa další instrukce je uložena na zásobník | + | * Adresa další instrukce je uložena na zásobník |
| − | Do PC (ukazatel CPU na další instrukci) je nastavena instrukce, na kterou ukazuje odpovídající vektor přerušení) | + | * Do PC (Program Counter - ukazatel CPU na další instrukci) je nastavena instrukce, na kterou ukazuje odpovídající vektor přerušení) |
| − | Přepnutí kontextu (Obsluha je samostatný proces) | + | * Přepnutí kontextu (Obsluha je samostatný proces) |
| − | Obsluha uloží stav registrů a obecně stav CPU do zásobníku | + | * Obsluha uloží stav registrů a obecně stav CPU do zásobníku |
| − | Provede obsluhu přerušení | + | * Provede obsluhu přerušení |
| − | Provede (I)RET | + | * Provede (I)RET |
| − | Plánovač opět přepne kontext podle dat v zásobníku a původní proces pokračuje v činnosti (kromě zpoždění tedy neví, že přerušení proběhlo, musí tedy naslouchat všem výstupům obsluh přerušení, které jej zajímají) | + | * Plánovač opět přepne kontext podle dat v zásobníku a původní proces pokračuje v činnosti (kromě zpoždění tedy neví, že přerušení proběhlo, musí tedy naslouchat všem výstupům obsluh přerušení, které jej zajímají) |
| + | |||
| + | {{fav-kiv-bzinf}} | ||
| + | |||
| + | |||
| + | [[Kategorie:fav-kiv-bzinf]] | ||
Aktuální verze z 31. 5. 2015, 12:42
Většina moderních CPU: 2 řežimy:
- Privilegovaný - režim jádra, všechny instrukce jsou povoleny, v tomto běží pouze jádro OS
- Uživatelský - některé instrukce (I/O) jsou zakázány, v tomto běží ostatní programy
Aby uživ. aplikace mohla provádět zakázané instrukce, musí požádat OS o jejich provedení následujícím způsobem (Vyvolání služby):
- Aplikace si uloži parametry pro službu na předem určené místo (registry, zásobník,...)
- Zavolá metodu volání služby jádra (např. v C je to syscall( ))
- Ta podle parametrů zjistí jaká složba je požadována, která přepne CPU do režimu jádra, a vyvolá obsluhu
- Ta službu provede a při návratu do uživatelského programu přepne CPU zpět do uživatelského režimu
Programovací jazyky skrývají volání funkcí jádra tak, aby vypadaly jako běžné knihovní funkce.
[editovat] Zpracování přerušení
Přerušení je událost, která pokud nastane, je třeba ji v krátkém čase obsloužit. Je tedy přerušeno vykonávání instrukcí, provedena obsluha události a po té se pokračuje v předchozí činnosti. Provedení tohoto je v režimu jádra.
Druhy:
- HW přerušení (vnější) - generuje jej I/O zařízení, asynchronně, například přijetí paketu, stisknutí klávesy,... Stará se o ně řadič přerušení (priority atd)
- Vnitřní přerušení - generuje proces, například dělení nulou, výpadek stránky, ...
- Softwarové - synchronní, generováno aplikací jako takovou, záměrně, volání služby OS je příkladem
Vektor přerušení - ukazatel, kde pro daný typ přerušení (a jeho číslo) začíná program pro jeho obsluhu.
Obsluha:
- Přijde signalizace přerušení
- Je dokončena právě prováděná instrukce v CPU
- Adresa další instrukce je uložena na zásobník
- Do PC (Program Counter - ukazatel CPU na další instrukci) je nastavena instrukce, na kterou ukazuje odpovídající vektor přerušení)
- Přepnutí kontextu (Obsluha je samostatný proces)
- Obsluha uloží stav registrů a obecně stav CPU do zásobníku
- Provede obsluhu přerušení
- Provede (I)RET
- Plánovač opět přepne kontext podle dat v zásobníku a původní proces pokračuje v činnosti (kromě zpoždění tedy neví, že přerušení proběhlo, musí tedy naslouchat všem výstupům obsluh přerušení, které jej zajímají)
