Działania systemu mogą zostać zakłócone - zdają sobie dobrze z tego sprawę osoby, które pisały programy w asemblerze procesora 8051 - przez program użytkownika, który wyda nieodpowiedni rozkaz I/O.

Niedozwolone operacje I/O prowadzą do nieokreślonych zachowań systemu komputerowego. Dlatego też, aby ustrzec się przed wykonaniem niedozwolonej operacji wejścia-wyjścia przyjęto, że wszystkie rozkazy I/O są uprzywilejowane, zaś użytkownicy mogą z nich korzystać jedynie za pośrednictwem systemu operacyjnego. Uzyskanie pełnej ochrony wejścia-wyjścia wymaga uniemożliwienia przejęcia przez program użytkownika kontroli nad systemem komputerowym w trybie systemowym (ang. system mode). Tryb systemowy wykorzystywany jest przez system operacyjny i charakteryzuje się tym, że pozwala na uzyskanie pełnej kontroli nad systemem komputerowym, w tym również umożliwia wykonanie uprzywilejowanych instrukcji (w trybie użytkownika jest to niemożliwe) [2].

Podstawowymi jednostkami pamięci, które muszą być chronione są wektor przerwań oraz systemowe procedury obsługi przerwań. Zaniedbanie tej ochrony mogłoby doprowadzić do sytuacji, w której program użytkownika zastąpiłby systemowe procedury obsługi przerwań skokami do własnego obszaru, przechwytując w ten sposób sterowanie od procedury obsługi przerwania, pracującej w trybie systemowym [2]. To doprowadzić mogłoby do nieprawidłowego działania systemu komputerowego oraz np. przebiegu buforowania.

Bezpieczeństwo wektora przerwań i systemowych procedur obsługi przerwań jest bardzo istotne. Ale co zrobić, gdy chcemy chronić całą pamięć systemu operacyjnego przed wpływem "z zewnątrz" oraz obszary pamięci kilku różnych programów użytkowych? Otóż z pomocą przychodzą rozwiązania sprzętowe.

Najpopularniejsza metoda ochrony pamięci programu opiera się na wykorzystaniu dwóch rejestrów: bazowego (ang. base) i granicznego (ang. limit). Rejestr bazowy przechowuje podstawowy, najmniejszy, dopuszczalny, fizyczny adres pamięci, zaś rejestr graniczny zawiera rozmiar pamięci (patrz rysunek 1.9.).

[Rejestr bazowy i graniczny]

Rysunek 1.9. Rejestr bazowy i graniczny

Dzięki ww. rejestrom dowiadujemy się, jakie są dopuszczalne adresy programu oraz uzyskujemy możliwość ochrony pamięci poza tymi adresami.

Ochronę tę sprawuje jednostka centralna porównując dla każdego adresu wygenerowanego w trybie użytkownika, jaka jest zawartość opisanych powyżej rejestrów [2]. Jakakolwiek ingerencja wykonana przez program użytkownika do pamięci innego programu lub programu pracującego w trybie systemowym, kończy się wygenerowaniem przez system błędu. Program użytkownika jest więc chroniony przed zmodyfikowaniem kodu lub struktur danych własnych oraz systemu operacyjnego.

System operacyjny powinien sprawować stałą kontrolę nad komputerem, dlatego też należy zapobiec sytuacji, w której program użytkownika wpadłby w nieskończoną pętlę permanentnie odbierając kontrolę SO. Wykorzystuje się do tego czasomierz (ang. timer). Timer pozwala na generowanie przerwania po wyznaczonym czasie - czas ten może być stały lub zmienny (przyrostowo o pewien krok).

Tak więc system operacyjny, przed oddaniem sterowania do programu użytkownika, ustawia timer na przerwanie. Gdy czasomierz wywołuje przerwanie, sterowanie wraca do systemu operacyjnego, który decyduje: czy wystąpił błąd, czy też należy dać programowi użytkownika więcej czasu [2]. W ten łatwy sposób można zapobiec zbyt długiemu działaniu programów lub wymusić zakończenie działania programu po upływie określonego czasu.

Czasomierz wykorzystywany jest również do podziału czasu procesora. Umożliwia on przełączanie się programów użytkowych co pewien określony czas (stały lub zmienny), stwarzając w ten sposób wrażenie pracy równoległej.

Wydawać by się mogło, że głównym zadaniem czasomierza powinno być odmierzanie czasu względem pewnej wartości początkowej. To również potrafi czasomierz, ale jest to tylko "skutek uboczny" jego faktycznego przeznaczenia.

NASTĘPNA