Ochrona pamięci (ang. memory protection) – kontrola praw dostępu do pamięci komputera i integralna część większości nowoczesnych systemów operacyjnych. Podstawowym celem ochrony pamięci jest uniemożliwienie procesowi dostępu do obszaru pamięci, który nie został mu przydzielony. Zapobiega to przypadkom, w których proces może zakłócić pracę innego procesu lub pracę nadzorującego systemu operacyjnego.
Metody ochrony pamięci
[edytuj | edytuj kod]Segmentacja pamięci
[edytuj | edytuj kod]Segmentacja pamięci[1] polega na podziale pamięci komputera na obszary o określonych atrybutach zwane segmentami. Procesom przydzielane są segmenty, ale uzyskują one jedynie identyfikatory tych segmentów. Kontrolując rozdzielność zbiorów przydzielonych segmentów, zapewniane jest unikanie konfliktów dostępu do tego samego obszaru pamięci przez różne procesy. Do przechowywania identyfikatorów segmentów wykorzystywane są w systemach wielozadaniowych:
- wspólna globalna tablica deskryptorów (GDT – global descriptor table)
- tablica deskryptorów przerwań (IDT – interrupt descriptor table)
- lokalne tablice deskryptorów (LDT – local descriptor table)
Wiele funkcji segmentacji pamięci zaimplementowano już w rodzinie architektur x86, w której do przechowywania identyfikatorów segmentów przewidziano początkowo 4 rejestry segmentowe:
- rejestr segmentu kodu (CS – code segment)
- rejestr segmentu stosu (SS – stack segment)
- rejestr segmentu danych (DS – data segment)
- pomocniczy rejestr segmentu (ES)
- później dodano 2 pomocnicze rejestry FS i GS
Stronicowanie pamięci wirtualnej
[edytuj | edytuj kod]Mechanizm stronicowania[1][2] polega na podzieleniu dostępnej pamięci fizycznej na równe, małe bloki (zazwyczaj 4 kB) zwane ramkami. Jednocześnie pamięć wirtualna dzielona jest na bloki o tej samej wielkości zwane „stronami”. System operacyjny przydziela ramkom strony, zapisując powiązania w tablicy stron. Dzięki takiemu rozwiązaniu możliwe jest uzyskanie ciągłej przestrzeni adresowej pamięci wirtualnej i używanie jej do uzyskania dostępu do podzielonej w rzeczywistości na bloki przestrzeni adresowej pamięci fizycznej. Większość współczesnych architektur komputerowych, szczególnie rodzina architektur x86, używa stronicowania do ochrony pamięci. Tablica stron jest używana do mapowania pamięci wirtualnej na pamięć fizyczną i jest zazwyczaj niedostępna dla obsługiwanych procesów. Tablica stron ułatwia alokowanie nowego obszaru pamięci, ponieważ każda nowa strona może być alokowana w dowolnym obszarze pamięci fizycznej. Dzięki takiemu rozwiązaniu, niemożliwe jest, aby program lub jego proces uzyskał dostęp do strony pamięci, która nie została jednoznacznie do niego przypisana − w takim przypadku generowany jest błąd braku strony (PF – page fault). Wystąpienie tego błędu niekoniecznie musi być działaniem niepożądanym. Używany jest on nie tylko w mechanizmie ochrony pamięci, ale również w inny interesujący sposób: system operacyjny po przechwyceniu tego błędu, może załadować stronę, która wcześniej została przeniesiona na dysk (pamięć wymiany), i przywrócić dzięki temu działanie programu, który spowodował wystąpienie błędu. W ten sposób program uzyskuje dostęp do strony pamięci, której żądał.
Klucze ochrony
[edytuj | edytuj kod]Mechanizm kluczy ochrony dzieli pamięć fizyczną na bloki o określonej wielkości (np. 2 kB), jednocześnie przypisując każdemu z nich identyfikator (wartość liczbową) nazywaną kluczem ochrony. Każdy proces ma również przydzielony indywidualny klucz ochrony. W momencie próby dostępu procesu do pamięci, sprzętowo porównywane są wartości kluczy ochrony aktualnie wykonywanego procesu i bloków pamięci, jeśli nie pasują, występuje wyjątek.
Ten mechanizm został użyty w architekturze System/360. W mechanizmie kluczy ochrony zaimplementowanym w System/360, opisanym powyżej, klucze ochrony były powiązane z adresami fizycznymi pamięci. I to właśnie różni go od mechanizmu kluczy ochrony użytego w procesorach takich jak Intel Itanium czy HP/PA (Hewlett-Packard Precision Architecture, znanym również jako PA-RISC), które powiązane są z adresami logicznymi pamięci wirtualnej, co umożliwia przydzielenie wielu kluczy do procesu. W architekturach Itanium i PA, działający proces przechowuje klucze w rejestrach kluczy ochrony (16 dla Itanium, 4 dla HP/PA).
Porównanie
[edytuj | edytuj kod]Do porównania poziomu ochrony poszczególnych implementacji metod, sprawdza się jak dokładnie przestrzegają zasady najmniejszego uprzywilejowania.
Ochrona pamięci w różnych systemach operacyjnych
[edytuj | edytuj kod]W poszczególnych systemach operacyjnych zostały wprowadzone różne formy ochrony lub separacji pamięci. Prawdziwa separacja pamięci nie została zaimplementowana w komputerach osobistych, aż do systemów Windows XP i OS X, które pojawiły się w 2001 roku. We wcześniejszych systemach taki brak ochrony był także używany jako mechanizm komunikacji między procesami. Przez to możliwe było uzyskanie przez proces dostępu do zastrzeżonej pamięci systemowej, w takich systemach jak rodzina Windows 9x[3].
Systemy operacyjne, w których zaimplementowano metody ochrony pamięci:
- rodzina Microsoft Windows począwszy od Windows NT 3.1
- OS-9
- większość odmian systemu UNIX i systemów uniksopodobnych, w tym:
Zobacz też
[edytuj | edytuj kod]Przypisy
[edytuj | edytuj kod]- ↑ a b Krzysztof Kołek: Mikropocesor 486. Architektura, tryby pracy. [dostęp 2011-10-07]. [zarchiwizowane z tego adresu (2016-03-04)]. (pol.).
- ↑ Maciej Kwiatkowski: Stronicowanie. [dostęp 2011-10-07]. (pol.).
- ↑ Windows does not have true memory protection. [dostęp 2011-10-07]. (ang.).