Ochrana paměti

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Ochrana paměti je v informatice způsob řízení práv přístupu k paměti počítače a je součástí většiny moderních operačních systémů. Hlavním účelem této ochrany je zabránit procesu v přístupu k paměti, která pro něj nebyla alokována. Předchází se tak scénaři, kde chyba uvnitř jednoho procesu ovlivní běh dalších procesů či samotného operačního systému. Z pohledu počítačové bezpečnosti patří k ochraně paměti také techniky jako randomizace uspořádání adresního prostoru (ASLR) a ochrana spustitelné oblasti.

Metody[editovat | editovat zdroj]

Segmentace[editovat | editovat zdroj]

Segmentace spočívá v rozdělování paměti počítače do částí. Odkaz na místo v paměti pak tedy obsahuje hodnotu, která určuje konkrétní segment a odsazení v rámci tohoto segmentu.

Architektura x86 má vícero vlastností, které usnadňují práci se segmentovanou pamětí.[1] Mezi tyto vlastnosti se řadí přítomnost tabulek Global Descriptor Table a Local Descriptor Table, které lze použít k odkazování na segmenty v paměti. Dále je možné uložení odkazů přímo do segmentových registrů procesoru.

Stránkovaná virtuální paměť[editovat | editovat zdroj]

Při stránkování je paměťový adresní prostor rozdělen na malé, stejně velké, části, nazývané stránky. Následným zapojením mechanismu virtuální paměti je pak možné umístit každou stránku do kteréhokoliv místa ve fyzické paměti, či stránku označit jako chráněnou. Libovolné umístění stránek tak umožňuje zachovat lineární adresní prostor v rámci bloku, který je ve fyzické paměti složen z fragmentů.

Většina počítačových architektur založených na stránkování používá stránkování jako způsob ochrany paměti.

Tabulka stránek je použita k mapování virtuální paměti do fyzické. Tato tabulka je pro proces obvykle neviditelná. Tabulka stránek ulehčuje alokování nové paměti, protože každá nová stránka může být alokována z libovolného místa ve fyzické paměti.

Tímto způsobem je tak pro aplikaci nemožné přistoupit na stránku, která pro ni nebyla explicitně alokována a to proto, že žádná paměťová adresa, dokonce ani kompletně náhodná, kterou se aplikace pokusí použít, buď odkáže na stránku alokovanou pro tuto aplikaci, nebo dojde k vygenerování stavu page fault (PF). Nealokované stránky a stránky alokované pro jiné aplikace jednoduše nemají z pohledu dané aplikace žádnou adresu.

Jako poznámku na okraj lze doplnit, že PF nemusí končit jako fatální chyba. Operační systém může tuto událost zachytit a pokusit se načíst paměťovou stránku, která byla dříve swapována na disk a následně obnovit chod aplikace, která způsobila vyvolání poruchy stránky. Tímto způsobem aplikace obdrží paměťové stránky jak vyžaduje. Toto schéma, známé jako swapování, umožňuje, aby data v paměti, která nejsou aktuálně používána, bylo možné přesouvat na disk a zpět, aniž by o tom aplikace věděly, a zvýšit tak celkovou kapacitu paměti.

Na některých systémech je PF mechanismus použit také pro ochranu spustitelné oblasti.

Ochranné klíče[editovat | editovat zdroj]

Mechanismus ochranných klíčů rozděluje fyzickou paměť do bloků specifické velikosti (např. 4 KiB), kde každý z těchto bloků má přidělenou číselnou hodnotu nazývanou ochranný klíč. Stejně tak je každému procesu přiřazena hodnota ochranného klíče. Při vstupu do paměti pak hardware kontroluje, zda ochranný klíč přistupujícího procesu je shodný s hodnotou klíče pro tento paměťový blok; pokud se hodnoty klíčů neshodují, nastane výjimka. Tento mechanismus byl poprvé použit v architektuře mainframů IBM (System/360).

Systém ochranných klíčů pro System/360 popsaný výše pracuje s fyzickými adresami. Tím se odlišuje od systému použitém u řad procesorů jako Intel Itanium či Hewlett-Packard Precision Architecture, kde se pracuje s virtuálními adresami a kde je umožněno asociovat proces s více klíči.

