Praca semestralna
Podstawy systemów operacyjnych
Spis treści
Literatura
Literatura podstawowa (dla zainteresowanych)
Zbigniew Weiss "Komputery jak ludzie", WNT, Warszawa 1996;
Abracham Silberschatz, James L. Peterson, Peter B. Gavin "Podstawy systemów operacyjnych", WNT, Warszawa 1993;
Maurice J. Bach "Budowa systemu operacyjnego Unix", WNT, Warszawa 1995;
Simson Garfinkel, Gene Spafford "Bezpieczeństwo w unixie i internecie", Wydawnictwo RM, Warszawa 1997;
Helen Custer "Inside Windows NT", Microsoft Press 1992;
Paul Tyler "Windows NT server - czarna księga administratora", Helion, Gliwice 1997;
Podręczniki dla początkujących użytkowników komputerów
T. Kołodziejczak "Podstawy Informatyki", Prószyński i S-ka, Warszawa 1992;
Witold Wrotek "PC i ty, pierwszy krok", PLJ, Warszawa 1995;
Stanisław Jachimek "Informatyka dla szkół", Helion, Gliwice 1996/97;
Anna Kurzydłowska et al "Kompendium Obsługi Komputera", Mikom, Warszawa 1997;
Zdzisław Dec, Robert Konieczny "Abc komputera", Edition 2000, Kraków 1998;
Shelly O'Hara "Komputer od A do Z", Read Me, Warszawa 1998;
Dan Gookin "Komputer dla opornych", Read Me, Warszawa 1997;
Literatura pomocnicza
Don Sellers "Nie daj się, czyli jak komputer może cię wykończyć", Helion, Gliwice 1996.
Rozdział 1: Wprowadzenie
Architektura współczesnych komputerów - maszyna von Neumanna
W drugiej połowie lat 40. John von Neumann zaproponował schemat blokowy elektronicznej maszyny liczącej (rys. 1.1).
Schemat ten aż do dzisiaj z niewielkimi modyfikacjami jest podstawą budowy komputerów.
Gdzie:
Procesor (ang. processor) - układ dokonujący operacji na danych zgromadzonych w pamięci lub płynących z/do urządzeń wejścia wyjścia, sterowany programem, którego kod znajduje się w pamięci. Do przechowywania swojego wewnętrznego stanu procesor wyposażony jest w peną ilość rejestrów, z których najważniejsze to:
Wskaźnik instrukcji (ang. instruction pointer) - wskazuje komórkę pamięci, z której pobrany będzie następna instrukcja do wykonania.
Rejestr flag stanu (ang. flag register, flags) - składają się na niego jednobitowe flagi przechowujące informacje o stanie procesora (np. dopuszczalności przerwań) lub rezultacie ostatnio wykonanej instrukcji (np. czy otrzymano zero).
Wskaźnik stosu (ang. stack pointer) - wskazuje pierwszą wolną komórkę pamięci na stosie procesora - strukturze danych typu FILO (ang. first in last out - pierwszy przyszedł,ostatni wyszedł) wykorzystwanej przy skokach do podprogramów dla przechowywania adresu powrotu i zmiennych lokalnych.
Akumulator (ang. accumulator) - służy jako argument a zarazem miejsce umieszczania rezultatów operacji arytmetycznych.
Pamięć (pamięć operacyjna, ang memory) - przechowuje dane i kod prgramu. Jeżeli jej konstrukcja umożliwia oprócz odczytu dokonywanie w niej modyfikacji nazywamy ją RAM (ang. random access memory), jeśli jej konstrukcja pozwala jedynie na odczyt nazywana jest ROM (ang. read only memory). Obecnie konstruaowane pamięci RAM tracą swoją zawartość w chwili wyłączenia zasilania w przeciwieństwie do ROM. Niezależnie od typu, pamięć dzieli się na komórki, z których każda jest w stanie przechować liczbę całkowitą z ustalonego dla danej architektury zakresu. Najczęściej jest to 0, 1,...,255. Do zakodowania takich liczb potrzeba 8 bitów t.j. 1 bajt. Każda komórka pamięci posiada unikalny numer zwany adresem fizycznym, który służy procesorowi do owoływania się do niej. Jeśli nie decydują o tym inne ważne względy, komórkom pamięci przydziela się adresy fizyczne poczynając od zera bez luk w numeracji.
Zegar - odmierza cykle wykonywania instrukcji programu.
Magistrale (ang. buses) służą do przesyłania danych i synchornizacji między elementami komputera:
Magistrala danych (ang. data bus) służy do przesyłania danych między pamięcią, układami we/wy a procesorem. Ilość użytych tutaj linii jest równa długości słowa masynowego i jest równa rozmiarowi komórki pamięci, lub jest jego wielokrotnością.
Magistrala adresów (ang. address bus) służy procesorowi do wysyłania numerów komórek pamięci lub rejestrów we/wy na których będzie doknane następne przesłanie danych. Ilość użytych tutaj linii decyduje o ilości pamięci jaką można zaadresować.
Magistrala sterująca (ang. control bus) służy do wzajemnej synchronizacji oraz przekazywania i potwierdzania przyjęcia/wykonania zleceń.
Wejście/Wyjście pozwala kompuerowi kontaktować się z zewnętrznym światem (klawiatura, monitor, czytniki, adaptery sieciowe itp) lub przechowywać dane poza pamięcią operacyjną (dyski). Na wejście wyjście składają się następujące układy i urządzenia:
Sprzętowe sterowniki wejścia wyjścia. Układy te potrafią się porozumiewać z procesorem poprzez rejestry we/wy, przerwania, kanały DMA i własną adresowalną przez procesor pamięć układu. Wykonując zlecenia procesora sterują urządzeniami wejścia wyjścia. W technologii mikrokomputerowej są montowane jako karty rozszerzające wewnątrz obudowy komputera.
Urządzenia zewnętrzne - zapewniają kontakt komputera ze światem. Mogą to być klawiatury, monitory, dyski, drukarki, modemy ale także czujniki i ramiona robotów w procesie produkcyjnym.
Interfejsy. Interfejs jest to specyfikacja sposobu przesyłania danych między dwoma urządzenami. Pojęcie to bywa często przenoszone na realizację sprzętową interfejsu w postaci gniazd, wtyków i kabli. Bywa też rozszerzane na komunikację człowiek-maszyna, mówimy wtedy o interfejsie użytkownika.
Pod względem funkcjonalnym komputer von Neumanna składa się z uwidocznionego na rys. 1.1 sprzętu i oprogramowania zawartego w pamięci (nieuwidocznionego). Przez system komputerowy (informatyczny) rozumie się komputer (sprzęt + oprogramowanie) i osoby związane z jego działaniem.
Wśród osób związanych z działaniem komputera wyodrębnia się następujące typy:
Użytkownicy - wykorzystują komputery jako narzędzia ułątwiające pewne rutynowe czynności przetwarzania informacji.
Administratorzy - personel dbający o poprawne działanie systemu informatycznego.
Twórcy oprogramowania - tworzą oprogramowanie działająceme w systemie informatycznym i zapewniają mu serwis.
Dostawcy sprzętu - produkują i dostarczają sprzęt działający w systemie informatycznym oraz zapewniają mu serwis.
Definicja systemu operacyjnego
Definicje
Oprogramowanie komputera daje się podzielić na oprogramowanie wykonujące użyteczne dla użytkownika obliczenia i oprogramowanie dbające o poprawną pracę systemu komputerowego jako całości, jednakże nie zawsze ten podział jest oczywisty i precyzyjny. Oprogramowanie tworzone z przeznaczeniem do wykonywania użytecznych obliczeń nazywamy aplikacjami. Oprogramowania tworzone z przeznaczeniem do zapewniania poprawnej pracy systemowi informatycznemu nazywamy oprogramowaniem systemowym.
Rdzeniem oprogramowania systemowego jest system operacyjny. Z powodu trudności w precyzyjnym zdefiniowaniu tego co jest, a co nie jest systemem operacyjnym, niektórzy autorzy definiują system operacyjny jako wszystko to opragramowanie, które producent wkłada do pudełka z taką nazwą.
Silberschatz et al w [2] podają następujące definicje systemu operacyjnego:
System operacyjny jest dystrybutorem zasobów komputera.
System operacyjny jest programem sterującym. Program sterujący nadzoruje działanie programów użytkownika, przeciwdziała błędom i zapobiega niewłaściwemu użyciu komputera. Zajmuje się zwłaszcza obsługiwaniem i kontrolowaniem pracy urządzeń wejścia/wyjścia.
Nie ma [...] w pełni adekwatnej definicji systemu operacyjnego. Istnienie systemów operacyjnych jest uzasadnione tym, że pozwalają one w rozsądny sposób rozwiązać problem kreowania użytecznego środowiska pracy.
Przez zasoby rozumie się wszystkie te elementy komputera, którymi daje się dysponować jako odrębnymi obiektami, np: procesor (w sensie przydziału jego czasu pracy), obszary pamięci, obszary dyskowe, drukarki itp.
Na potrzeby niniejszego wykładu system operacyjny zostanie zdefiniowany jako zbiór programów i podprogramów wywoływanych przez inne programy lub użytkownika, które mają zapewnić użytkownikowi i jego aplikacjom niezawodne, zestandaryzowane, wygodne i wydajne środowisko pracy.
Można w związku z powyższym przyjąć, że oprogramowanie rozdziela się na dwie warstwy, system operacyjny jest tą warstwą, która separuje warstwę aplikacji od sprzętu, a przez to je od niego uniezależnia (rys. 1.2).
Dla użytku aplikacji system operacyjny tworzy pewne abstrakcje zasobów sprzętowych, zrealizowane w postaci pewnych struktur danych i podprogramów, w dalszej części wykładu również zwane zasobami. Separację aplikacji od sprzętu należy rozumieć w ten sposób, że aplikacje nie sterują bezpośrednio sprzętem, a jedynie posługują się strukturami danych dostarczonymi przez system operacyjny (abstrakcjami zasobów sprzętowych) i wywołują systemowe podprogramy.
Zalety istnienia w komputerze systemu operacyjnego
możliwość posługiwania się komputerem przez osoby nie będące ekspertami budowy komputerów oraz możliwość wydajnej pracy tych osób,
brak konieczności gruntownych szkoleń personelu w razie wymiany komputerów lub ich podzespołów,
minimalizacja ilości oprogramowania do wymiany w razie wymiany komputerów lub ich podzespołów,
możliwość zamawiania, tworzenia, czy wreszcie kupowania aplikacji bez konieczności dokładnego precyzowania parametrów sprzętu,
możliwość tworzenia sterowników programowych urządzeń niezależnie od aplikacji, które ja wykorzystają,
w połączeniu z językami programowania wysokiego poziomu, można we względnie łątwy sposób tworzyć wersje oprogramowania dla różnych komputerów,
możliwość wyegzekwowania zasad ochrony danych przed niepowołąnym dostępem, dostępu do innych zasobów (jak drukarki) czy przestrzegania godzin pracy systemu,
możliwość rozliczania użytkowników/klientów za wykorzystanie czasu pracy procesora i innych zasobów.
Struktura systemu operacyjnego
Jądro systemu
Aby zabezpieczyć się przed możliwością bezpośredniego sterowania sprzętem przez aplikacje, konstruktorzy procesorów podzielili
zbiór instrukcji procesora na dwie części (niekiedy na więcej, ale pominiemy te przypadki). Jeden zbiór instrukcji, zawierający jedynie instrukcje nie sterujące bezpośrednio sprzętem i odwołujące się do wydzielonych obszarów pamięci, dopuszczono do użytku przez aplikacje (i oczywiście system operacyjny). Drugi zbiór, zawierający instrukcje sterujące sprzętem, lub odwołujące się do dowlnych miejsc w pamięci dopuszczono do użytku tylko przez system operacyjny.
Aby w praktyce zorganizować właściwe użycie tych instrukcji wprowadzono także dwa tryby pracy procesora: tryb użytkownika i tryb jądra. W trybie użytkownika dopuszczone są tylko instrukcje nie sterujące sprzętem i o ograniczonym dostępie do pamięci, jest on przeznaczony dla aplikacji. W trybie jądra dopuszczone są wszystkie instrukcje, jest on przeznaczony dla systemu operacyjnego.
Nie cały system operacyjnym musi się wykonywać w trybie jądra, wobec czego wyodrębnia się z systemu operacyjnego zbiór podprogramów o żywotnym znaczeniu. Zbiór ten nosi nazwę jądra systemu operacyjnego.
Wywołanie podprogramu jądra przez aplikację (w celu dostępu do zasobów) powoduje natychmiastowe przełączenie się procesora w tryb jądra, w trybie tym wykonuje się wielokrotnie sprawdzony podprogram jądra, który tuż przed powrotem do aplikacji przełącza się z powrotem do trybu użytkownika.
Twórcy nowoczesnych systemów operacyjnych nadają jądru modułową budowę, co między innymi pozwala wydzielić grupy podprogramów zwane sterownikami programowymi we/wy (ang. driver) obsługujących konkretne urządzenia i włączać je do jądra zależnie od potrzeb.
Programy
Użytkownik nie może wywoływać bezpośrednio podprogramów jądra systemu operacyjnego. Oprogramowanie, które może być wywoływane bezpośrednio przez użytkownika nazywamy programami. Zgodnie z tym, co zostało powiedziane wcześniej programami są aplikacje i część systemu operacyjnego przeznaczona do bezpośredniego wywoływania przez użytkownika tj. powłoki i programy narzędziowe.
Podstawową rzeczą jaką system operacyjny musi udostępnić użytkownikowi jest możliwość wywoływania aplikacji i innych programów. Do tego służą powłoki.
Powłoka jest to program przeznaczony do bezpośredniej konwersacji z użytkownikiem, przyjmowania od niego zleceń i wywoływania na jego polecenie innych programów.
Zadaniem programów narzędziowych jest wsparcie administratorów w pielęgnacji komputera.
Zadaniem programów usługowych (zwanych serwerami lub demonami) jest wspieranie jądra w tych czynnościach, których samo nie może z różnych względów wykonać (np. wymiatanie pamięci podręcnej) lub zarządzanie abstrakcyjnymi zasobami (np. kolejki wydruków, silniki baz danych, serwery stron www).
Start komputera
W czasie startu komputera (ang. boot) pierwsze ładowane jest jądro (np. w MS-DOS są to pliki IO.SYS i MSDOS.SYS), następnie jądro ładuje wymagane sterowniki (w MS-DOS następuje to w trakcie interpretacji pliku CONFIG.SYS), startuje programy usługowe i uruchamia powłokę (COMMAND.COM w MS-DOS).
Jeśli system przewiduje kontrolę dostępu, przed uruchomieniem powłoki autentykuje użytkownika.
Po starcie powłoki użytkownik może podjąć pracę, jao że powłoka daje mu możliwość uruchamiania własnych aplikacji. Często startująca powłoka wykonuje skrypt startowy aby skonfigurować środowisko użytkownika i uruchamia przy tym odpowiednie aplikacje (w MS-DOS skryptem startowym jest AUTOEXEC.BAT).
Rozdział 2: Zarządzanie czasem procesora
Definicje procesu, wieloprocesowości, wielodostępu i wywłaszcania procesora
Pierwsze systemy operacyjne pozwalały na wykonanie jednego programu na raz. W raz z rozwojem informatyki w szczególności pojawieniem się interakcyjnych wielodostępnych systemów operacyjnych, a później wprowadzeniem graficznych interfejsów użytkownika wystąpiła opotrzeba jednoczesnego uruchamiania na tym samym procesorze wielu programów w taki sposób by zminimalizować możliwości wzajemnych zakłóceń między procesami.
System operacyjny nazyway wielodostępnym, jeżeli wielu użytkowników może jednocześnie z nim pracować, każdy z nich ma wrażenie ciągłej pracy systemu na jego rzecz.
Podobną drogę przeszły mikrokomputery od systemu CP/M i MS-DOS do dzisiejszych MAC-OSa i MS Windows NT.
W nowoczesnym systemie operacyjnym dany program może być wykonywany przez wielu użytkowników jednocześnie, w związku z tym wprowadza się pojęcie procesu. Silberschatz et al w [2] definiują proces jako program, który jest wykonywany. Sprecyzować należy, że każdy załadowany do pamięci operacyjnej celem wykonania egzemplaż programu razem z danymi na których operuje stanowi oddzielny proces.
System operacyjny nazywamy wieloprocesowym jeżeli dopuszcza jednoczesne istnienie w nim wielu procesów. Takim systemem jest np. MS-DOS, przy czym w tym wypadku proces raz uruchomiony blokuje innym procesom dostęp do procesora aż do swego zatrzymania, dopiero wówczas może na nowo podjąć swe wykonanie jego proces macierzysty. Takim systemem nie jest np. CP/M, w którym może istnieć tylko jeden proces.
Jak to już stwierdzono w MS-DOSie po uruchomieniu procesu potomnego dany proces był zamrażany i faktycznie nie mógł się wykonywać aż do zakończenia potomka. Jeżeli oczekujemy od komputera z jednym procesorem aby był wielodostępny, musimy zadbać o to by dzielić czas procesora między różne procesy, niezależnie od tego, czy aktualnie wykonujący się proces ma ochotę zwolnić procesor, czy nie. Takim mechanizmem jest wywałaszczanie procesora.
Każdy proces w systemie wieloprocesowym z wywłaszczaniem w chwili uzyskania procesoraotrzymuje też kwant czasu. Po wyczerpaniu swego kwantu czasu proces jest przerywany, a na jego miejsce wykonywany jest inny proces. Wywłaszczony proces trafia na koniec kolejki procesów ubiegających się o procesor. Przykładami takich systemów są Unix, Windows NT i Windows 95.
Graf stanów procesu
Współbieżna praca więcej niż jednego procesu niesie z sobą mozliwość konfliktów przy dostępie do zasobów. W takich warunkach ujawnia się rola systemu operacyjnego jako dystrybutora zasobów. System operacyjny (a w zasadzie jego jądro) rozstrzyga konflikty o zasoby przydzielając je jednym ubiegająceym się o nie procesom a innne procesy powstrzymując do czasu zwolnienia zasobów przez dotychczasowych zwycięzców.
Proces, który zażądał dostępu do zasobu (w szczególności wykonania operacji we/wy) i go nie otrzymał nie może być dalej wykonywany aż do chwili uzyskania zasobu (zakończenia operacji we/wy). O takim procesie mówi się że jest w stanie uśpionym. Zwalnia on procesor pozwalając innym procesom na wykonywanie się.
W systemach z wywłaszczaniem procesora wyróżnia się pewien specjalny stan - oczekiwanie na przydział procesora. Mamy z nim do czynienia gdy proces posiada wszystkie niezbędne mu zasoby, nie wykonuje operacji wejścia wyjścia a czeka jedynie na przydzielenie mu [czasu] procesora. O takim procesie mówimy, że jest w stanie gotowy do wykonania.
Różne systemy operacyjne wyróżniają różny zestaw stanów, przez które przechodzi proces w trakcie życia, ale w każdym systemie wieloprocesowym z wywłaszczaniem można wyróżnić następujące stany:
Wykonywany - jest aktualnie wykonywany przez procesor,
Gotów do wykonania - oczekuje na swoją kolejkę do wykonania,
Uśpiony - oczekuje na dostęp do zasobu lub operrację wejścia/wyjścia, np. wcisnięcie klawisza przez użytkownika,
Niszczony - w trakcie zwalniania zasobów po zakończeniu.
Kolejki i priorytety
Procesy oczekujące na zwolnienie procesora mogą mieć różną ważność. Przykładowo, może to być proces dokonujący pomiaru w toczącym się eksperymencie, edytor teksu, proces systemowy uruchomiony celem zrobinia okresowych porządków i zadanie symulacji numerycznej pewnego układu fizycznego wykonywane długi czas w tle. Pierwsze dwa procesy mają to do siebie, że większość czasu oczekują na zajście operacji wejścia wyjścia, a gdy już to nastąpi, powinny natychmiast reagować, z kolei dwa ostatnie wykorzystują głównie czas procesora, ale nie są na tyle pilne, by nie mogły ustępować w razie potrzeby innym.
W zależności od pilności zadania i jego dotychczasowego przebiegu, system operacyjny nadaje procesowi priorytet. Generalnie, czym mniejszą liczbą jest wyrażony, tym lepiej z punktu widzenia procesu - ma więksy dostęp do procesora. Dla każdego priorytetu tworzona jest osobna kolejka procesów gotowych do wykonania. Dopóki w kolejce o priorytecie wyrażonym mniejszą liczbą czekają procesy, prcesy z kolejki większego priorytetu nie będą wykonywane.
Najmniejsze priorytety są zarezerwowane dla użytku systemu operacyjnego, są one do tego stopnia uprzywilejowane, że procesy wykonujące się z tymi priorytetami nie są wywłaszczane. Stąd też są używane jedynie w wyjątkowych okolicznościach przez krótkie procedury systemowe.
Użytkownik ma zwykle możliwość wyboru priorytetu dla uruchamianego procesu, jednakże jest w swym wyborze ograniczony "z dołu". System operacyjny rezewuje sobie możliwość zmiany priorytetu w trakcie działania procesu, celem wyrównania szans różnych procesów.
Wątki
Niektóre systemy operacyjne dopuszczają współbieżność w ramach jednego procesu. Określa się wówczas wątek jako jednostkę wykonania. Każdy wykonujący się proces ma przynajmniej jeden wątek, każdy wątek wykonuje się w ramach jednego procesu.
Wątki konkurują ze sobą o czas procesora. Pozostałe zasoby przydzielane są na rzecz procesu. System operacyjny zostawia programiście aplikacji wolną rękę w rozstrzyganiu konfliktów pomiędzy wątkami o dostęp do zasobów przydzielonych procesowi.
System operacyjny nazywamy wielowątkowym, jeżeli dopuszcza istnienie wielu wątków wykonania w ramach jednego procesu. Przykładami systemów wielowątkowych są Windows NT, Windows 95 i niektóre odmiany Uniksa.
W systemach nie będących wielowątkowymi pojęcie wątku i prcesu utożsamia się.
Przedstawiony na rys. 2.1 graf stanów procesu oraz kolejkowanie w systemie wielowątkowym dotyczy oczywiście wątków. Proces nie posiada stanów, jest kończony w momencie gdy skończy się jego ostatni wątek.
Jeżeli nie będzie to wyraźnie zaznaaczone, w dalszej części wykładu procesy i wątki będą ze sobą utożsamiane.
Kontekst procesu
Aby proces/wątek mógł być wznowiony od miejsca w którym przerwane zostało jego wykonanie, należy zachować pewne informacje o stanie procesora w chwili przerywania działania procesu. Zbiór wszystkich informacji niezbędnych do podjęcia prez proces działania z miejsca, w którym się znajduje nazywamy kontekstem procesu. Zdarzenie zapamiętania kontekstu aktualnego procesu i wprowadzenia do procesora wcześniej zachowanego kontekstu innego procesu celem rozpoczęcia jego wykonania nazywamy przełączeniem kontekstu.
Kontekst procesu składa się z zawartości rejestrów procesora, w szczególności wskaźnika instrukcji, rejestru flag stanu i wskaźnika stosu. W przypadku systemów z pamięcią wirtualną w skład kontekstu wchodzą tablice stron.
Procesy interakcyjne, wsadowe i demony
Nie wszystkie procesy wymagają ciągłej współpracy użytkownika w trakcie działania. Te które wymagają - nazywamy interakcyjnymi. Są to m.in. edytory tekstu, programy do odbierania poczty itp. Programy interakcyjne mają zawsze przypisany jakiś zasób umożliwiający konwersację z użytkownikiem. W przypadku Uniksa jest to terminal znakowy. W przypadku programu z graficznym interfejsem użytkownika jest to okienko graficzne na ekranie komputera.
Procesy nie wymagające uwagi użytkownika dzielą się na dwie kategorie:
demony - programy świadczące usługi dla systemu jako całości (program wymiatający pamięć podręczną) lub dla ogółu użytkowników (silnik bazy danych) oraz
zadania wsadowe - zadania uruchomione przez jednego użytkownika, wykonujące długotrwałe obliczenia, których nie trzeba nadzorować, np: sysmulacje numeryczne, tworzenie grafiki w oparciu o techniki śledzenia promieni, itp.)
System operacyjny dostarcza administratorowi narzędzi do uruchamiania i nadzorowania procesów pierwszego typu, a pozostałym użytkownikom drugiego typu.
Rozdział 3: Zarządzanie pamięcią
Do czego procesowi pamięć
Każdy prces działający w komputerze wymaga pamięci operacyjnej do przechowywania kodu swego prograamu i danych które przetwarza.
Dane, które przetwarza proces reprezentowane są przez zmienne programu. Przez zmienną programu rozumie się obszar pamięci o ustalonym adresie początkowym i długości, do którego można odwoływać się z programu poprzez symbol zwany nazwą zmiennej. Każda zmienna posiada swój typ, definiowany jako zbiór, którego elementy mogą być kodowane przez wartości zmiennej, np. typ char języka C koduje znaki zbioru ASCII lub liczby z przedziału -128 do 127. Typ decyduje o długości obszaru przeznaczonego na zmienną. Ważnymi typami zmiennych są zmienne wskaźnikowe. Przechowują one adresy (adresy początku obszaru) innych zmiennych.
Z punktu widzenia zarządzania pamięcią wyróżnia się trzy klasy zmiennych:
Zmienne statyczne - są tworzone przy starcie procesu i istnieją przez cały czas jego życia.
Określenie zmienna statyczna może być mylące. Zmienna ta, oczywiście, może być modyfikowana przez program. Określenie statyczna odnosi się do sposobu gospodarowania pamięcią tej zmiennej - rezerwuje się ją przy starcie a zwalnia przy końcu procesu. Przez cały czas życia procesu dany obszar pamięci wykorzystywany jest w ten sam sposób - na przechowywanie aktualnej wartości danej zmiennej.
Zmienne lokalne podprogramów zwane też automatycznymi - są tworzone dla każdego wywołania podprogramu i usuwane po jego zakończeniu.
Zmienne dynamiczne - są tworzone i usuwane w miarę potrzeby.
Wyróżnia się trzy zasadnicze grupy obszarów pamięci, z których korzysta proces:
Obszary zajmowane przez kod programu i bibliotek. Na pamięci wchodzącej w skład tych obszarów po załadowaniu programu (lub biblioteki) procesor wykonuje jedynie operacje odczytu. Obszary te mogą być wspólny dla różnych procesów wykonujących ten sam program, lub korzystających z tej samej bibloteki ładowanej dynamicznie.
Obszary zajmowany przez prywatne dane programu, w tym zmienne statyczne i dynamiczne. Obszar ten jest inicjowany przy starcie procesu początkowymi wartościami zmiennych globalnych (często zerami). W trakcie życia procesu dokonywane są zarówno operacje odczytu jak i zapisu. Obszar przechowujący zmienne dynamiczne nazywany jest stertą. Tworzenie i niszczenie zmiennych dynamicznych może powodować zwiększanie się i zmniejszanie tego obszaru w trakcie życia procesu. Każdy proces wymaga własnego obszaru prywatnych danych. Jeżeli proces składa się z wątków, wątki współdzielą obszar danych procesu.
Obszar stosu. W obszarze tym zapamiętuje się adresy powrotów z podprogramów oraz przechowuj zmienne lokalne (dla każdego wywołania podprogramu tworzony jest jego własny komplet zmiennych lokalnych). Obszar ten jest rezerwowany w pamięci przy starcie procesu. Z początku jest pusty. Wypełnia się i opróżnia w miarę jak wywoływane i kończone są poszczególne podprogramy. Każdy wątek wymaga własnego obszaru stosu.
Powyższe obszary pamięci bywają często nazywane segmentami odpowiednio kodu, danych i stosu.
Można wyróżnić dodatkowe obszary pamięci dostępnej procesowi:
Obszary systemowe. W nowoczesnych systemach operacyjnych dostęp do tych obszarów proces ma tylko wtedy, gdy wykonuje w trybie jądra podprogram jądra systemu operacyjnego.
Dane systemu operacyjnego w tym np. bufory dyskowe,
kod jądra systemu operacyjnego,
kod sterowników urządzeń w pamięci ROM,
adresowalna pamięć urządzeń wejścia wyjścia, np. pamięć obrazu karty graficznej.
Pamięć dzielona - obszary pamięci przechowujące dane, do których dostęp ma więcej niż jeden proces.
Pliki dyskowe mapowane na pamięć.
Rozważmy prosty program w C
#include <stdio.h>
#include <string.h>
char napis[] = "Hello world!";
void main()
{
char *tymczasowa;
tymczasowa=strdup(napis);
printf("%s\n",tymczasowa);
free (tymczasowa);
}
Rys. 3.1 Przykładowy program w C używający różnych klas zmiennych
W trakcie działania powyższego programu tworzone są (a potem usuwane) następujące zmienne:
zmienna statyczna ``napis '' zawierająca łańcuch "Hello World!";
bezimienna zmienna statyczna zawierająca łańcuch "%s\n";
zmienna lokalna funkcji ``main'' typu wskaźnikowego (wskaźnik do typu char) o nazwie ``tymczasowa'';
zmienna dynamiczna, będąca duplikatem zmiennej ``napis'', wskaźnik do niej podstawiany jest do zmiennej ``tymczasowa''.
inne zmienne zadeklarowane w standardowej bibliotece C, których deklaracje znajdują się w plikach nagłówkowych stdio.h i string.h
Przy starcie procesu wykonującego powyższy program w obszarze kodu programu znajdzie się skompilowana funkcja ``main'' oraz skompilowane niezbędne funkcje biblioteczne w tym funkcje ``printf'', ``strdup'' i ``free''. W obszarze danych statycznych utworzone będą zmienne ``napis'', bezimienna zmienna zawierająca łańcuch "%s\n" oraz niesprecyzowane tutaj bliżej zmienne tworzone dla potrzeb bibliotek.
Po zainicjowaniu pamięci proces zaczyna wykonywać swój kod poczynając od funkcji ``main''. W trakcie prologu tej funkcji rezerwowane jest na stosie miejsce na zmienną ``tymczasowa''. W trakcie wykonania (druga linijka) tworzona jest zmienna dynamiczna będąca duplikatem zmiennej ``napis'' a jej adres wstawiany jest do zmiennej ``tymczasowa''. Przy końcu programu zmienna dynamiczna (której adres wciąż przechowuje zmienna ``tymczasowa'') jest niszczona. Epilog funkcji ``main'' niszczy zmienną lokalną ``tymczasowa''. Zakończenie się tej funkcji kończy jednocześnie proces. W trakcie usuwania zakończonego procesu niszczone są pozostałe zmienne.
Gospodarka pamięcią w systemach bez mechanizmu pamięci wirtualnej
CP/M
Najprostszą gospodarkę pamięcią prezentuje system operacyjny CP/M. Ponieważ w systemie tym może istnieć tylko jeden proces, dostaje on całą pamięć w swoje władanie. System operacyjny iinformuje go jedynie, gdzie znajdują się jego obszary pamięci. Poza tym ostrzeżeniem, system operacyjny nie chroni swej pamięci przed procesem.
Systemy wieloprocesowe
W wieloprocesowych systemach operacyjnych należy stworzyć mechanizmy przydzielania pamięci wielu procesom oraz ochrony pamięci przydzielonej poszczególnym procesom i pamięci zajmowanej przez kod i dane jądra przed innymi procesami.
W pierwszych sysemach wieloprocesowych z ochroną pamięci uruchamiany proces otrzymywał sztywną pulę pamięci wyznaczną przez adresy graniczne. Proces musiał zmieścić swój kod i dane w zadanym obszarze. Użycie zmiennych dynamicznych było w związku z tym ograniczone. W przypadku odwołania się do adresów spoza wyznaczonych granic proces wpadał w pułapkę i był kończony.
MS-DOS
W systemie operacyjnym MS-DOS proces przy starcie może zarezerwować pewną ilość tzw. segmentów pamięci operacyjnej położonej poniżej adresu 655360. W trakcie życia może zarezerwować dodatkowe segmenty lub zwolnić je. Może też rezerwować i zwalniać pamięć powyżej 1MB. Nowy proces będzie uruchomiony pod warunkiem, że jest dość segmentów dla niego w obszarze pierwsych 640kB pamięci. MS-DOS nie zapewnia ochrony pamięci.
MS-Windows 3.x
Windows 3.x są nakładką na MS-DOS częściowo modyfikującą jego zachowanie, m in. zarządzanie pamięcią. Przede wszystkim znika ograniczenie wielkości pamięci procesu do 640kB. MS-Windows również nie zapewniają pamięci.
Obszary pamięci można rezerwować jako:
Fixed - Obszar ten cały czas dostępny jest pod adresami przydzielonymi mu przy rezerwacji. W obszarach tej klasy lokuje się kod, dane statyczne i stos procesu.
Movable - Aby odwoływać się do adresów w tym obszarze, należy go zablokować. System operacyjny gwarantuje, że po odblokowaniu zawartość obszaru nie będzie zniszczona, jednak nie gwarantuje, że po powtórnym zablokowaniu znajdować się będzie w tym samym miejscu pamięci. W związku z tym, adresy zmiennych zawartych w tym obszarze, po jego odblokowaniu tracą ważność. Obszary tej klasy wykorzystuje się na współdzielone dane i pewne mniej potrzebne zmienne dynamiczne.
Discardable - Aby odwoływać się do adresów w tym obszarze, należy go zablokować. Po odblokowaniu obszaru może on zostać zniszczony. W związku z tym, adresy zmiennych zawartych w tym obszarze, po jego odblokowaniu tracą ważność. Obszary tej klasy wykorzystuje się na pewne mniej potrzebne zmienne dynamiczne.
MS-Windows zapewnia dwa mechanizmy gospodarowania pamięcią:
Konsolidacja. W przypadku gdy dla nowotworzonego procesu, lub procesu, który zarządał pamięci brak miejsca, odblokowane obszary klasy discardable są niszczone, a odblokowane obszary klasy movable przesuwane tak by utworzyć spójny obszar mogący zaspokoić żądanie.
Wymiana. Jeżeli powyższe operacje nie pozwalają uzyskać spójnego obszaru pamięci odpowiedniej wielkości, jeden lub więcej z obszarów klasy fixed, lub zablokowanych obszarów klas movable i discardable należących do innych procesów trafia na dysk do pliku wymiany. Zmiana kontekstu (uzyskanie procesora przez inny proces) powoduje że obszary pamięci danego procesu umieszczone w pliku wymiany są sprowadzane do pamięci operacyjnej, a obszary należące do innych procesów, pokrywające się w pamięci operacyjnej z nimi są konsolidowane lub trafają do pliku wymiany.
Jak widać na rysunku 3.2 pomimo zastosowania konsolidacji pamięci, jest ona wciąż pofragmentowana, choć największy spójny obszar znacząco wzrósł. Fragmentacja pamięci powoduje, że żądania przydziału pamięci, domagające się mniej pamięci niż jest w sumie wolne, ale więcej niż zawiera największy spójny obszar mogą nie zostać spełnione.
Z pomocą przychodzi wymiana (mechanizm zapewniany przez system operacyjny) i nakładkowanie (mechanizm zapewniany przez programistę lub jego kompilator). Polegają one na czasowym usuwaniu pewnych obszarów pamięci na dysk do specjalnie utworzonego pliku wymiany. Mechanizmem nakładkowania nie będziemy się tu zajmować, jest on zbliżony do mechanizmu wymiany, a dotyczy głównie wymiany zestawów podprogramów.
Wadą mechanizmu wymiany jest to, że pamięć jest usuwana na dysk wielkimi blokami, a w razie przełączenia kontekstu cała pamięć procesu musi być przeniesiona od razu z pliku wymiany do pamięci operacyjnej. Nie można również zarezerwować obszaru większego niż dostępna pamięć operacyjna.
Mechanizm pamięci wirtualnej
Zalety i wady
Mechanizm pamięci wirtualnej nie posiada wad przedstawionych w poprzednim paragrafie. Jego cechy to:
Powstanie prywatnych przestrzeni adresowych dla każdego procesu. Procesy nie widzą nawzajem swoich przestrzeni adresowych.
Niewidoczny dla procesu podział pamięci na niewielkie (rzędu 1kB) obszary pamięci podlegające wymianie zwane stronami.
Praktyczne nieistnienie problemu fragmentacji pamięci.
Możliwośc przechowywania w pamięci operacyjnej w trakcie wykonywania procesu jedynie najczęściej ostatnio używanych stron. Długo niewykorzystywane strony trafiają na dysk do pliku wymiany. Przy przełączaniu kontekstu nie ma potrzeby ładować całej przestrzeni adresowej do pamięci operacyjnej, wystarczy strona z komórką zawierającą następną instrukcję programu, oraz strona z wierzchem stosu.
Proces ma iluzję posiadania przez maszynę znacznie większej ilości pamięci operacyjnej niż ma ona w rzeczywistości, w szczególności można tworzyć zmienne o rozmiarze przekraczającym rozmiar pamięci operacyjnej.
Możliwość poddania ochronie obszarów przestrzeni adresowej procesu, w szczególności obszarów systemowych, obszaru kodu i pamięci współdzielonej.
Możliwość spójnego implementowania pamięci wirtualnej, pamięci współdzielonej, mapowania pliku na pamięć operacyjną i buforowania operacji dyskowych.
Wadami mechanizmu pamięci wirtualnej są
Narzut na pamięć związany z przechowywaniem dodatkowych struktur danych t.j. tablic stron.
Narzut na wydajność i złożoność procesora związany z wyliczaniem adresów fizycznych z adresów wirtualnych.
Narzut na wydajność systemu związany z koniecznością wczytania do procesora częsci tablicy stron nowego procesu przy przełączaniu kontekstu.
Narzut na wydajność systemu związany z operacjami dyskowymi wymiany stron. Trzeba tu jednak zaznaczyć, że dobre algorytmy wymiany stron minimalizują ten narzut.
Zasada działania
Najistotniejszym elementem mechanzmu jest rozróżnienie między adresem logicznym a fizycznym komórki pamięci i sposób odwzorowania adresu logicznego na fizyczny.
Adresem fizycznym komórki nazywamy adres, jaki wysyła na magistralę adresową procesor, aby odwołać się do tej komórki. Każda komórka pamięci operacyjnej ma swój niezmienny adres fizyczny. Każdy adres fizyczny odnosi się zawsze do tej samej komórki pamięci lub jest zawsze błędny.
Adresem logicznym (lub wirtualnym) nazywamy adres jakim posługuje się program, aby odwołać się do zmiennej lub instrukcji. Adres logiczny może odnosić się zarówno do komórki pamięci operacyjnej jak i słowa maszynowego zapisanego na dysku. Przypisanie adresu logicznego do konkretnej komórki pamięci, czy konkretnego miejsca na dysku jest inne dla każdego procesu i może się zmieniać w trakcie jego życia.
Pamięć operacyjna dzielona jest na ramki, to jest spójne obszary o stałym romiarze zwanym wielkością ramki. Przestrzeń adresów wirtualnych dzielona jest na strony, to jest spójne obszary o stałym rozmiarze zwnym wielkością strony. Wielkość strony równa się wielkości ramki i jest wielokrotnością rozmiaru sektora dyskowego. Wielkość strony jest rzędu 1kB, i tak, w systemie VMS wynosi ona 512B, w Linuksie - 1kB a w Windows NT - 4kB.
Analogicznie do pamięci operacyjnej, można przyjąć, że plik wymiany dzieli się również na ramki. Strona pamięci wirtualnej może znajdować się w jednej z ramek pamięci operacyjnej, jednej z ramek pliku wymiany lub być stroną niezarezerwowaną (błędną). Odwzorowania stron pamięci wirtualnej w ramki pamięci operacyjnej lub ramki pliku wymiany dokonuje procesor za każdym razem, gdy oblicza adres fizyczny z adresu wirtualnego (celem pobrania instrukcji, lub odwołania się do zmiennej). Do odwzorowywania stron w ramki służą mu tablice stron wirtualnych. Szczegóły tłumaczenia adresu logicznego na fizyczny w prypadku, gdy strona znajduje się w pewnej ramce pamięci operacyjnej ilustruje rys. 3.3.
Adres logiczny składa się z dwóch cęści: numery strony i przesunięcia na stronie. Numer strony służy jako indeks do tablicy stron wirtualnych. W tablicy tej odnajdywana jaest pozycja odpowiadająca dnej stronie. Na podstawie atrybutów procesor ustala, czy strona znajduje się w pamięci operacyjnej i jeśli tak, pobiera numer ramki po czym łączy go z przesunięciem na stronie otrzymując adres fizyczny, który może być wysłany na magistralę adresową.
Jeżeli atrybut dostępności strony wskazuje, że znajduje się ona w pamięci wymiany, następuje tzw. ``page fault'' - wyjątek pamięci wirtualnej. Procesor przerywa proces (wątek), który odwołał się do nieobecnej strony i przenosi go w stan uśpiony. Jednocześnie podejmowane są działania mające na celu sprowadzenie strony do pamięci t.j. wyszukiwana jest wolna ramka. Jeśli wolnej ramki brak, jedna z ramek zajętych zapisywana jest na dysk i zwalniana. Uzyskana ramka pamięci operacyjnej zapełniana jest zawartością przywracanej strony przechowywaną w pliku wymiany.
Tablice stron mogą rezydować tak jak to pokazano na rysunku w specjalnych obszarach pamięci, które są znane procesorowi przez ich adres fizyczny (a nie logiczny) lub też mogą być częściowo przechowywane w podręcznej pamięci asocjacyjnej procesora. Wiele systemów operacyjnych dopuszcza by część tabeli stron mogła być przenoszona do pliku wymiany.
Duża część mechanizmu pamięci wirtualnej musi być realizowana sprzętowo przez procesor. System operacyjny dochodzi do głosu gdy następuje page fault i trzeba sprowadzić stronę do pamięci, usuwając być może inną stronę oraz dokonać przełączenia kontekstu. Mechanizm ten może zatem działać jedynie w systemach operacyjnych działających na procesorach wspierających go, takich jak np. Intel i386 i nowsze procesory Intela, procesory Alpha, nowsze procesory Motorolli itd.
Izolacja procesów i ochrona pamięci.
Aby zapewnić każdemu procesowi prywatną przestrzeń adresową, dostaje on własną tablicę stron wirtualnych. W związku z tym tablica ta jest elementem kontekstu procesu. Przełączenie kontekstu wymaga wczytania do procesora tablicy stron nowego procesu (a przynajmniej jej części).
Atrybutem strony może być uprawnienie procesu do posługiwania się tą stroną:
Uprawnienie do odczytu i zapisu (read/wite). To uprawnienie otrzymują strony obszarów danych i stosu programu.
Uprawnienie do odczytu (read only). To uprawnienie nadaje się m.in. stronom zawierającym kod programu. Można dzięki temu współdzielić te strony między procesami wykonującymi ten sam program bez obawy, że jeden proces zmodyfikuje kod programu i tym samym wpłynie katastrofalnie na przebieg działania drugiego procesu.
Uprawnienie zabraniające wszelkich operacji (no access). Tym atrybutem oznacza się strony przechowujące kod i dane jądra systemu operacyjnego oraz strony nie zarezerwowane dotąd przez proces.
Niektóre systemy operacyjne wyróżniają bardziej złożony system uprawnień np. copy on write i execute only, pod warunkiem, że procesor wspiera takie upranienia.
Proces, diałając w trybie użytkownika, nie ma możliwości bezpośredniej zmiany zawartości tablicy stron. Może on zlecić systemowi operacyjnemu rezerwację nowych stron (np. na zmienne dynamiczne) lub zwolnienie tych które przestał używać. Odbywa się to przez wywołanie odpowiednich podprogramów jądra (działających w trybie jądra).
Rozdział 4: Zarządzanie wejściem-wyjściem
Ogólna architektura podsystemu wejśia/wyjścia
Ogólną architekturę wejścia/wyjścia przedstawiono na rys. 4.1.
Na sprzęt (patrz rozdział 1 i rys. 1.1) składa się pewna ilość urządzeń wejścia wyjścia zwanych dalej urządzeniami fizycznymi (ang. phisical device), każde z tych urządzeń sterowane jest przez sterownik sprzętowy (ang. hardware controller).
Do komunikacji z urządzeniami fizycznymi wykorzystuje się zasoby urządzeń t.j. rejestry we/wy, przerwania, adresowalną pamięć urządzeń i kanały DMA.
Jądro systemu operacyjego zawiera pewną ilość modułów zwanych stertownikami programowymi urządzeń (ang. device driver), które potrafią sterować urządzeniami. Jeden sterownik może obsługiwać wiele urządzeń podobnego typu (np. sterownik dysków) lub uzupełniających się typów (np. sterownik terminala obsługuje klawiaturę i kartę graficzną wraz z monitorem).
Sterowniki programowe tworzą dla wyższych warstw oprogramowania urządzenia logiczne (ang. logical device). Urządzenie logiczne jest obiektem będącym abstrakcją urządzenia fizycznego. Na urządzeniu logicznym można dokonywać operacji zapisu i odczytu poprzez podprogramy dostarczane przez sterownik. Wyższe warstwy oprogramowania nie muszą znać szczegółów sterowania danym urządzeniem.
Wsród urządzeń logicznych można wyodrębnić następujące typy:
Urządzenia znakowe lub strumieniowe (ang. character device). Z urządzenia znakwego można czytać w sposób sekwencyjny ciągi bajtów, lub w sposób sekwencyjny zapisywać ciągi bajtów.
Przykłady urządzeń fizycznych dla których tworzy się logiczne urządzenia znakowe: zegar systemowy, porty szergowe i równoległe oraz widoczne przez nie drukarki, modemy, myszy i terminale, komsola, streamery itp.
Urządzenia blokowe (ang. block device). Z urządzenia blokowego można odczytywać i zapisywać bloki bajtów określonej dla danego urządzenia wielkości. Dostęp do danych w urządzeniu blokowym w przeciwieństwie do urządzeń znakowych jest swobodny t.j. poprzez podanie adresu bloku.
Przykłady urządzeń fizycznych dla których tworzy się logiczne urządzenia blokowe: dyski, niektóre skanery.
Inne. Urządzenia te oferują funkcje, która wykraczają znacząco poza operacje odczytu/zapsu na urządzeniu znakowym lub blokowym.
Przykłady urządzeń: karty sieciowe, karty graficzne.
Modyły jądra odpowiedzialne za wyższe funkcje to moduły systemów plików, protokołów sieciowych, interfejsu użytkownika itp.
Systemy plików mogą być zakładane na urządzeniach blokowych. System plików umożliwia przechowywanie na tym samym urządzeniu różnych informacji w sposób pozwalający wyszukać potrzebne zbiory danych oraz zabezpieczyć dane przed niepowołanym dostępem.
Wyższe funkcje we/wy dostępne są przez tzw. API (application programmer's interface - interfejs programisty aplikacji) czyli zbiory podprogramów dostępnych do wywołania przez aplikacje.
Istnieją pewne złożone operacje, które nie powinny lub nie muszą być wykonywane w jądrze systemu operacyjnego ze względu np. na wydajność systemu, dążenie do zmniejszenia stopnia komplikacji jądra czy bezpieczeństwo. Do wykonania tych operacji uruchamia się przy starcie systemu programy usługowe zwane też demonami (ang. daemon). Przykłady zastosowań: zarządzanie kolejkami wydruków, implementacja części usług sieciowych czy wymiatanie buforów dyskowych.
Programy usługowe i aplikacje mogą się odwoływać bezpośrednio do urządzeń logicznych, jeżeli konfiguracja systemu na to pozwala lub do odpowiednich API. Żadna warstwa oprogramowania z wyjątkiem sterowników programowych nie odwołuje się bezpośrednio do sprzętu.
Zasoby urządzeń fizycznych
Zasoby urządzeń fizycznych umożliwiają procesorowi i wykonywanemu się na nim oprogramowaniu komunikować się z urządzeniami fizycznymi. Wyróżnia się cztery klasy zasobów urządzeń fizycznych:
rejestry we/wy (ang. I/O registers),
przerwania (ang. interrupts),
adresowalna pamięć sterownika,
kanały DMA.
Rejestry we/wy
Rejestry we/wy to rejestry sterowników sprzętowych, do których procesor może wpisywać (lub odczytywać) dane podane na magistralę danych, podając na magistralę adresową adres rejestru. Wiele procesorów informuje o operacjach na rejestrach we/wy podając sygnał na specjalną ścieżkę w magistrali sterującej, co pozwala oddzielić przestrzeń adresową pamięci fizycznej od przestrzeni adresowej rejestrów we/wy. Rozwiącanie to zastosowano w procesorach Intela. Istnieją procesory, które nie rozróżniają pamięci operacyjnej i rejestrów we/wy, jak np. Motorolla 6502. Komplikuje to pracę projektantom magistral.
Funkcje rejestrów we/wy mogą być różne. Zapis do pewnego rejestru może być komendą dla sterownika sprzętowego urządzenia. Inne rejestry służą jako bufory wejścia wyjścia - należy do nich wpisyswać dane wysyłane do urządzenia a odczytywać dane przychodzące z urządzenia. Jeszcze inne rejestry pozwalają odczytać status urządzenia lub ostatnio wykonanej operacji.
Adresy rejestrów we/wy danego sterownika sprzętowego często mogą być modyfikowane. Nadaje się je ustawiając zworki na karcie sterownika (np. dawne modele kart sieciowych zgodnych z NE2000), konfigurując programem SETUP (np. adresy portów szeregowych) lub programem dostarczonym przez producenta urządzenia (np. karty sieciowe ISA 3Com) lub poprzez fakt włączenie karty w konkretne gniazdo magistrali (np. karty PCI).
O ustawieniu adresów we/wy na sterowniku sprzętowym należy poinformować sterownik programowy (ang. driver), aby mógł się poprawnie odwoływać do danego urządzenia. Nowsze sterowniki programowe potrafią same wykryć adresy we/wy swoich sterowników fizycznych.
Adresy we/wy nie muszą tworzyć spójnej przestrzeni adresowej jak to było z pamięcią fizyczną. Jeżeli adresy we/wy dwóch sterowników pokrywają się, to urządzenia te nawzajem przeszkadzają sobie w pracy. Mówimy wtedy o konflikcie adresów we/wy. Konflikt rozwiązuje się nadając jenemu z urządzeń inne adresy we/wy i informując o tym sterownik programowy danego urządzenia.
Rejestry we/wy zapewniają przepływ niewielkich paczek informacji w obie strony (procesor <-> urządzenie). Inicjatorem komunikacji jest zawsze procesor.
Przerwania
Przerwana to sygnały jakie wysyłają sterowniki sprzętowe aby poinformować procesor o istotnym zdarzeniu, które wymaga poświęcenia przez procesor uwagi danemu urządzeniu. Przykładami takich wydarzeń może być wciśnięcie klawisza, zakończenie operacji dyskowej, nadejście pakietu informacji do karty sieciowej itp.
Aby odróżnić zdarzenia pochodzące od różnych urządzeń, poszczególnym sterownikom sprzętowym przypisuje się numery przerwań w podobny sposób jak to było z adresami we/wy, przy czym zakres numerów przerwań sprzętowych jest niewielki i przykładowo wynosi od 0 do 15 dla komputerów o architekturze PC/AT. Konflikt numerów przerwań może być równie katastrofalny w skutkach jak konflikt adresów we/wy. Podobnie jak z adresami we/wy, o ustawieniu numeru przerwania w sterowniku sprzętowym należy poinformować odpowiedni sterownik programowy.
Po otrzymaniu przerwania procesor przerywa aktualnie wykonywany proces, zapisuje część swego kontekstu na stosie (przynajmniej wskaźnik instrukcji i rejestr flagowy) i przechodzi do wykonania podprogramu obsługi przerwania zarejestrowanego dla danego numeru przerwania. Podprogram ten pochodzi ze sterownika programowego danego urządzenia i został zarejestrowany w trakcie inicjacji sterownika. Po zakończeniu obsługi przerwania sterowanie wraca do przerwanego procesu, który wykonuje się dalej tak jakby nie został przerwany.
Istnieje hierarchia przerwań, tzn. pewne przerwania mogą być przerywane przez inne umieszczone wyżej w hierarchii.
Aby zwiększyć szybkość reagowania na przerwania podprogram obsługi przerwania wykonuje się w kontekście procesu, który został przerwany, co pociąga za sobą możliwość manipulowania danymi procesu przez podprogram obsługi przerwania pochodący ze źle lub złośliwie napisanego sterownika programowego.
Adresowalna pamięć
Adresowalna pamięć sterownika to część pamięci RAM lub ROM sterownika sprzętowego, która jest widoczna dla procesora w przestrzeni adresów fizycznych pamięci. Przykłady zastosowań: pamięć obrazu karty graficznej, pamięć ROM zawierająca kod podprogramów wchodzących w skład sterownika programowego danego urządzenia.
Kanały DMA
Kanały DMA (direct memory access - bezpośredni dostęp do pamięci) są to narzędzia jakie udostępniają magistrale sterownikom sprzętowym we/wy, aby te mogły bezpośrednio czytać lub pisać do pamięci operacyjnej (bez pochłaniania uwagi procesora). Podczas gdy sterownik sprzętowy dokonuje operacji przez kanał DMA magistrala stgerująca blokuje procesorowi dostęp do całości lub części pamięci. Z kanałów DMA korzystają sterowniki urządzeń przesyłających dane z wielkimi prędkościami takich jak dyski, karty sieciowe czy kardt dźwiękowe.
Kanały DMA mają swoje numery, do których przydzielania odnoszą się podobne uwagi co do przydziału adresów we/wy.
Sterowniki i urządzenia logiczne
Sterownik programowy (ang. device driver) to zbiór podprogramów pozwalających sterować danym urządzeniem (urządzeniami) fizycznym. Dla poprawnej pracy sterownik musi znać zasoby sterownika sprzętowego urządzenia fizycznego, poprzez które może się z nim komunikować. Jeżeli sam nie potrafi ich znaleźć, należy podać mu je podczas konfiguracji.
Pojedyńczy sterownik może obsługiwać wiele urządzeń fizycznych tego samego typu (np. dysków) lub typów uzupełniających się (np. klawiatura i ekran).
Wyższym warstwom oprogramowania sterownik prezentuje pewną ilość urządzeń logicznych (ang. logical device). Każde urządzenie logiczne ma swoją unikalną nazwę np. "A:", "C:", "COM1:" w MS DOS czy "/dev/fd0", "/dev/hda1", "/dev/cua0" w Linuksie (podobne nazwy są w innych systemach uniksowych).
W MSDOSie nazwy urządzeń logicznych nie mogą być dłuższe niż 9 znaków łącznie z obowiązkowym końcowym znakiem dwukropka ":". W MS Windows NT nazwy urządzeń logicznych umieszczone są w drzewie nazw obiektów systemowych, dodatkowo istnieje mechanizm tłumaczenia nazw MSDOSa na nazwy obiektów MS Windows NT. W uniksie każdemu urządzeniu logicznemu udostępnionemu przez administratora odpowiada plik specjalny w katalogu "/dev", stąd nazwy urządzeń zaczynają się na "/dev/".
Urządzenia logiczne reprezentują abstrakcje urządzeń fizycznych:
Urządzenia logiczne mogą wprost odpowiadać urządzeniom fizycznym. Np. w MSDOS urządzenie logiczne "COM1:" odpowiada pierwszemu portowi szeregowemu i w konsekwencji przypiętej do niego myszce.
W niektórych przypadkach wiele urządzeń logicznych odpowiada temu samemu urządzeniu fizycznemu. Dzieje się tak gdy urządzenie daje się na pewnym poziomie abstrakcji podzielić na kilka odrębnych fragmentów. Np. w systemie MSDOS działającym na komputerze z jednym dyskiem podzielonym na dwie partycje, urządzenia logiczne "C:" i "D:" odpowiadają poszczególnym partycjom tego samego dysku fizycznego. Inny przykład: naświetlarka t.j. urządzenie do naświetlania klisz do offsetu może być widoczna jako kilka drukarek logicznych, każda drukarka logiczna reprezentuje inne parametry naświetlania (takie jak rozdzielczość).
Możliwa jest również sytuacja gdy jedno urządzenie logiczne odpowiada więcej niż jednemu rządzeniu fizycznemu, np. "/dev/console" w linuksie odpowiada konsoli znakowej, czyli klawiaturze i monitorowi.
Sterownik programowy urządzenia zapewnia m.in.:
podprogramy obsługi przerwań obsługujące przerwania danego urządzenia,
podprogramy implementujące operacje na urządzeniach logicznych jakie dany sterownik dostarcza wyższym warstwom,
podprogramy do wykonania czynności organizacyjnych zlecanych przez system operacyjny takich jak np. inicjacja urządzenia.
Sterowniki programowe urządzeń mogą być dostarczne przez firmy niezależne od producenta systemu operacyjnego w szczególności przez proucentów urządzeń we/wy. Najbardziej fundamentalne sterowniki takie jak sterowniki dysków, klawiatury, karty graficznej i monitora przychodzą razem z systemem operacyjnym. System operacyjny musi dawać się rozszerzać o inne sterowniki oraz definiować i egzekwować normy, których przestrzeganie pozwoli współistnieć w jednym systemie operacyjnym sterownikom programowym pochodzącym od różnych producentów.
Po zainstalowaniu, sterownik programowy staje się częścią systemu operacyjnego, w związku z czym, sterowniki nieznanego pochodzenia mogą stanowić wyłom w bezpieczeństwie systemu.
Urządzenia dyskowe
Budowa urządzeń dyskowych
Dysk jest urządzeniem blokowym przeznaczonym do przechowywania dużych ilości danych. Najmniejszą porcję danych jaka może być odczytana/zapisana na dysk nazywamy sektorem.
Obecnie budowane dyski składają się z pewnej ilości talerzy (ang. plate) na których dwustronnie zapisywana jest informacja przez kolumnę głowic (ang. head) odczytująco-zapisujących. Na każdym talerzu wyodrębnić można ścieżki (ang. track) w postaci koncentrycznych okręgów, na których przy ustalonym położeniu kolumny głowic zapisywana jest informacja. Ścieżki należące do różnych dysków odpowiadające ustalonemu położeniu kolumny głowic nazywa się cylindrem (ang. cylinder). Na każdej ścieżce wyodrębnia się pewną ilość sektorów.
Bezpośredni kontroler dysku jest najczęściej zintegrowany z dyskiem. Do komputera dysk jest przyłączony poprzez magistralę dyskową i adapter - sterownik sprzętowy magistrali dyskowej. Popularnie stosowane są dwa rodzaje magistral dyskowych i związanych z nimi protokołów komunikacji z dyskami:
IDE (Integrated Drive Electronics - zintegrowany kontroler dysku), którego nowsze wersje występują pod akronimami: ATA (AT Attachment Interface - interfejs przyłącza architektury AT), EIDE (Enhanced IDE - rozszerzony IDE), ATA-2, Fast-ATA, ATAPI (ATA Packet Interface - interfejs pakietowy do ATA, wzorowany na SCSI, używany do napędów CD-ROM). Do magistrali IDE można prezyłączyć 1 adapter i maksymalnie 2 dyski. Jeden z dysków pełni rolę nadrzędną (ang. master) w stosunku do drugiego (ang. slave). W wytwarzanych obecnie komputerach PC najczęściej dwa adaptery (pierwszy - primary i drugi - secondary) IDE są zintegrowane z płytą główną, pozwalając obsługiwać maksymalnie 4 dyski. Zaletą standardu IDE jest niski stopień komplikacji sterowników sprzętowych a co za tym idzie niska cena. Wadą jest mała elastyczność, rozszerzalność i wydajność. Niska wydajność (w porównaniu ze SCSI) wynika z przyjętego protokołu, który blokuje magistralę IDE, a przez to drugi dysk do czasu wykonania operacji.
SCSI (small computer system interface - interfejs małych systemów komputerowych) zaprojektowany początkowo dla minikomputerów okazał się bezkonkurencyjny przy budowie serwerów i silnych stacji roboczych oraz przyłączaniu do komputera urządzeń niekoniecznie dyskowych produkujących lub konsumujących duże ilości danych (takich jak np. skanery i naświetlarki). Do magistrali SCSI można przyłączyć do 8 lub w nowszych wersjach do 16 urządzeń. Jednym z nich jest adapter komputera zarządzający magistralą (ang. host adapter). Zaletą tego rozwiązania jest jego elastyczność i duża wydajność. Protokół SCSI pozwala by adapter wysyłał zlecenia do urządzenia podczas gdy urządznie to lub inne przyłączonego do tej samej magistrali wciąż jeszcze wykonuje swoje poprzednie zlecenie. Wadą jest duży stopień komplikacji urządzeń a przez to wyskoa cena.
Wydajność dysku (ang. overall disk speed) charakteryzują parametry:
Prędkość transferu danych z dysku do sterownika (ang. data transfer rate) - jest to prędkość, z jaką dysk jest w stanie przesyłać dane na magistralę łączącą go z adapterem. Traci na znaczeniu, gdy odwołania do dysku następują w dużej ilości do przypadkowych miejsc.
Średni czas dostępu do sektora (ang. average seek time) - jest to średni czas potrzebny głowicy na znalezienie się nad losowo wybranym sektorem.
Ilość obrotów dysku na minutę (rpm - ang. reverses per minute) i związany z tym średni czas oczekiwania głowicy na odczyt/zapis sektora na tej samej ścieżce (ang. average track seek time). Ten czynnik ma duże znaczenie gdy odwołania następują w wiekszości do sąsiednich sektorów dysku, co dzieje się przy wczytywaniu dużych niepofragmentowanych plików.
Ilość pamięci podręcznej na danym dysku (ang. internal disk cache size). Wewnętrzna pamięć podręczna dysku pozwala przyspieszyć operacje na dysku:
zmniejszeniu ulega ilość fizycznych odczytów/zapisów dysku dzięki przechowywaniu ostatnio odczytanych/zapisanych sektorów oraz
można zaimplementować mechanizm czytania sektorów z wyprzedzeniem.
Organizacja logiczna dysku
Dysk jest charakteryzowany przez następujące zależne od siebie parametry, od których zależy pojemność dysku:
geometrię: ilość zapisywalnych stron talerzy (ang. sides) = ilość głowic (ang. heads), ilość cylindrów, ilość sektorów na ścieżce (ang. sectors per track), rozmiar sektora (ang. sector size);
ilość wszystkich sektorów, rozmiar sektora;
Sektory na dysku można posortować w/g numeru cylindra, numeru głowicy i numeru sektora na ścieżce a następnie w tej kolejności ponumerować. Powstaje w ten sposób płaski numer sektora. Niektóre dyski dopuszczają by do ich sektorów odwoływać się poprzez podanie płaskiego numeru sektora, inne wymagają podania tzw. parametrów geometrycznych tj. numeru głowicy, numeru cylindra i numeru sektora na ścieżce.
Utworzenie na dysku ścieżek i sektorów na ścieżkach nazywamy formatowaniem niskopoziomowym. Formatowanie niskopoziomowe przeprowadzane jest najczęściej u producenta lub jako pierwsza czynność po zainstalowaniu dysku w systemie. W czasie formatowania niskopoziomowego dokonywane jest także sprawdzanie zdatności nośnika magnetycznego. Przeprowadzenie formatowania niskopoziomowego wymazuje z dysku wszelkie informacje (łącznie z tablicą partycji).
Na dysku można wydzielać obszary zwne partycjami, przydzielane różnym systemom plików, być może należących do różnych systemów operacyjnych. Wiele systemów plików wymaga aby ich partycje zawierały pełne cylindry. Opis podziału dysku na partycje znajduje się w tzw. tablicy partycji umieszczonej na początku dysku. Zmiana podziału na partycje niszczy zawartość partycji, których rozmiar lub położenie uległo zmianie. Do manipulacji tablicą partycji służy program fdisk.
Na każdym dysku obsługiwanym przez MSDOS, MS Windows 3.xx lub 95 może istnieć jedna partycja podstawowa FAT16 lub FAT32 oraz jedna partycja rozszerzona z pewną ilością podpartycji FAT16 lub FAT32.
Po utworzeniu partycji należy na każdej z nich zapisać dane niezbędne do poprawnego funkcjonowania systemu plików. Ten proces nazywamy formatowaniem wysokopoziomowym. Formatowanie wyskokpoziomowe może zniszczyć dane zapisane na danej partycji.
Jeżeli system operacyjny startuje z dysku, jedna z partycji, tzw. partycja aktywna powinna zawierać program ładujący jądro systemu operacyjnego oraz wszystkie inne pliki niezbędne do startu systemu. Program ładujący jadro bywa umieszczany w zerowym sektorze dysku, zwierającym też tablicę partycji zwanym sektorem startowym (ang. bootsector).
System operacyjny łączy sektory dyskowe w większe jednostki, które traktuje nierozdzielnie przy przydzielaniu ich plikom. Jednostki te nazywają się w różnych systemach: jednostkami alokacji (ang. allocation unit), blokami (ang. block) klasterami (ang.cluster). Przykładowe rozmiary jednostek alokacji to:
512 B = 1 sektor - SCO Unix, MSDOS FAT16 dla partycji nie większych niż 32 MB
1kB = 2 sektory - Linux Ext2, MSDOS FAT16 dla partycji nie większych niż 64 MB
4kB = 8 sektorów - Novell Netware, MSDOS FAT16 dla partycji nie większych niż 256MB, MS Windows NT NTFS, MS Windows 95 FAT32.
Programowe sterowniki dysków wykorzystują pamięć podręczną przy dostępie do dysków. W pamięci podręcznej przechowywane są jednostki alokacji, na których ostatnio dokonywano operacji (zapis na dysk nie następuje natychmiast) oraz te, o których sądzi się, że w niedługim czasie będą odczytywane. Przyspiesza to czas operacji na często używanych plikach, lub gdy wczytuje się dane z pliku w sposób sekwencyjny. W MSDOSie i MS Windows 3.11 rozmiar dyskowej pamięci podręcznej należało ustawić ręcznie. W nowszych systemach rozmiar ten ustalany jest automatycznie na podstawie ilości dostępnej pamięci i częstości operacji na dysku.
Systemy plików
Pliki
Systemy plików mają zapewnić możliwość przechowywania zbiorów danych na urządzeniach zewnętrznych komputera w sposób pozwalający na późniejsze odwoływanie się do danych, ich przetwarzanie oraz łatwe wyodrębnianie, kopiowanie, przenoszenie i usuwanie do i z systemu.
Plikiem lub zbiorem danych (ang. file) nazywamy ciąg bajtów określonej długości stanowiący dla systemu plików atomiczną całość, wyposażony w nazwę i inne atrybuty zależne od systemu plików takie jak daty utworzenia, ostatniej modyfikacji, dostępu, flagę archiwizacji, czy uprawnienia.
Strumieniem (ang. stream) nazywamy obiekt z którego można czytać lub do którego można zapisywać dane w sposób sekwencyjny (bajt po bajcie). Strumienie stanowią ważną abstrakcję danych, wykorzystywaną m.in. przy dostępie do plików. Przykładami strumieni mogą być poza zwykłymi plikami znakowe urządzenia logiczne (w szczególności terminale).
Wiekszość systemów plików zapewnia do zwykłych plików zarówno dostęp sekwencyjny (tak jak do strumienia) jak i swobodny (w dowolnym momencie można powoływać się na dowolny bajt, lub ciąg bajtów pliku podając adres pierwszego bajtu i długość ciągu).
Katalogi
Aby ułatwić odszukiwanie plików, tworzy się hierarchiczną strukturę zwaną drzewem katalogów.
Katalogiem (ang. directory) nazywamy plik interpretowany przez system plików jako listę odwołań do innych plików. Jako synonimy katalogu stosuje się także nazwy folder i kartoteka.
Wszystkie obecnie spotykane systemy plików dopuszczają aby katalogi zawierały inne katalogi (tzw. podkatalogi ang. subdirectory), przy czym wymaga się, aby graf katalogów był drzewem (ang. tree) skierowanym. Każdy katalog ma co najwyżej jeden nadkataolg (ang. updir). Istnieje dokładnie jeden katalog będący korzeniem drzewa katalogów, który nie posiada swego nadkatalogu (lub sam jest sobie nadkatalogiem, ang. root directory). Niektóre systemy plików (np. uniksowe systemy plików) dopuszczają aby ten sam plik mógł się znajdować w wielu katalogach jednocześnie lub w tym samym katalogu pod różnymi nazwami. W takich systemach plików katalogi i pliki tworzą graf acykliczny. W systemach plików FAT16 i FAT32 stosowanych w MSDOS i MS Windows 3.xx i 95 pliki i katalogi tworzą drzewo.
Nazywanie plików
Jak wcześniej stwierdzono, każdy plik posiada nazwę (ang. file name). Nazwa pliku musi być unikalna w ramach katalogu.
Każdy plik w systemie plików posiada (przynajmniej jedną) pełną (bezwzględną) nazwę, unikalną w ramach całego systemu plików, tworzoną przez połączenie z nazwą pliku tzw. ścieżki bezwzględnej, t.j. nazw wszystkich katalogów, jakie należy przejść aby osiągnąć dany plik poczynając od korzenia drzewa katalogów. Jeśli pliki i katalogi tworzą drzewo to każdy plik posiada dokładnie jedną pełną nazwę.
Między innymi dla uproszczenia nazewnictwa plików wprowadza się pojęcie katalogu bieżcego. Katalog bieżący może być związany z procesem (jak np. w Uniksie) lub być globalnym dla wszystkich procesów systemu (MSDOS). Nazwa utworzona z nazwy pliku i tzw. ścieżki względnej, t.j. nazw katalogów jakie należy przejść aby osiągnąć dany plik poczynając od katalogu bieżącego nosi nazwę nazwy względnej. Przejście do nadkatalogu sygnalizowane jest w ścieżce i nazwie względnej przez człon "..".
Do łączenia nazw katalogów i plików w ścieżki i nazwy względne i bezwzględne używa znaku charakterystycznego dla danego systemu operacyjnego zwanego dalej znakem katalogu:
"\" - w MSDOS, MS Windows XX,
"/" - w systemach zgodnych z uniksem,
"." - w VMSie
W MSDOSie, MS Windows XX i systemach zgodnych z uniksem katalog główny nosi nazwę taką jak znak katalogu ("\" w MSDOS, "/" w uniksach), a nazwa bezwzględna różni się tym od nazwy względnej, że nazwa bezwzględna zaczyna się znakiem katalogu, np. "\Windows\Command" - ścieżka bezwzględna, "Command" - nazwa względna, (względem katalogu "\Windows").
System operacyjny z różnych powodów narzuca pewne ograniczenia na nazwy plików, np. długość - 8 znaków nazwy właściwej + 3 znaki rozszerzenia w MSDOS, 14 znaków w niektórych uniksach, 255 znaków w niektórych nowszych systemach operacyjnych. Innym ograniczeniem jest to jakie znaki można stosować w nazwach. Uniksy dopuszczają wszystkie znaki oprócz (co jest oczywiste) znaku katalogu "/" i znaku końca łańcucha (znak o kodzie 0). Systemy te rozróżniają duże/małe litery. MSDOS dopuszczał jesynie litery, cyfry, i kilka znaków nieliterowych, m.in. "_", "$" i "!". MS Windows 95 dopuszczają m.in. odstęp (czyli sację " "), "-" i wiele innych. Systemy te nie rozróżniają dużych/małych liter przy odwołaniach do plików, choć MS Windows 95 rozróżnia je przy wyświetlaniu nazw plików.
Kilku słów komentarza wymaga mechanizm pozwalający korzystać z tego samego systemu plików zarówno przez MS Windows 95 (długie nazwy) jak i starsze wersje systemów Microsoftu. Mechanizm ten zwany jest Virtual FAT (vfat). Każdy plik posiada dwie nazwy, tzw. nazwę długą tworzoną zgodnie z regułami MS Windows 95 i nazwę 8+3 tworzoną zgodnie z regułami MSDOSa na podstawie nazwy długiej. MSDOS widzi w danym katalogu tylko nazwy 8+3, natomiast MS Windows 95 widzi obie nazwy, a domyślnie wyświetla nazwy długie.
Systemy plików a dyski logiczne
Każdej partycji odpowiada urządzenie logiczne i związana z nim nazwa dysku logicznego. Istnieją dwa podejścia do nazywania plików położonych na różnych partycjach:
Globalny system plików. Takie nazewnictwo występuje w uniksach. Istnieje jeden katalog główny dla całego systemu operacyjnego. Katalog ten jest jednocześnie katalogiem głównym wyróżnionej partycji, zwanej partycją korzeniową (ang. root). Katalogi główne pozostałych partycji są montowane do liści drzewa partycji korzeniowej lub wcześniej zamontowanych partycji, rozbudowując drzewo. Rozmieszczenie poszczególnych katalogów i plików na partycjach jest przezroczyste dla użytkowników. Dołożenie nowego dysku lub przemieszczenie całych katalogów pomiędzy partycjami nie musi powodować zmiany nazwy bezwzględnej żadnego pliku. Pomaga w tym mechanizm dowiązań symbolicznych (ang. symbolic link, czyli skrót, ang. shortcut, w terminologi MS Windows ).
Jawne nazwy dysków. Takie nazewnictwo wykorzystują m.in. MS DOS i MS Windows XX. Nie istnieje globalny system plików. Tworząc pełną nazwę pliku należy powołać się na nazwę dysku logicznego. Dyski logiczne mają nazwy składające się z pojedyńczej dużej litery alfabetu łacińskiego i dwukropka (np. "A:", "C:", takich nazw może być najwyżej 26). Użytkownik musi pamiętać na którym dysku znajdują się jego pliki. Dodanie nowego dysku lub przemieszczenie katalogów między dyskami powoduje zmianę bezwzględnych nazw plików.
Dla ułatwienia tworzenia nazw względnych pojawia się pojęcie dysku bieżącego. Jeżeli nazwa pliku nie zawiera nazwy dysku, to przyjmuje się że odnosi się do dysku bieżącego.
Każdy dysk logiczny ma swój katalog bieżcy. Jeśli w nazwie pliku podana będzie nazwa dysku, a po niej nie nastąpi znak "\", to plik jest poszukiwany idąc po ścieżce poczynając od bieżącego katlogu podanego dysku.
Typy plików
Systemy operacyjne wyróżniają typy plików, które są traktowane w sposób specyficzny. Jeden spośród atrybutów pliku zwany typem pliku decyduje o sposobie traktowania pliku przez system operacyjny. Najczęściej spotykane typy plików to:
Katalogi. O katalogach była już mowa.
Pliki specjalne urządzeń - występują w systemach uniksopodobnych, służa do nazywania urządzeń logicznych.
Kolejki FIFO, kolejki komunikatów, gniazda (ang. sockets), strumienie - pliki realizujące bardziej złożone sposoby dostępu. Występują w systemach uniksopodobnych i MS Windows NT.
Dowiązania sybmoliczne (ang. symbolic link) inaczej skróty (ang. shortcut). Pliki które stanowią odwołanie do innych plików lub katalogów. Większość operacji wykonywanych na tych plikach odnosi się w rzeczywistości do plików przez nie wskazywanych.
Pliki wykonywalne (ang. executables): programy, komendy, skrypty (ang. scripts), pliki wsadowe (ang. batch files) - pliki zawierające kod programu do wykonania przez procesor lub komendy do wykonania przez powłokę (lub inny interpreter).
Programy mogą być wyróżnione jak w systemach uniksopodobnych przez posiadanie specjalnego uprawnienia do wykonania lub przez nadanie odpowiedniego rozszerzenia, np. ".COM", ".EXE " i ".BAT" w MSDOSie.
Zwykłe pliki z danymi. Te dzielą się na podtypy, zależnie od posiadanego rozszerzenia, tj przyrostka nazwy pliku zaczyającego się zazwyczja znakiem kropki lub od tzw. liczby magicznej tj. pierwszych 2 lub 4 bajtów zawartości pliku. Interpretacją zawartości plików z danymi róznych typów zajmują się specjalizowane aplikacje (takie jak MS Word, AutoCAD itp.). System operacyjny nie próbuje interpretować tych plików, co najwyżej powłoki użytkownika dostarczają narzędzi do łatwego uruchamiania odpowiednich aplikacji, rejestrowania nowych typów plików z danymi i kojarzenia z nimi aplikacji.
ASCII
Na osobne omówienie zasługuje plik tekstowy ASCII. Otrzymuje on często rozszerzenia ".txt" lub ".asc". Bajty przechowywane w tym pliku interpretowane są jako znaki alfanumeryczne kodowane w ASCII (Amercan Standard Code for Information Interchange). Kod ten koduje duże i małe litery, cyfry, znaki przestankowe oraz podstawowe symbole matematyczne.
Aby nadać danym przechowywanym w plikach ASCII formę podobną do dokumentów pisanych na dwuwymiarowych kartkach, pewne znaki o kodach mniejszych od 32 oraz znak o kodzie 127 otrzymują specjalne znaczenie sterujące. Na znaczenia przypisane znakom sterującym poważny wpływ miały terminale teletekstowe (ang. teletype) stosowane w początkowych fazach rozwoju informatyki. Ważniejsze znaki sterujące to:
CR (dziesiętny kod znaku: 13) - Carriage Return - powrót karetki. Oznacza przesunięcie głowicy drukarki na początek wiersza.
LF (dziesiętny kod znaku: 10) - Line Feed - przejście do nowego wiersza. W systemach uniksopodobnych służy do rozdzielnia wierszy pliku tekstowego. W systemach Microsoftu do tego celu służy para nastepujących po sobie znaków CR LF.
FF (dziesiętny kod znaku: 12) - Form Feed - przejście do nowej strony. Powoduje wysunięcie strony z drukarki i przejście do drukowania na nowej.
HT (dziesiętny kod znaku: 9) - Horizontal Tab - tabulacja pozioma. Powoduje przejście do następnej pozycji przy tworzeniu tabel, zazwyczaj przejście do najbilższej kolumny znaków o numerze podzielnym przez 8.
BS (dziesiętny kod znaku: 8) - BackSpace - wymazywanie wsteczne. Nakazuje wymazanie poprzedniego znaku.
ESC (dziesiętny kod znaku: 27) - Escape - kod ucieczki. Oznacza, że po nim nastąpi zakodowana komenda dla urządzenie wyświetlającego lub drukującego. W edytorach nazywany jest także metaznakiem (ang. meta, metacharacter) służącym do konstruowania znaków niedostępnych bezpośrednio z klawiatury lub komend.
Znak końca pliku (kod dziesiętny różny w róznych systemach). Oznacza koniec pliku tekstowego lub transmisji tekstowej.
Oryginalny kod ASCII jest siedmiobitowy. Ósmy bit bajtu używany był jako suma kontrolna. Obecnie wykorzystywane jest wszystkie osiem bitów. Tak uzyskane dodatkowe 128 znaków służy do przedstawiania semigrafiki lub znaków narodowych. Ponieważ jest to zamało do przedstawienia znaków narodowych, choćby wszystkich alfabetów łacińskich, wprowadzono strony kodowe, t.j. sposoby kodowania znaków spoza podstawowego alfabetu łacińskiego. W Polsce obowiązuje norma przemysłowa zgodna z normą międzynarodową ISO 8895-2. Popularnie stosowane oprogramowanie Microsoftu z wyjątkiem MS Windows NT stosujących unikody (ang. unicode) nie jest zgodne z powyższymi normami i wprowadza dwie własne strony kodowe CP 852 (MSDOS) i CP 1250 (MS Windows XX).
Pliki ASCII ze wględu na prostotę kodowania informacji są powszechnie wykorzystywane jako pliki konfiguracyjne, dzienniki odnotowujące błedy programów, pliki przenoszące dane między różnymi aplikacjami lub przechowujące dane w sposób ułatwiający użytkownikowi ingerencję niezależnie od aplikacji.
Rozdział 5: Zagadnienia bezpieczeństwa
W języku angielskim wyróżnia się dwa terminy, którym odpowiada jedno polskie określenie - bezpieczeństwo:
safety - bezpieczeństwo użytkownika (i jego danych) przed niezgodnym ze specyfikacją (awaryjnym) działaniem systemu i
security - bezpieczeństwo systemu przez destrukcyjnymi działaniami użytkownika.
Są to dwie strony tego samego medalu. System nie będący bezpiecznym w jednym z powyższych znaczeń, przestaje być bezpieczny w drugim.
Autentykacja na przykładzie haseł wielokrotnych
Autentykacja jest to proces, w którym komunikujący się partnerzy potwierdzają swoją tożsamość. Najczęściej autentykacja ogranicza się jedynie do potwierdzenia tożsamości użytkownika. Zakłada się tutaj, że użytkownik pracuje w otoczeniu zaufanych komputerów. Jednak zdarzają się przypadki podszywania się "wrogich" komputerów pod "przyjazne" serwery, aby np. przechwycić hasła nieświadomych użytkowników. Wskazanie sposobów rozwiązania tego problemu znajduje się w punkcie poświęconym kryptografii. Tutaj omówiony będzie najprostszy przypadek, gdy komputery sieci lokalnej są dostatecznie dobrze chronione przed podszywaniem by każdy użytkownik mógł ufać, że każdy komputer jest tym za którego się podaje.
Użytkownik przystępując do pracy (lub łącząc się z kolejnym komputerem), proszony jest to podanie identyfikatora (konta lub profilu).
Identyfikator jest jawny. Pozwala on innym użytkownikom i oprogramowaniu powoływać się na danego użytkownika. Identyfikator ten jest ciągiem znaków, najczęściej małych liter. Zaleca się, aby miał jakiś związek z imieniem, nazwiskiem lub wydziałem, w którym pracuje użytkownik.
Teraz użytkownik musi potwierdzić swoje prawo do posługiwania się identyfikatorem. Najczęściej proszony jest o podanie znanego tylko jemu hasła. Hasło nie pojawia się na ekranie.
Oczywiście, istnieją inne bardziej wyrafinowane sposoby potwierdzania tożsamości użytkownika oparte o biometrię, karty magnetyczne lub procesorowe, czy hasła jednorazowe, ale ich omówienie wykracza poza ramy tego wykładu.
Zaletą haseł wielokrotnych jest "prostota obsługi" i brak konieczności instalowania specjalizowanego sprzętu. Wady są rozliczne:
Użytkownicy wybierają hasła, które łatwo jest odgadnąć.
Bywa, że hasło jest zapisane w dostępnym dla postronnych miejscu, lub jest gubione.
Hasła są przechowywane w niektórych komputerach, lub przesyłane siecią w postaci jawnej (niezaszyfrowanej), co pozwala na ich przechwytywanie.
Użytkownicy posługują się tymi samymi hasłami w odniesieniu do kont na różnych komputerach. Nieuczciwy administrator, lub włamywacz, przeglądając pliki z hasłami na jednym komputerze wchodzi w posiadanie haseł na innych komputerach.
Wad tych nie można w całości wyeliminować, ale można zrobić wiele aby je zmniejszyć:
Aby utrudnić odgadnięcie hasła:
W żadnym wypadku nie należy ustawiać sobie jako hasła, słowa, które łatwo jest skojarzyć z własną osobą, tj: nazwy konta, imienia, nazwiska (własnego, członka rodziny, znajomego lub zwierzęcia domowego), numeru telefonu, rejestracji samochodu, adresu, daty urodzin itp.
Hasło powinno mieć przynajmniej 6 znaków, czym dłuższe tym lepsze.
Niektórzy włamywacze próbują różnych haseł pochodzących ze specjalnie sporządzonych słowników zawierających popularne słowa z danego języka, nazwy geograficzne, słownictwo fachowe, imiona bohaterów powieści, filmów itp. Jeśli zatem stosuje się hasło, które jest popularnym słowem, należy wpleść w nie cyfrę lub znak nieliterowy, lub jeśli pozwala na to oprogramowanie, część znaków wpisać dużymi, a część małymi literami.
Dobre hasła uzyskuje się biorąc pierwsze litery z wybranego zdania.
Przez pewien czas zalecano by haseł nie zapisywać, lecz pamiętać je. Obecnie zaleca się zapisywanie haseł, ale przechowywać należy je w miejscach dla innych niedostępnych, np. w portfelu. Dobrze jest też zamaskować hasło wplatając je w inne napisy.
Należy unikać łączenia się przez niepewne sieci z usługami wymagającymi haseł. Np. z domu przez publiczny modem telekomunikacji i dalej przez Internet do pracy (należy dzwonić bezpośrednio na firmowy modem, jeśli takowy jest). Jeśli tylko można, należy skorzystać z oprogramowania kryptograficznego.
Dobrze jest posiadać inne hasło do każdego z kont. Czasem jest to uciążliwe, dlatego można ograniczyć się do posiadania jednego hasła do komputerów w pracy i drugiego do usług w Internecie. W żadnym razie nie należy zakładać sobie takiego samego hasła w jakiejkolwiek usłudze internetowej, jakie ma się w pracy.
Autoryzaja czyli o uprawnieniach
Autoryzacja, oznacza udzielanie dostępu danemu użytkownikowi (reprezentowanemu przez zautentykowany identyfikator) do tych zasobów, które są dla niego przeznaczone. W tym celu system operacyjny danego komputera utrzymuje bazę danych zawierającą informacje o tym które zasoby (pliki, katalogi, urządzenia itp.) mogą być udostępniane poszczególnym użytkownikom i na jakich prawach.
Baza ta zawiera następujące informacje:
Obiekty podlegające ochronie. Najczęściej są to pliki i katalogi, w ogólności są to zasoby danego komputera.
Podmioty uzyskujące prawa dostępu. Podmiotami tymi są użytkownicy. Aby ułatwić zarządzanie prawami dużych zbiorowości użytkownków wprowadza się grupy użytkowników, które są również podmiotami uzyskującymi uprawnienia. Użytkownicy są przypisywani do grup. Dany użytkownik może należeć do wielu grup. Przez fakt przynależności do danej grupy użytkownik zyskuje lub traci takie uprawnienia jakie zostały przypisane grupie.
Uprawnienia. We wszystkich systemach operacyjnych powtarzają się prawa do zapisu i odczytu plików. Wiele systemów rozszerzaja te podstawowe uprawnienia o prawo do uruchamiania programów, prawo do kasowania lub tworzenia plików w katalogu, prawo do powoływania się na katalogi itp.
Na poziomie systemu operacyjnego wyróżnić można kilka klas systemów autoryzacji, dokładną klasyfikację daje "Pomarańczowa księga" Ministerstwa Obrony USA, na potrzeby tego opracowania ograniczę się do krótkiej listy:
Brak autoryzacji. Takie systemy nadają się dla pojedyńczego użytkownika, lub tam gdzie autoryzacja nie jest wymagana. Np. MS DOS.
Profile użytkownika. Komputer rozpoznaje użytkowników, każdemu daje spersonalizowane środowisko pracy, jednak nie zabezpiecza danych jednego użytkownika przed innym użytkownikiem. W praktyce takie systemy są więc równoważne poprzedniej klasie. Nadają się dla niewielkiej grupy zaufanych użytkowników. Np. MS Windows 9x.
Wspólne hasła. System nie wyróżnia użytkowników, wyróżnia natomiast zasoby mające przypisane hasła. Każdy użytkownik, który poda hasło do zasobu, otrzymuje do niego dostęp. Utrzymanie bezpieczeństwa takich systemów jest możliwe tylko w niewielkich grupach zaufanych użytkowników. Np. Microsoft Networks w wersji peer-to-peer tj. bez serwerów Netware i NT.
Klasyczne systemy wieloużytkownikowe. Wyróżniają użytkowników i grupy. Autentykacja użytkownika następuje w momencie rozpoczynania sesji pracy z systemem. Z każdym obiektem związana jest ograniczona liczba podmiotów jakie uzyskują do niego uprawnienia. Np. w standardowym uniksie każdy plik ma dokładnie jednego właściciela-użytkownika, któremu przypisane są pewne uprawnienia, dokładnie jednego właściciela-grupę mającą uprawnienia, oraz uprawnienia stosowane do pozostałych. Podobnie jest w VMSie. Wiele takich systemów jest zgodnych z klasą bezpieczeństwa C2 w sensie "Pomarańczowej księgi". W oparciu o takie systemy uprawnień działa spora część serwerów w internecie. Pewną wadą tego systemu jest to, że jedynie administrator ma swobodę nadawania uprawnień. Zwykły użytkownik ma ograniczone możliwości określania uprawnień dla innych podmiotów do swoich zasobów.
Systemy z ACL (Access Control List - lista kontroli dostępu). Systemy te różnią się tym od klasycznych, że z każdym obiektem można związać dowolnie lub wystarczająco długą (np 32 elementową w Netware) listę podmiotów mających uprawnienia do danego zasobu. Użytkownik może bez pomocy administratora nadawać uprawnienia innym podmiotom do swoich zasobów (z oczywistym ograniczeniem, że nie może nadać większych niż sam ma). Do tej klasy należą takie systemy jak Novel Netware, Windows NT i niektóre uniksy np. Solaris. Są one wystarczające do większości zastosowań cywilnych.
Systemy z określeniem klas poufności. Oprócz istnienia grup i ACL użytkownicy i zasoby komputera są przydzieleni do klas poufności. Żaden użytkownik nie może udzielić uprawnień do zasobów danej klasy poufności innemu użytkownkowi należącemu do klasy gorszej. Utrudnia to przypadkowe przecieki informacji tajnych i z tego powodu jest stosowane w instytucjach o podobnym do wojskowego sposobie zarządzania dostępem do informacji poufnych.
Wiele aplikacji, w szczególności bazy danych ma własne mechanizmy autentykacji i autoryzacji, gdzie wyróżnia się przywileje przypisywane użytkownikom do wykonywania pewnych charakterystycznych dla tych aplikacji operacji (np. nie każdy może dokonać sprzedaży).
Wiele serwerów sieciowych rozszerza podstawowe systemy uprawnień dostarczane przez system operacyjny, aby ograniczyć dostęp z zenątrz do charakterystycznych dla tych serwerów usług, np. serwer WWW Apache określa w których katalogach można umieszczać skrypty CGI, programy umieszczone poza tymi katalogami nie będą uruchamiane przez serwer.
Oprócz uprawnień do pojedyńczych zasobów mogą istnieć w systemie tzw, kwoty (ang. quota) tj. ograniczenia ilości jednocześnie wykorzystywanych zasobów danej klasy. Kwoty zabezpieczają system przed wyczerpaniem zasobów przez zachłannych użytkowników. Np. kwota dyskowa określa jak duży obszar dysku może być jednocześnie zajęty przez pliki danego użytkownika. Kwoty mogą też dotyczyć procentu czasu pracy procesora na rzecz danego użytkownika w jednostce czasu, ilości uruchomionych procesów itp.
W wielu systemach istnieją mechanizmy do ograniczania użytkownikowi dostępu do wydzielonych stanowisk lub określonych godzin pracy.
Wśród użytkowników wyróżnia się administratorów i operatorów, czyli takich, do których zadań należy troska o poprawne działanie systemu. Mają w związku z tym znacznie szersze prawa. W rozbudowanych systemach można wyróżnić kilka klas administratorów:
główny administrator (w uniksie zwany tradycyjnie root, w innych systemach admin, sysadmin itp.), ma maksymalne prawa do systemu operacyjnego, może w szczególności nadawać prawa innym, w związku z czym jego hasło nie powinno być jego prywatną tajemnicą, lecz tajmnicą firmy,
operatorzy poszczególnych usług i aplikacji, przykładowo:
operatorzy backupu - mają prawo nadzorować wykonanie kopii bezpieczeństwa systemu,
administratorzy baz danych - odpowiadają za integralność bazy danych i poprawne działanie jej oprogramowania,
webmasterzy odpowiedzialni za poprawną pracę serwisu WWW,
operatorzy drukarek - odpowidają za poprawną pracę drukarek, mogą m.in. wstrymywać i usuwać z kolejek wyduku zadania innych użytkowników.
Osobnym zagadnieniem są prawa głównego administratora. Można tu wyróżnić dwa podejścia:
Administrator jest osobą, która doskonale zna system, która go zainstalowała na komputerze oraz ma pełne prawa zapisu i odczytu dysków i pamięci operacyjnej, więc nie ma sensu bronić użytkowników przed nieuczciwym administratorem, ponieważ może on wszystkie mechanizmy obejść lub wyłączyć. Takie podejście prezentuje większość uniksów. Włamywacz, który przejmie prawa administratora może nie zostawić śladów swej działalności.
Twórcy systemu operacyjnego utajniają pewne informacje (m. in. projekt i kod źródłowy) dotyczące systemu operacyjnego, a w szczególności systemu plików, dzięki czemu administrator nie może wykonać z systemem wszystkiego w szczególności usunąć śladów swoich działań. Takie podejście zastosowano w Windows NT. (Np. jeśli administrator przejmie uprawnienia do jakiegoś pliku, to nie może się potem tego wyprzeć. Niestety tajemnice bywają wykradane jak to się stało z kodem źródłowym tego systemu i kwestią czasu jest pojawienie się oprogramowania usuwającego ślady działania administratora w wystarczająco popularnym systemie.)
Audyt
Audyt oznacza śledzenie działania systemu i poczynań użytkowników. Pozwala ustalić przyczyny awarii oraz momenty i sprawców naruszeń bezpieczeństwa. Użytkownicy komputerów powinni sobie zdawać sprawę, że ich prywatność jest w każdej chwili naruszana przez audyt. Jest to zło konieczne, z którego administratorzy nie zgodzą się zrezygnować. Dostęp do dzienników systemowych powinien być ściśle limitowany.
Kopie bezpieczeństwa
Awarii systemu kończących się utratą danych nigdy nie da się wykluczyć. Posiadanie starych wersji dokumentów, które przestały być użyteczne i zostały normalną drogą usunięte z systemu też może być niekiedy cenne. Niekiedy archiwizacja wymuszana jest osobnymi przepisami, np. bazy danych księgowości. Stąd jednym z zadań administratora jest rutynowe wykonywanie kopii bezpieczeństwa plików. Systemy operacyjne i oprogramowanie narzędziowe niezależnych producentów dostarcza mu niezbędnego wsparcia. Istnieją wyspecjalizowane firmy zajmujące się kompleksowo archiwizacją danych komputerowych i tworzeniem elektronicznych baz dokumentów papierowych.
Narzędzia
Do tworzenia kopii bezpieczeństwa służy specjalizowany sprzęt i oprogramowanie.
Ze sprzętu należy wymienić przede wszystkim napędy i nośniki o dużej pojemności (rozmiary nośników podane są orintacyjnie):
Do przeszłości odchodzą dyskietki, stosowane do archiwizacji drobnych plików. Przeciętne pojemności są rzędu 1MB.
Obecnie popularność zdobywają nośniki magnetooptyczne. Dostępne technologie pozwalają zmieścić powyżej 100MB na jednym nośniku. W niedługiej przyszłości pojemności tych nośników mają wzrosnąć do rzędu 10GB i więcej. Nośniki te charakteryzują się dostępem swobodnym i możliwością wielokrotnego zapisu.
Najpopularniejszymi nośnikami kopii zapasowych są streamery, będące kasetami z tśmą magnetyczną. Pojemności streamerów wahają się od 100MB do 30GB, zapewne będą jeszcze rosły. Kasety są wielokrotnie zapisywalne. Dostęp do nich jest sekwencyjny, co przy robieniu całościowych zrzutów nie ma znaczenia. Nośniki te są najmniej wrażliwe na awarie napędu w trakcie odczytu/zapisu.
Dyski optyczne jednokrotnego zapisu. Niemożność wymazania raz zapisanych danych w tym zastosowaniu może być ich zaletą. Najbardziej rozpowszechnione są dyski CD-ROM o pojemności 650MB, powoli standaryzuje się technologia DVD o pojemności rzędu 10GB. Wadą tych nośników jest to, że w czasie procesu zapisu komputer musi dostarczać w odpowiednim tempie strumień danych, co powoduje, że w czasie zapisu komputer nie może wykonywać innych czynności.
Niektórzy zalecają wybierać takie nośniki, by zmieścił się na nich w całości zrzut dysku bez robienia kompresji.
Napędy backupujące można:
wmontować na stałe po jednym do każdego komputera,
przyłączać na czas robienia zrzutu przez magistralę SCSI lub w inny sposób, lub
umieścić na wydzielonym komputerze, który będzie ściągał zrzuty z innych komputerów siecią.
Wśród oprogramowania należy wyróżnić:
programy dokonujące zrzutów i odtworzeń całości dysku bez kompresji: tar, cpio, dump/restore, backup/restore,
programy kompresujące/dekompresujące: zip, gzip, pkzip, arj, lharc i in.,
narzędzia kryptograficzne,
narzędzia do weryfikacji kopii bezpieczeństwa,
złożone programy rozwiązujące problem kompleksowo, w tym pozwalające planować zakres zrzutów oraz ich automatyczne wykonanie np. sysadmsh w SCO Uniksie, Microsoft Backup i in.
Do robienia kopii zapasowych należy wybierać narzędzia, które będą dostępne wiele lat po zrobieniu kopii.
Torzenie kopii bezpieczeństwa
Istnieją różne poziomy kopii bezpieczeństwa:
zerowy - pełna kopia - obejmuje cały dysk lub drzewo katalogów,
kopie różnicowe lub przyrostowe - obejmują tyko pliki, które zmieniły się od ostatniej kopii, może tu istnieć wiele poziomów (pierwszy, drugi, ...), dany poziom obejmuje te pliki, które zmieniły się od czasu ostatniej kopii poziomu niższego.
System operacyjny wspiera tworzenie przyrostowych kopii bezpieczeństwa utrzymując informacje o datach modyfikacji plików lub flagi niezbędności archiwizacji.
Przyjmuje się, że kopie poziomu zerowego powinno się robić nie rzadziej niż raz na kwartał a zaleca się raz na miesiąc. Kopie takie powinno się przechowywać przez czas nieokreślony, dobrze sprawdzają się tutaj streamery i CD-ROMy.
Kopie wyższych poziomów powinno sporządzać się w połowie okresów wykonywania kopii poziomów niższych, należy je przechowywać przynajmniej przez dwukrotność okresu jej sporządzania. Po upływie czasu przechowywania kopii, nośnik można wykorzystać powtórnie. Dobrze sprawdzają się tutaj takie nośniki jak streamery i dyski magnetooptyczne.
Nie wszystkie dane w komputerze są równie narażone na możliwośc utraty, można je podzielić pod tym wględem na kilka grup:
Pliki tymczasowe. W zasadzie nie wymagają archiwizacji.
Oprogramowanie systemowe i inne oprogramowanie niededykowane. W razie utraty można je powtórnie zainstalować z nośników instalacyjnych. Pod warunkiem zapewnienia ochrony nośnikom instalacyjnym nie wymagają archiwizacji.
Dzienniki systemu (logi). Zawierają cenne informacje dla administratora, jednak ich utrata zazwyczaj nie uniemożliwia bieżącego działania systemu. Warto archiwizować.
Konfiguracja oprogramowania. Często łatwa do odtworzenia, zwłaszcza, gdy została udokumentowana na papierze, jednak w złożonych programach odtworzenie może wymagać wielu godzin żmudnej pracy. Zaleca się archiwizować.
Oprogramowanie dedykowane i jego konfiguracja. Powtórna instalacja oprogramowania dedykowanego, takiego jak programy bankowe, oprogramowanie linii technologicznej itp. może wymagać obecności przedstawicieli producenta a sam proces zazwyczaj jest długotrwały. Należy liczyć się z tym, że producent może nie dysponować plikami instalacyjnymi pewnych modułów oprogramowania, jeśli były robione dla potrzeb specyficznego klienta. Należy archiwizować.
Dane przedsiębiorstwa, własna twórczość użytkownika itp. Są bezcenne. Bezwzględnie archiwizować.
Do różnego stopnia wrażliwości i zmienności danych można dostosować częstość robienia kopii zapasowych. I tak, przyrostowe kopie firmowych danych można robić codziennie, a kopie oprogramowania raz na kwartał oraz po większych instalacjach lub uaktualnieniach.
Proste narzędzia wymagają uwagi operatora przy tworzeniu kopii, złożone (np. sysadmsh dla SCO Uniksa) potrafią włączać kopiowanie automatycznie w środku nocy w/g przygotowanego wcześniej przez administratora planu.
Po wykonaniu kopii bezpieczeństwa należy ją zweryfikować. Należy sprawdzać także kopie przechowywanez dłuższy czas w archiwum przez losowe odtwarzanie zawartych w nich plików.
Kopie bezpieczeństwa, przynajmniej te poziomu zerowego należy robić w kilku egzemplażach, z których jeden powinien być przechowywany w miejscu możliwie odległym od tego, w którym pracują objęte kopią komputery.
Kryptografia
Techniki kryptograficzne pozwalają chronić poufność i autentyczność informacji. Poufność oznacza, że informacja może być poprawnie odczytana jedynie przez upoważnione osoby (lub programy). Autentyczność oznacza, że informacja może (mogła) być wygenerowana jedynie przez upoważnione osoby w sposób dający się później poprawnie odczytać. Nieco słabszą cechą jest integralność oznaczająca że informacja nie uległą zmianie w czasie przekazu, nie gwarantuje się natomiast autentyczności jej nadawcy.
Kryptografia nie chroni przed nieupoważnioną modyfikacją danych (jest to zadanie autoryzacji) a jedynie pozwala odbiorcy wykryć i odrzucić nieautentyczne wiadomości (przez co może być wykorzystywana jako jeden z elementów algorytmów autoryzacji).
Aby móc chronić informację wykonuje się na niej przekształcenie zwane szyfrowaniem. Operacja odwrotna zwana jest deszyfrowaniem. Wiadomość początkową nazywamy tekstem jawnym lub otwartym, po zaszyfrowaniu - tekstem zaszyfrowanym lub kryptogramem.
Przekształcenie szyfrujące i deszyfrujące zależą od tzw. kluczy kryptograficznych. Podając niewłaściwy klucz przy deszyfrowaniu nie możemy poprawnie odszyfrować wiadomości. Nie znając klucza szyfrowania nie możemy zaszyfrować tekstu tworząc dający się potem poprawnie odszyfrować właściwym kluczem kryptogram.
W zastosowaniach cywilnych należy stosować jedynie te przekształcenia szyfrujące, które nie pozwalają na systematyczne odgadywanie tekstu jawnego i klucza kryptograficznego osobom, które znają algorytm przekształcenia i dowolną ilość tekstu zaszyfrowanego. Zaleca się stosowanie szyfrów spełniających silniejszy warnek: nie powinno być możliwe systematyczne odgadywanie klucza przez osoby, które mogą wygenerować z dowolnego tekstu jawnego kryptogramy i znają algorytm przekształcenia. W żadnym razie bezpieczeństwo szyfru nie powinno się opierać na utajnieniu algorytmu.
Wszystkie szyfry z wyjątkiem niemożliwego do zastosowania w praktyce szyfru z jednorazowym kluczem są teoretycznie przełamywalne, to znaczy, że w skończonym czasie można odgadnąć klucz (i w konsekwencji tekst jawny). W praktyce stosuje się zazwyczaj szyfry dla których czas potrzebny na przełamanie zależy w sposób wykładniczy od długości klucza. W przypadku wzrostu mocy obliczeniowych komputerów będących w ekonomicznym zasięgu potencjalnego przeciwnika należy wymienić klucze na dłuższe.
Amerykańskie regulacje dotyczące eksportu broni zabraniają wywozu oprogramowania kryptograficznego posługującego się kluczami dłuższymi niż 40 bitowe. Beneficjentem tego ograniczenia miał być wywiad USA dysponujący superkomputerami, jednak obecnie szyfry takie można łamać na PCtach. Powszechnie uważa się, że ograniczenie to poważnie utrudnia powstawanie oprogramowania kryptograficznego dla potrzeb cywilnych i naraża na straty również gospodarkę USA.
Wyróżnia się dwa systemy szyfrowania:
Szyfrowanie z kluczem prywatnym (symetryczne, klasyczne).
Szyfrowanie z kluczem publicznym (asymetryczne).
Szyfrowanie symetryczne
Zarówno do szyfrowania, jak i deszyfrowania wiadomości stosuje się ten sam klucz, lub też klucze można łatwo przekształcić jeden w drugi. W tym systemie nie da się rozdzielić ochrony poufności i autentyczności. Dla prowadzenia korespondencji między n podmiotami potrzeba razem n*(n-1)/2 kluczy (każdy podmiot potrzebuje innego klucza dla każdego ze swych n-1 partnerów - innymi słowy każda para potrzebuje osobnego klucza).
Przykłady historyczne: szyfr Cezara, Tablica Vigenere'a i Enigma oraz obecnie powszechnie stosowane: DES i IDEA.
Szyfrowanie asymetryczne
Podstawy teoretyczne opracowano dopiero w latach '70 tego stulecia.
Metody te opierają się na parze kluczy. Jeden z nich zwany jest kluczem publicznym, drugi - prywatnym. Wyznaczenie klucza publicznego na podstawie klucza prywatnego jest na ogół obliczeniowo łatwe. Wykonanie operacji w drugą stronę (wyznaczenie klucza prywatnego na podstawie publicznego) w rozsądnym czasie, przy odpowiedniej długości klucza może być poza zasięgiem technicznym.
Jeśli jednego z kluczy użyto do szyfrowania to kryptogram daje się odszyfrować tylko drugim. I na odwrót, jeśli kryptogram daje się odszyfrować pierwszym, to do szyfrowania mógł być użyty tylko drugi.
W tym systemie można chronić osobno poufność, osobno autentyczność lub obie te cechy na raz.
Tekst zaszyfrowany kluczem publicznym może być poprawnie odszyfrowany tylko kluczem prywatnym znanym jednej konkretnej osobie. Tak chroni się poufność.
Kryptogram dający się poprawnie odszyfrować kluczem publicznym mógł być sporządzony tylko przy użyciu klucza prywatnego będącego w dyspozycji tylko jednej konkretnej osoby. Tak zapewnia się autentyczność.
Klucze publiczne można swobodnie rozpowszechniać bez obawy ujawnienia kluczy prywatnych. Do prowadzenia komunikacji między n podmiotami potrzeba razem n par kluczy (po parze kluczy prywatny/publiczny na podmiot). Każdy podmiot pamięta swój klucz prywatny i klucze publiczne swoich partnerów.
Dzięki szyfrowaniu asymetrycznemu możliwe stało się sporządzanie podpisów (sygnatur) cyfrowych. Autor wiadomości sporządza jej skrót znanym algorytmem haszującym i szyfruje ten skrót swoim kluczem prywatnym. Każdy (kto zna klucz publiczny) może sporządzić skrót wiadomości oraz odszyfrować podpis i sprawdzić czy wynikowe ciągi znaków są identyczne. Jednocześnie, jeśli ktoś zmodyfikuje wiadomość, to nie będzie mógł doprowadzić do sytuacji, że będzie ona zgodna z dotychczasową sygnaturą, ani sporządzić sygnatury, która po odszyfrowaniu kluczem publicznym oryginalnego autora byłaby zgodna ze zmodyfikowaną wiadomością. Dokument opatrzony podpisem cyfrowym nazywamy certyfikatem cyfrowym.
Opracowano pewnym mechanizmy pozwalające rozpowszechniać klucze publiczne przez podatne na atak media przy zapewnieniu autentyczności samych kluczy. Oznacza to, każdy podmiot ma możliwość sprawdzenia, czy klucze publiczne które posiada odpowiadają kluczom prywatnym jego partnerów i nie zostały mu podstawione przez przeciwnika.
Odciski palaca kluczy (fingerprints). Są to krótkie ciągi znaków, będące skrótem całego (długiego) klucza, które można np. przedyktować przez telefon i w ten sposób potwierdzić autentyczność klucza przekazanego inną drogą.
Certyfikaty kluczy. Jeżeli jeden z użytkowników, nazwijmy ją Alą, chce przekazać innemu użytkownikowi, nazwijmy go Bolkiem, swój klucz publiczny przez kanał, który nie gwarantuje autentyczności przekazu, może poprosić wspólnego znajomego, nazwijmy go Cześkiem o udzielenie certyfikatu jej kluczowi publicznemu.
Sytuacja jest taka: Czesiek zna klucz publiczny Ali, Bolek zna klucz publiczny Cześka ale nie zna klucza Ali i chciałby go otrzymać w sposób nie budzący wątpliwości co do autentyczności tego klucza. Czesiek podpisuje klucz publiczny Ali swoim kluczem prywatnym i taki certyfikat wysyła do Ali. Ala może teraz wysłać go do Bolka. Bolek mając klucz publiczny Cześka, sprawdzi, że certyfikat został podpisany jego kluczem prywatnym. Z certyfikatu odczyta klucz publiczny i informację, że jest to klucz Ali.
Nieprzyjazny im wszystkim Darek może na pewnym etapie przechwycić certyfikat i zmodyfikować go, jednakże Bolek odrzuci taki zmodyfikowany certyfikat, gdyż Darek nie będzie mógł sporządzić podpisu Cześka.
Gdy Ala będzie chciała przekazać swój klucz publiczny Ewie nie będzie musiała po raz drugi prosić o pomoc Cześka, gdyż już ma jego certyfikat na swój klucz.
Najsłabszym ogniwem jest tu wymiana kluczy publicznych z Cześkiem. Czesiek musi być zatem wystarczająco szeroko znanym i potężnym indywiduum by podszycie się pod niego było niemożliwe.
Można sobie wyobrazić, że w roli Ali występuje bank emitent kart kredytowych, w roli Bolka i Ewy - sprzedawcy przyjmujący plastikowe pieniądze, a w roli Cześka - ogólnokrajowa instytucja certyfikacyjna, jaką może być konsorcjum dużych instytucji finansowych lub bank narodowy. W chwili pisania niniejszego opracowania, taki system w odniesieniu do powszechnego obrotu finansowego pozostawał w sferze wyobraźni.
Przykłady: RSA (oparte na trudności rozkładu dużych liczb na czynniki pierwsze), szyfry oparte na problemie plecakowym, El-Gamal.
Szyfry asymetryczne są najczęściej powolne, dlatego stosuje się techniki hybrydowe - przy pomocy szyfru asymetrycznego partnerzy uzgadniają klucz sesji służacy następnie do szyfrowania szybkim algorytmem symetrycznym. Klucze sesyjne są jednorazowego użytku.
Funkcje jednokierunkowe
W niektórych przypadkach do ochrony autentyczności lub poufności nie jest potrzebne lub wskazane szyfrowanie wiadomości (dające możliwość deszyfrowania). Stosuje się wówczas funkcje jednokierunkowe.
Funkcja jednokierunkowa jest to takie przekształcenie, które daje się obliczać szybko w jedną stronę, ale dla którego wyznaczenie przekształcenia odwrotnego jest bardzo złożone obliczeniowo. Zmiana pojedyńczego bitu argumentu powoduje zmiany wielu bitów wyniku według złożonego schematu. Odgadywanie argumentu dla którego fukcjia przyjmuje zadaną wartość najczęściej polega na przeszukaniu całej dziedziny argumentów funcji.
Funkcje jednokierunkowe służą m.in. do przechowywania haseł, oraz do tworzenia streszczeń wiadomości dla potwierdzania ich integralności i autentyczności (patrz wcześniej - podpisy cyfrowe).
Inne zagadnienia
Inne zagadnienia mające wpływ na bezpieczeństwo komputerów to między innymi pielęgnacja, konserwacja i właściwe przechowywanie sprzętu i oprogramowania, dobór wykwalifikowanego i odpowiedzialnego personelu, szkolenia oraz tworzenie polityki bezpieczeństwa systemu informatycznego.
5