Vyvolání služeb OS, zpracování přerušení
Z FAV wiki
(Rozdíly mezi verzemi)
| Řá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 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 (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}} | ||
Verze z 29. 8. 2011, 11:07
Většina moderních CPU: 2 řežimy:
- Privilegovaný - režim jádra, všechny instrukce jsou povoleny, v tomto běží pouze 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.
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 (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í)