V procesorových architekturách Itanium a PA, mají překlady v TLB k sobě asociovány klíče (Itanium) či přístupová id (PA). Běžící proces má několik registrů s ochrannými klíči (16 v případě Itanium,[2] 4 u PA[3]). Klíč překladu vybraného virtuální adresou je porovnán s každým záznamem v registrech ochranných klíčů. Pokud je daná hodnota klíče nalezena v jednom z registrů (plus další možná ověření), přístup je povolen. Pokud daná hodnota klíče nalezena není, dojde k vygenerování chyby či výjimky. Softwarový obsluhovač chyb může, pokud je to vyžadováno, zkontrolovat přítomnost nenalezeného klíče ve větším seznamu klíčů spravovaném softwarově; čímž lze s registry ochranných klíčů uvnitř procesoru zacházet jako se softwarově řízenou cache obsahující klíče asociované s procesem.

V PA má klíč 15–18 bitů; Itanium vyžaduje nejméně 18. Klíče jsou většinou asociovány s tzv. ochrannými doménami, jako například knihovny, moduly, apod.

Simulovaná segmentace[editovat | editovat zdroj]

Simulace je používání monitorovacího programu k interpretaci strojového kódu počítače. Takový simulátor může poskytovat ochranu paměti použitím schéma segmentovaného charakteru, kdy se v reálném čase ověřuje cílová adresa a délka instrukce před tím, než dojde k jejímu vykonání. Simulátor musí přepočítat cílovou adresu a délku a porovnat tyto hodnoty se seznamem platných adresových rozsahů, které si udržuje v rámci kontextu vlákna a kam patří například dynamické bloky paměti získané v průběhu života vlákna či jakékoliv validní sdílené statické paměťové sloty. Význam slova „validní“ se může v průběhu života vlákna měnit v závislosti na situaci. Občas může být umožněno měnit statický blok úložného prostoru a občas ne, což se odvíjí od aktuálního módu spouštění, který může a nemusí záviset na klíči úložného prostoru či stavu kontroléru.

Všeobecně není vhodné používat tuto metodu ochrany paměti tam, kde jsou přítomné na procesoru jiné, avšak kvalitou adekvátní, metody, protože je tento způsob výpočetně náročný. Metoda nachází uplatnění zejména v kontextu vývoje a testování, kde poskytuje lepší informace v případech, kdy dochází k porušování přístupu k úložnému prostoru.

Adresace založená na způsobilosti[editovat | editovat zdroj]

V této metodě ochrany paměti jsou ukazatele nahrazené chráněnými objekty (nazývanými způsobilosti), které mohou být vytvořené pouze za použití privilegovaných instrukcí, které může vykonávat pouze jádro, případně proces k tomu autorizovaný. Toto efektivně umožňuje jádru řídit, které procesy mohou přistupovat k jakým objektům v paměti, aniž by k tomu bylo nutné použít oddělený adresní prostor či přepínání kontextu. Způsobilosti nejsou v komerčním hardwaru takřka používané, avšak jsou velmi rozšířené ve vědeckých systémech jako KeyKOS. Koncept způsobilostí je také základem pro některé virtuální stroje, například Smalltalk či Java.

Určení úrovně ochrany[editovat | editovat zdroj]

Úroveň ochrany konkrétní implementace lze určit dle toho, do jaké míry dodržuje princip nejnižších privilegií.[4]

Ochrana paměti v rozličných operačních systémech[editovat | editovat zdroj]

Způsoby rozdělování a ochrany paměti se napříč operačními systémy liší. Skutečné rozdělování paměti bylo v domácích počítačích používáno až od vydání OS/2 v roce 1987. Na starších systémech byla tato vlastnost nechráněné paměti využívána jako forma komunikace mezi procesy. V rodině systémů Windows 9x je možné povolení přístupu procesům do systémové paměti.[5]

Některé systémy, které implementují ochranu paměti:

V unixových systémech se k řízení ochrany paměti používá systémové volání mprotect.[6]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Memory protection na anglické Wikipedii.

  1. Intel 64 and IA-32 Architectures Software Developer's Manuals: Volume 3A: System Programming Guide, Part 1
  2. Keys in Itanium
  3. Memory protection in HP PA-RISC
  4. Cook, D.J. Measuring memory protection, accepted for 3rd International Conference on Software Engineering, Atlanta, Georgia, May 1978.
  5. Windows 9x does not have true memory protection [online]. Everything2, 2000-06-24, [cit. 2009-04-29]. Dostupné online. (anglicky) 
  6. mprotect [online]. The Open Group. Dostupné online. (anglicky) 

Externí odkazy[editovat | editovat zdroj]