Table of Contents

Operační systémy a jejich architektury. Systémová volání, vlákna, procesy. Správa virtuální a fyzické paměti, souborové systémy. Bezpečnost, virtualizace.

B4B35OSY Webové stránky předmětu

1. Systémová volání

jak je implementována ochrana paměti jádra, jak se předávají parametry a data ze systémových volání, rozdíl mezi mikro jádrem a monolitickým jádrem.

Systémová volání jsou rozhraní mezi uživatelským a jádrovým režimem. Umožňují uživatelským aplikacím komunikovat s jádrem operačního systému a využívat jeho služby. Systémová volání se obvykle implementují pomocí přerušení nebo speciálních instrukcí (SYSCALL či SYSENTER), které přepínají procesor do jádrového režimu.

Jak se volají systémová volání

Jádro implementuje tzv. ABI (Application Binary Interface), což je rozhraní, které definuje, jakým způsobem se volají systémová volání a jak se předávají parametry. Systémová volání mají čísla, která se uloží do registru (např. EAX v x86 architektuře) a parametry se předávají pomocí dalších registrů nebo na zásobník. Po provedení systémového volání jádro vrátí výsledek do registru a přepne procesor zpět do uživatelského režimu. Pokud potřebujeme předat větší množství dat, jako jsou struktury nebo pole, používá se ukazatel na paměť, který se předává jako parametr. Jádro pak může přistupovat k těmto datům přímo.

Předávání parametrů a návratových hodnot

Parametry systémového volání se předávají různými způsoby podle architektury a konkrétního API:

Předávání přes paměť je bezpečnější, protože jádro ověří přístupová práva (např. zda proces může číst/zapisovat do dané oblasti).

Ochrana paměti jádra

Hlavním způsobem ochrany paměti jádra je použití virtuální paměti. Každý proces má svůj vlastní virtuální adresní prostor, což znamená, že každý proces vidí svou vlastní paměť a nemůže přistupovat k paměti jiných procesů nebo jádra. To se provádí pomocí stránkování, které mapuje virtuální adresy na fyzické adresy.

V moderních architekturách procesory implementují tzv. privilegované režimy (*rings of privilege*). Jádro OS běží v nejvyšším privilegovaném režimu (ring 0 v x86), s plným přístupem k hardwaru a paměti. Uživatelské aplikace běží v méně privilegovaném režimu (ring 3 v x86) s omezeným přístupem. Přechod z uživatelského do jádrového režimu je řízen např. přes systémová volání.

Pozn.: Intel v r. 2024 oznámil útlum podpory pro ring 1 a 2 v x86, jelikož je moderní OS nevyužívají.

Mikro jádro vs. monolitické jádro

Mikro jádro a monolitické jádro jsou dva základní přístupy k návrhu operačního systému:

2. Vlákna a procesy

jak se vytvoří proces, jak lze předat data mezi procesy. Jaký je rozdíl mezi vlákny a procesy, která data sdílejí různá vlákna jednoho procesu (registry, zásobník, lokální proměnné, globální proměnné, dynamicky alokované proměnné)

Vlákna

Sdílená vs. privátní data ve vícevazebném procesu

Kategorie Sdílí všechna vlákna Jedinečné pro vlákno
———————————-———————–———————–
Kód (text) & globální data
Heap (dynamicky alokovaná paměť)
Otevřené popisovače souborů
Programový čítač & registry
Zásobník (stack)
Thread-local storage (TLS)

Přednosti:

Realizace:

Procesy

Vytváření procesů a předávání dat

Stavy procesů

Meziprocesní komunikace

3. Synchronizace vláken

jaké jsou problémy při paralelním přístupu ke sdíleným datům, jaké existují synchronizační prostředky, co je to deadlock, kdy může nastat a jak se lze deadlocku vyhnout.

Problémy při paralelním přístupu

Problémy při paralelním přístupu

Deadlock

Deadlock (uváznutí) nastává, když skupina vláken čeká na zdroje způsobem, který vytvoří cyklus a nikdo nemůže pokračovat.

Coffmanovy podmínky pro vznik deadlocku:

  1. Vzájemné vyloučení – zdroj může držet jen jedno vlákno.
  2. Hold and wait – vlákno drží jeden zdroj a čeká na další.
  3. Neodnímatelnost – zdroje nelze násilně odebrat.
  4. Cyklické čekání – vznikne kruh, kde každé vlákno čeká na zdroj jiného.

Pokud všechny čtyři podmínky platí zároveň, vznikne deadlock.

Jak se deadlocku vyhnout:

Synchronizační prostředky

pthread_mutex_lock(&m);
while (queue_empty)         // test v *while*!
  pthread_cond_wait(&cond, &m); // uvolní m, uspí, znovu zamkne m
dequeue_item();
pthread_mutex_unlock(&m);

TAS: „ulož do `lock` hodnotu 1 a vrať mi předchozí obsah“.

tas:     mov  $1, %eax       ; pokusím se zapsat 1
         xchg %eax, lock    ; ATOMICKY vyměním registr ↔ paměť
         ; pokud %eax == 0 → zámek byl volný a mám ho

CAS: „pokud je `lock == 0`, zapiš 1; jinak nedělej nic a dej mi současnou hodnotu“.

bool acquired = __sync_bool_compare_and_swap(&lock, 0, 1);

Tyto instrukce jsou atomické, protože CPU uzamkne cache-line / sběrnici a zaručí, že během operace *nikdo jiný nemůže mezitím měnit* tutéž buňku paměti.

4. Správa virtuální a fyzické paměti

Názvosloví

Segmentace

Výhody segmentace

Nevýhody segmentace

Fragmentace

Stránkování

Stránkování (paging) rozděluje logický adresní prostor procesu na pevně velké bloky – stránky, a fyzickou paměť na stejně velké rámce (frames).

Základní pojmy

Stránkovací tabulka

Eliminace externí fragmentace

Překlad adresy – krok za krokem

  1. TLB lookup – MMU nejprve hledá překlad (Virt → Fyz) v *Translation Lookaside Bufferu* (L1/L2 cache).
  2. Miss v TLB ⇒ hardware načte záznam ze stránkovací tabulky v paměti (víceúrovňový průchod podle částí adresy).
  3. Pokud záznam říká, že stránka není v RAM ⇒ page fault:
    • jádro zvolí volný rámec (nebo oběť, kterou swapne na disk),
    • načte požadovanou stránku (např. z binárky, souboru nebo swappu),
    • aktualizuje tabulku a TLB, zopakuje instrukci.

Nevýhody stránkování

TLB (Translation Lookaside Buffer)

Víceúrovňové tabulky

Architektura Úrovně překladu Dekompozice virtuální adresy (bitové pole)
—————————-———————————-————————————————
x86 (32-bit) 2 (PDE, PTE) 10 bit index PDE • 10 bit index PTE • 12 bit offset
x86-64 (48bit LAP) 4 (PML4, PDPTE, PDE, PTE) 9 + 9 + 9 + 9 + 12
x86-64 (57bit LAP) 5 (PML5, PML4, PDPTE, PDE, PTE) 9 × 5 + 12

Odkládání stránek na disk (swapping)

Algoritmy výběru oběti (page replacement)

Algoritmus Idea Poznámky
—————————-————————————–———————————————–
FIFO Vyhoď nejstarší stránku jednoduchý; trpí Beladyho anomálií (větší paměť ⇒ horší výkon)
Second-Chance (Clock) FIFO s dodatečným bitem „referenced“ základní Linuxová varianta (`CLOCK-Pro`), stránka dostane „druhou šanci“
LRU / Approx. LRU Vyhoď nejméně nedávno použitou přesný LRU je drahý na implementaci; OS často používají approximace (bitmapy, počitadla)
Working-Set Drž stránky aktivní v posledním čase ∆ přesnější, ale dražší na výpočet
Adaptive (např. ARC) Kombinace LRU a LFU používá se v moderních OS (Windows, ZFS) i databázích

Copy-On-Write (COW)

Shrnutí výhod stránkování

5. Souborové systémy

jaké typy souborových systémů znáte, který je vhodný pro sekvenční čtení a který pro náhodné čtení souborů. Vysvětlete základní souborové systémy: FAT, systémy založené na inodech a systémy založené na extendech. Žurnálování – základní princip, kdy mohou vzniknout v souborovém systému chyby, jaké jsou úrovně žurnálování a jeho nevýhody.

Způsob organizace dat na disku – data jsou uložena v souborech, soubory jsou strukturované v adresářích (hierarchická struktura).

Příklady souborových systémů

Možnosti uložení obsahu souboru

Základní souborové systémy

FAT (File Allocation Table)

Inodový souborový systém

Rozložení na disku:

Hledání volného místa:

ext2/3/4:

Extents

Žurnálování

Bezpečný postup změny FS (tzv. transakční protokol):

Scénáře při pádu systému

* Nevýhody žurnálování:

Flash paměti

Řešení pro flash paměti

6. Bezpečnost

Trusted Computing Base (TCB)

Základní metody řízení přístupu

Ukládání stavu ochrany není typicky jako matice (moc „řídké“, neefektivní, dynamické). V praxi 2 zřejmé volby:

objektu

daného subjektu

  1. Každý takový řádek je nazýván „seznam schopností“ (capability list)

Seznamy pro řízení přístupu (ACL)

$ ls -ld /var/spool/cups
drwx--x--- 1 root lp 6754 Nov 22 00:00 /var/spool/cups

Seznamy schopností (Capability Lists)

ACL vs Capability List

Seznamy řízení přístupu (ACL) Schopnosti (Capabilities)
——————————-—————————–
Tradiční model; proces musí vědět, jaký objekt chce, a systém mu řekne, jestli má přístup. Objekty jsou přístupné pouze skrze předané schopnosti – uživatel je *nemůže najít sám*.
Oprávnění určena podle identity subjektu (UID, skupina, …). Proces dostane pouze schopnosti, které mu byly explicitně předány (např. přes socket, fork, init).
Problém ambientní autority – proces má automaticky všechna práva uživatele. Neexistuje ambientní autorita – práva se předávají cíleně a omezeně.
Nelze snadno omezit práva potomků (děděná práva). Nikdo nemůže předat právo, které sám nemá.
Linux částečně řeší pomocí namespaces, ale není to univerzální ani bezpečnostně dokonalé. Princip *objektově orientované bezpečnosti*, čistší a škálovatelnější řešení.

Stack Overflow – how to attack

Stack Overflow – how to defend

7. Virtualizace

Virtualizace je abstrakce hardwaru a jeho částečná emulace v softwaru. Hostujícímu systému je vytvořena iluze, že běží na vlastním fyzickém stroji.

Základní pojmy:

Typy virtualizace:

Výhody VM

Problémy virtualizace

Moderní CPU má dva režimy:

VM nesmí běžet přímo v privilegovaném režimu – vnímáno by to jako bezpečnostní riziko. VM tedy běží v uživatelském režimu hostitele ⇒ je nutné emulovat vlastní uživatelský a privilegovaný režim uvnitř VM.

Trap and Emulate

Virtualizace systémových volání

Virtualizace stránkovacích tabulek

Hardwarově asistovaná virtualizace

Moderní procesory (Intel VT-x, AMD-V) přidávají nový režim:

Navíc podporují:

Shrnutí

Oblast Princip
————————–————————————————————————-
Trap and Emulate Hypervizor zachytává výjimky při pokusu o privilegovanou instrukci.
Virtualizace syscalls Přes trap do hypervizoru, který syscall provede za VM.
Virtualizace page tables Host spravuje své PT, ale nesmí je měnit ⇒ trapy a ochrana zápisu.
HW asistence Non-root režim + EPT/NPT – mnoho operací běží přímo na CPU.