Systemy Operacyjne

Transkrypt

Systemy Operacyjne
System operacyjny Linux
•
•
•
•
•
•
•
•
•
•
Perspektywa historyczna
Podstawy projektu
Moduły jądra
Zarządzanie procesami
Planowanie
Zarządzanie pamięcią
Systemy plików
Wejście i wyjście
Komunikacja międzyprocesowa
Bezpieczeństwo
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
1
Perspektywa historyczna
• 1969: 1-sza wersja systemu UNIX opracowana przez Kena
Thompsona w Bell Labs (AT&T) dla minikomputera PDP-7.
• 1973: 3-cia wersja systemu UNIX napisana w języku C przez Kena
Thompsona i Dennisa Richiego (autor języka C) → przenośność!
• Ważniejsze odmiany systemu UNIX:
ƒ System V wersja 4 (SVR4) – wersja opracowana przez AT&T.
ƒ BSD (Berkeley Software Distribution) – odmiana opracowana przez University
of California w Berkeley; najnowsza wersja: FreeBSD.
ƒ Solaris – system operacyjny firmy Sun Microsystems, oparty o SVR4 i BSD;
najbardziej rozpowszechniona komercyjna implementacja Uniksa.
ƒ Linux – system operacyjny oparty na SVR4 i 4.3BSD, ale jądro całkowicie
oryginalne, napisane niezależnie; najpopularniejsza obecnie odmiana Uniksa.
• 1991: Linus Torvalds, student informatyki Uniwersytetu w
Helsinkach, napisał małe, lecz kompletne jądro systemu operacyjnego
dla 32-bitowego procesora Intel 80386, który nazwał Linux.
ƒ Kod źródłowy Linuxa został od razu udostępniony bezpłatnie w sieci Internet,
co spowodowało, że do jego dalszego rozwoju włączyło się wielu
użytkowników z całego świata – taki rozwój systemu trwa do dziś.
ƒ Część elementów systemu została zapożyczona z innych projektów (np. GNU).
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
2
Licencja i rozpowszechnianie Linuxa
• Jądro systemu Linux jest rozpowszechniane w ramach licencji GNU
General Public Licence (GPL), określonej przez konsorcjum Free
Software Foundation (FSF), jako tzw. oprogramowanie w wolnym
obiegu (free software).
ƒ Zakaz prywatyzacji produktów powstałych z wykorzystaniem Linuxa lub
pochodnych systemu (tzn. odmian zachowujących standardy Linuxa).
ƒ Oprogramowanie nie może być redystrybuowane w formie czysto binarnej –
wraz z każdą dystrybucją binarną musi być udostępniony kod źródłowy.
• Dystrybucje Linuxa:
ƒ Standardowe, prekompilowane zbiory pakietów, zwane dystrybucjami,
zawierają podstawowy system Linux, narzędzia do instalowania systemu i
zarządzania nim oraz gotowe do instalowania pakiety typowych narzędzi
systemu UNIX.
ƒ Pierwsze dystrybucje zarządzały pakietami jedynie przez dostarczanie środków
do rozpakowywania wszystkich plików w odpowiednie miejsca; współczesne
dystrybucje zawierają zawansowane zarządzanie pakietami.
ƒ Większość obecnych dystrybucji stosuje lub przynajmniej rozpoznaje pakiety
plików RPM – ułatwiające instalację, rozbudowę i usuwanie oprogramowania.
ƒ Wczesne dystrybucje: SLS, Slackware.
ƒ Popularne dystrybucje: RedHat, Debian, SuSE, Caldera, Fedora itd.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
3
Podstawy projektu
• Linux jest wielodostępnym (multiuser), wielozadaniowym
(multitasking) systemem operacyjnym z pełnym zestawem
narzędzi zgodnych z systemem UNIX.
• System plików Linuxa jest zgodny z tradycyjną semantyką
uniksową.
• Linux realizuje w pełni sieciowy standard systemu UNIX.
• Głównymi celami projektowymi są: szybkość, wydajność i
standaryzacja.
• Linux został zaprojektowany tak, aby pozostawał w zgodzie z
istotnymi dokumentami standardu POSIX (zbiór specyfikacji
dotyczących wspólnych własności systemu operacyjnego); co
najmniej dwie dystrybucje Linuxa zdobyły oficjalne certyfikaty
komitetu normalizacyjnego POSIX.
• Interfejs programisty w systemie Linux odpowiada semantyce
systemu SVR4 UNIX, a nie zachowaniu systemu BSD – do
realizacji semantyki BSD w miejscach, gdzie oba sposoby
działania istotnie się różnią, służy oddzielny zbiór bibliotek.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
4
Składowe systemu Linux
Programy
zarządzania
systemem
Procesy
użytkowe
Pomocnicze
programy
użytkowe
Kompilatory
Wspólne biblioteki systemu
Jądro Linux
Ładowalne moduły jądra
™ System Linux składa się z trzech głównych fragmentów kodu:
• Jądro: jest odpowiedzialne za realizację wszystkich istotnych abstrakcji systemu
operacyjnego.
ƒ Kod jądra jest wykonywany w trybie jądra (kernel mode) z pełnym dostępem do
wszystkich fizycznych zasobów komputera.
ƒ Cały kod jądra ze wszystkimi strukturami danych przebywa w tej samej pojedynczej
przestrzeni adresowej
•
•
Biblioteki systemowe: Definiują standardowy zbiór funkcji, za pomocą których
aplikacje mogą współpracować z jądrem i które realizują wiele właściwości
systemu operacyjnego nie wymagających pełnych przywilejów kodu jądra.
Pomoce systemowe: wykonują osobne, specjalizowane zadania administracyjne.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
5
Moduły jądra
• Moduły jądra są to części kodu jądra, które mogą być
kompilowane, ładowane i usuwane niezależnie od reszty jądra.
• Moduł jądra zazwyczaj steruje pracą urządzenia, systemem plików
lub protokołem sieciowym.
• Moduły jądra są przydatne z następujących powodów:
ƒ W celu dodania nowych właściwości do jądra wystarczy napisać nowy
moduł jądra i korzystać z niego bez przebudowy całego jądra.
ƒ Interfejs modułów jądra umożliwia osobom postronnym pisanie i
rozpowszechnianie na własnych zasadach modułów sterujących urządzeń
lub systemów plików, których nie można rozpowszechniać na zasadach
licencji GPL.
ƒ Moduły jądra pozwalają na zestawianie systemu Linux z minimalnym,
standardowym jądrem bez wbudowywania w nie żadnych dodatkowych
modułów sterujących urządzeń.
• Moduły jądra są wspomagane przez trzy następujące składowe:
ƒ Zarządzanie modułami (module management);
ƒ Rejestracja modułów sterujących (driver registration);
ƒ Mechanizm rozwiązywania konfliktów (conflict resolution).
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
6
Zarządzanie modułami
• Umożliwia wprowadzenie modułów do pamięci i ich kontakt z
resztą jądra.
• Zadanie ładowania modułu jądra podzielone jest na dwie sekcje:
ƒ Zarządzanie częściami kodu modułu w pamięci jądra;
ƒ Manipulowanie symbolami, do których modułom wolno się odwoływać.
• Ładowanie modułu przebiega w dwu etapach:
ƒ Ładowacz modułu (module loader) zgłasza zapotrzebowanie na ciągły
obszar pamięci wirtualnej jądra potrzebny dla modułu, a jądro zwraca adres
przydzielonej pamięci.
ƒ Wywołanie systemowe przekazuje moduł do jądra wraz niezbędną tablicą
symboli, które chce on eksportować (moduł jest słowo po słowie kopiowany
do zarezerwowanego obszaru, a tablica symboli jądra jest aktualizowana za
pomocą nowych symboli).
• Ostatnią składową zarządzania modułem jest procedura
zamawiania modułu (module requestor).
ƒ Zarządza ładowaniem zamawianych modułów, których aktualnie nie ma w
pamięci.
ƒ Regularnie odpytuje jądro, sprawdzając, czy dynamicznie załadowany moduł
jest ciągle w użyciu, a gdy nie jest już potrzebny, usuwa go z pamięci.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
7
Rejestrowanie modułu sterującego
• Umożliwia modułowi poinformowanie reszty jądra o udostępnieniu
nowego modułu sterującego.
• Jądro utrzymuje dynamiczne tablice wszystkich znanych modułów
sterujących (programów obsługi urządzeń, device drivers) i
dostarcza zestawu procedur umożliwiających dodawanie do tych
tablic lub usuwanie z nich modułów sterujących w dowolnej chwili.
• Tablice rejestracyjne zwierają następujące elementy:
ƒ Moduły sterujące urządzeń: znakowych (terminale, myszki drukarki itp.),
blokowych (programy obsługi dysków) oraz interfejsów sieciowych.
ƒ Systemy plików: oprogramowanie realizujące procedury wywołań
wirtualnego systemu plików Linuxa, zarówno lokalnego, jak i sieciowego.
ƒ Protokoły sieciowe: cały protokół sieciowy, np. IPX, lub nowy zbiór reguł
filtrowania pakietów przez zaporę ogniową.
ƒ Format binarny: określa zasady rozpoznawania i ładowania pliku
wykonywalnego nowego typu.
• Ponadto moduł może zarejestrować nowy zbiór wpisów w tablicach
sysctl i /proc, aby umożliwić jego konfigurowanie dynamiczne.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
8
Rozwiązywanie konfliktów
• System Linux pracuje na sprzęcie występującym w różnych i
zmieniających się konfiguracjach, mogą się więc pojawiać
problemy konfliktów między modułami sterującymi urządzeń przy
dostępie do tych samych zasobów.
• Linux posiada centralny mechanizm rozwiązywania konfliktów,
który pozwala rozstrzygać o dostępie do zasobów sprzętowych.
• Do głównych celów tego mechanizmu należą:
ƒ Ochrona modułów przed kolizjami przy dostępie do zasobów sprzętowych;
ƒ Zapobieganie zaburzaniu działania istniejących modułów sterujących przez
autosondy (autoprobes), tj. testy inicjowane przez moduły sterujące w celu
automatycznego wykrycia konfiguracji sprzętu;
ƒ Rozwiązywanie konfliktów między wieloma modułami sterującymi
usiłującymi skorzystać z tego samego sprzętu.
• Aby osiągnąć te cele, jądro utrzymuje wykazy przydzielonych
zasobów sprzętowych – jeżeli jakiś moduł sterujący urządzenia
chce sięgnąć po zasób, musi go najpierw zarezerwować w bazie
danych jądra (w przypadku niepowodzenia rezerwacji moduł może
zażądać swego usunięcia lub skorzystać ze środków zastępczych).
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
9
Zarządzanie procesami
• System UNIX rozdziela tworzenie procesów i wykonywanie
nowych programów na dwie odrębne operacje:
ƒ Funkcja systemowa fork tworzy nowy proces.
ƒ Wykonanie nowego programu odbywa się poprzez wywołanie funkcji exec.
• W systemie UNIX proces obejmuje całość informacji, które system
operacyjny musi utrzymywać, aby śledzić kontekst wykonywania
indywidualnego programu.
• W systemie Linux cechy procesu dzielą się na trzy grupy:
tożsamość, jego środowisko i kontekst.
• Tożsamość procesu – podstawowe elementy:
ƒ Identyfikator procesu (process identifier – PID) → patrz ćwiczenia.
ƒ Uwierzytelnienia (credentials): identyfikator użytkownika oraz jeden lub
więcej identyfikatorów grup użytkowników – określające prawa procesu do
sięgania po zasoby systemowe i pliki.
ƒ Indywidualność (personality): każdy proces ma przypisany identyfikator
indywidualności, który może nieco zmieniać semantykę niektórych funkcji
systemowych (nie występuje w tradycyjnych systemach UNIX).
¾ Ograniczoną kontrolę nad większością identyfikatorów sprawuje sam proces,
jednak PID procesu pozostaje niezmienny aż do jego zakończenia.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
10
Środowisko procesu
• Proces dziedziczy środowisko po procesie macierzystym – składa
się ono z dwu wektorów zakończonych wskaźnikiem NULL:
ƒ Wektor argumentów (argument vector) – wykaz argumentów wywołania
programu (zgodnie z konwencją zaczyna się od nazwy samego programu).
ƒ Wektor środowiska (environment vector) – wykaz par: nazwa = wartość,
kojarzących nazwane zmienne środowiskowe z dowolnymi wartościami
tekstowymi.
• Środowisko przechowywane jest w prywatnej przestrzeni
adresowej procesu jako pierwsza dana na szczycie jego stosu.
• Przekazywanie zmiennych środowiskowych pomiędzy procesami
oraz ich dziedziczenie przez proces potomny dostarcza elastycznych
środków przekazywania informacji do różnych składowych
oprogramowania systemowego na poziomie użytkowym.
• Mechanizm zmiennych środowiskowych umożliwia dostosowanie
systemu operacyjnego do specjalnych potrzeb przez zestawianie go z
procesów, a nie konfigurowanie jako systemu rozpatrywanego
całościowo (np. użytkownicy mogą wybierać własne języki lub
ulubione edytory niezależnie od siebie).
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
11
Kontekst procesu
¾ Kontekst procesu: stan wykonywanego procesu rozpatrywany w dowolnej
chwili czasu – nieustannie się zmienia!
• Kontekst planowania: informacje potrzebne planiście do zawieszania i
wznawiania procesu – najważniejsza część kontekstu; należą do nich
przechowywane kopie wszystkich rejestrów procesu, informacje o priorytecie
planowania, wszystkich nie obsłużonych sygnałach, a także jądrowy stos procesu
zarezerwowany do wyłącznego użytku przez kod w trybie jądra (np. przez funkcje
systemowe, przerwania itp.).
• Rozliczanie: jądro utrzymuje informacje o zasobach zużywanych na bieżąco
przez każdy z procesów oraz o ich łącznej ilości skonsumowanej przez proces w
jego dotychczasowym przebiegu.
• Tablica plików: zawiera wskaźniki do jądrowych struktur plików – wykonując
systemowe operacje WE/WY procesy odwołują się do plików przy pomocy
indeksów do tej tablicy.
• Kontekst systemu plików: odnosi się do zamówień na otwarcie nowych plików
– informacje o bieżącym katalogu głównym oraz domyślnych katalogach
używanych do szukania nowych plików.
• Tablica obsługi sygnałów: określa procedurę w przestrzeni adresowej procesu,
która ma być wywołana po nadejściu konkretnego sygnału.
• Kontekst pamięci wirtualnej: opisuje całą zawartość prywatnej przestrzeni
adresowej procesu.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
12
Procesy i wątki
• Linux stosuje tę samą wewnętrzną reprezentację dla procesów i
wątków – wątek jest po prostu nowym procesem, któremu zdarza
się dzielić ze swoim rodzicem tę samą przestrzeń adresową.
• Rozróżnienie między procesem a wątkiem pojawia się wtedy, gdy
wątek jest tworzony przy pomocy funkcji systemowej clone.
ƒ Funkcja fork tworzy nowy proces z własnym, całkowicie nowym kontekstem.
ƒ Funkcja clone tworzy nowy proces z odrębną tożsamością, ale taki któremu
pozwala się dzielić struktury danych jego rodzica.
¾ Rozróżnienie to jest możliwe, ponieważ Linux przechowuje kontekst w
postaci niezależnych podkontekstów – w oddzielnych strukturach danych
(struktura danych procesu zawiera wskaźniki do struktur danych
podkontekstów, więc podkontekst może być łatwo dzielony przez procesy).
• Funkcja systemowa clone tworząc nowy proces, przyjmuje
argument określający, które podkonteksty należy skopiować, a
które mają być wspólne.
• Użycie funkcji clone pozwala na dokładniejsze określenie w
aplikacji, co ma być dzielone między dwa wątki.
• Linux dostarcza również mechanizmu pozwalającego na realizację
wątków standardu POSIX (Pthreads) – na poziomie użytkownika.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
13
•
Planowanie
Planowanie (scheduling) – przydzielanie czasu procesora różnym
zadaniom systemu operacyjnego.
• Oprócz normalnego uruchamiania i przerywania procesów,
planowanie w systemie Linux obejmuje także wykonywanie
różnych zadań jądra, zarówno zlecanych przez działający proces,
jak też wykonywanych wewnętrznie na zlecenia modułu sterującego
jakiegoś urządzenia.
Synchronizacja jądra
• Zamówienie na działanie w trybie jądra można wykonać na dwa
sposoby:
ƒ Wykonywany program może zamówić usługę systemu operacyjnego jawnie
(za pomocą wywołania systemowego) albo niejawnie, np. przez brak strony.
ƒ Moduł sterujący urządzenia może wysłać przerwanie, które spowoduje, że
procesor zacznie wykonywać kod jądrowej procedury obsługi przerwania.
• Synchronizacja jądra wymaga regulacji pozwalających na
wykonywanie sekcji krytycznych jądra w sposób wzajemnie nie
kolidujący – aby nie uszkodzić lub nie doprowadzić do niespójności
struktur danych, z których zadania jądra korzystają.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
14
Synchronizacja jądra – c.d.
•
Linux używa dwóch technik do ochrony sekcji krytycznych jądra:
1.
2.
•
Zwykły kod jądra jest niewywłaszczalny – gdy przerwanie czasomierza zostanie
odebrane w czasie kiedy proces wykonuje jądrową systemową procedurę obsługi,
ustawiany jest jądrowy znacznik need_resched, który spowoduje uruchomienie
planisty po zakończeniu wywołania systemowego.
Technika do ochrony sekcji krytycznych występujących w procedurach obsługi
przerwań – przez użycie sprzętu nadzorującego przerwania procesora w celu zakazu
przerwań w trakcie wykonywania sekcji krytycznej; jądro gwarantuje, że jej
wykonanie przebiegnie bez ryzyka współbieżnego dostępu do dzielonych struktur
danych.
Aby uniknąć pogorszenia wydajności systemu na skutek wyłączania przerwań, w
jądrze zastosowano architekturę synchronizacji umożliwiającą wykonywanie
długich sekcji krytycznych bez wyłączania przerwań na czas trwania całej sekcji.
¾ W procedurach obsługi przerwań wyodrębnione są dwie części:
ƒ
ƒ
9
Górna połowa (top half) – zwykła procedura obsługi przerwań; przebiega z
wyłączonymi rekurencyjnymi przerwaniami (może być przerwana tylko przez
przerwania o wyższym priorytecie, a przerwania o ≤ priorytecie są zablokowane).
Dolna połowa (bottom half) – procedura przebiega z włączonymi wszystkimi
przerwaniami i jest nadzorowana przez miniaturowego planistę, który zapewnia, że
dolne połowy nigdy nie przerywają się wzajemnie.
Ta architektura jest uzupełniana przez mechanizm wyłączania wybranych dolnych
połów podczas wykonywania zwykłego, pierwszoplanowego kodu jądra.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
15
Poziomy ochrony przed przerwaniami
Dolne połowy procedur obsługi przerwań
Systemowe procedury jądrowe
(niewywłaszczalne)
Programy trybu użytkownika
(wywłaszczalne)
Rosnący priorytet
Górne połowy procedur obsługi przerwań
• Każdy poziom może być przerwany przez kod wykowywany
na wyższym poziomie, ale nigdy nie będzie przerwany przez
kod wykonywany na tym samym lub niższym poziomie.
• Procesy trybu użytkownika mogą być zawsze wywłaszczane
przez inne procesy w chwilach określonych przerwaniami
zegarowymi służącymi do realizacji podziału czasu.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
16
Planowanie procesów
• Linux ma dwa oddzielne algorytmy planowania procesów:
ƒ Algorytm z podziałem czasu do sprawiedliwego planowania z
wywłaszczeniami działania wielu procesów.
ƒ Algorytm czasu rzeczywistego dla zadań, w których priorytety bezwzględne
są ważniejsze niż sprawiedliwość.
• W skład tożsamości każdego procesu wchodzi klasa planowania
definiująca, który z algorytmów ma być zastosowany dla procesu.
• Dla procesów z podziałem czasu Linux używa algorytmu
priorytetowego, opartego na kredytowaniu.
ƒ Reguła kredytowania: kredyt = kredyt / 2 + priorytet
ƒ Do wykonywania wybierany jest proces z najwyższym kredytem.
ƒ Przy każdym przerwaniu od pochodzącym czasomierza proces wykonywany
traci jednostkę kredytu.
ƒ Kiedy jego kredyt spadnie do zera, zostaje on zawieszony, a do wykonywania
wybiera się inny proces.
ƒ Jeśli żaden z procesów gotowych do działania nie ma kredytu, to system
wykonuje operację wtórnego kredytowania według powyższej reguły.
¾ Ten system kredytowania automatycznie preferuje procesy interakcyjne,
uzależnione od wejścia-wyjścia, dla których istotny jest czas odpowiedzi.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
17
•
•
Planowanie procesów – c.d.
Linux realizuje dwie klasy planowania w czasie rzeczywistym: algorytm FCFS
(„pierwszy zgłoszony – pierwszy obsłużony”) oraz algorytm rotacyjny.
Każdy proces czasu rzeczywistego oprócz klasy planowania ma również priorytet.
ƒ Planista wykonuje zawsze proces o najwyższym priorytecie – spośród procesów o
równych priorytetach, do wykonania wybierany jest proces, który najdłużej czekał.
ƒ Procesy FCFS działają do końca lub do zablokowania.
ƒ W algorytmie rotacyjnym proces zostanie po chwili wywłaszczony i przesunięty na
koniec kolejki planowania – procesy o równych priorytetach będą automatycznie dzielić
czas między siebie.
¾ Planowanie w czasie rzeczywistym jest łagodne, a nie rygorystyczne (np. kod jądra
nie może być nigdy wywłaszczony przez kod poziomu użytkownika).
Wieloprzetwarzanie symetryczne
•
•
•
Jądro Linux 2.0 było pierwszym jądrem Linuxa wspierającym sprzęt
wieloprocesora symetrycznego (symmetric multiprocessor – SMP) – różne
procesy lub wątki mogą działać równolegle na oddzielnych procesorach.
W celu spełnienia bezwywłaszeniowych wymagań synchronizacji jądra, SMP
używa wirującej blokady w jądrze nakładającej ograniczenie, że w danej chwili
tylko jeden procesor może wykonywać kod w trybie jądra.
Od wersji Linux 2.2 implementacja SMP używa ponadto wielu blokad (zamków)
odnoszących się do pojedynczych struktur danych jądra, co daje możliwość
jednoczesnego wykonywania kodu w trybie jądra przez wiele procesorów.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
18
•
Zarządzanie pamięcią
Zarządzanie pamięcią w systemie Linux obejmuje dwie składowe:
ƒ System zarządzania pamięcią fizyczną – zajmuje się przydzielaniem i zwalnianiem
stron (ramek), ich grup i małych bloków pamięci.
ƒ Mechanizm obsługi pamięci wirtualnej – będącej odwzorowaniem pamięci
operacyjnej na przestrzenie adresowe wykonywanych procesów.
Zarządzanie pamięcią fizyczną
•
•
Dyspozytor stron (page allocator) odpowiada za przydział i zwalnianie
wszystkich stron fizycznych – może przydzielać na zamówienie partie stron
fizycznie ze sobą sąsiadujących.
Dyspozytor stosuje algorytm sąsiedzkich stert (buddy-heap) w celu rejestrowania
dostępnych stron fizycznych (ramek).
ƒ Łączy w pary przyległe do siebie jednostki przydziału.
ƒ Ilekroć dwa sąsiadujące obszary są zwalniane, łączy się je w większy obszar itd.
ƒ Gdy małe zamówienie na pamięć nie może być zrealizowane przez przydział
istniejącego, małego obszaru, wówczas większy wolny obszar zostanie podzielony na
dwa sąsiednie, tak by zrealizować zamówienie.
•
•
Przydziały pamięci w jądrze Linuxa odbywają się statycznie (moduły sterujące
rezerwują ciągłe obszary pamięci podczas rozruchu systemu) lub dynamicznie –
za pomocą dyspozytora stron.
Istnieje kilka specjalizowanych podsystemów zarządzania pamięci (korzystają
one z dyspozytora stron), np. alokator obszarów zmiennej długości: kmalloc.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
19
Pamięć wirtualna
• System pamięci wirtualnej sprawuje pieczę nad przestrzenią
adresową widoczną dla każdego z procesów: tworzy strony pamięci
wirtualnej na żądanie i zarządza sprowadzaniem ich z dysku lub
odsyłaniem ich z powrotem na dysk w razie potrzeby.
• Zarządca pamięci wirtualnej utrzymuje dwa osobne obrazy
przestrzeni adresowej procesu:
ƒ Zbiór oddzielnych obszarów: obraz logiczny odzwierciedlający rozkazy,
które system pamięci wirtualnej otrzymywał przy organizowaniu przestrzeni
adresowej – przestrzeń adresowa składa się tutaj ze zbioru nie zachodzących na
siebie obszarów, reprezentujących ciągłe podzbiory przyległych stron.
ƒ Zbiór stron: fizyczny obraz każdej przestrzeni adresowej, który jest pamiętany
w sprzętowej tablicy stron procesu – każdy wpis w tablicy określa dokładnie
bieżące położenie każdej strony pamięci wirtualnej.
• Obszary pamięci wirtualnej są scharakteryzowane przez:
ƒ Pamięć pomocniczą obszaru – określa skąd pochodzą strony obszaru; obszary
zwykle mają jako zaplecze pliki lub nie mają żadnego zaplecza.
ƒ Sposób reagowania na pisanie – dla obszaru odwzorowanego prywatnie
wykonuje się kopiowanie przy zapisie, a dla obszaru wspólnego uaktualnienie.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
20
•
Pamięć wirtualna – c.d.
Jądro tworzy nową przestrzeń adresową w dwu sytuacjach:
ƒ Gdy proces rozpoczyna wykonanie nowego programu za pomocą funkcji systemowej
exec – proces otrzymuje nową, całkowicie pustą wirtualną przestrzeń adresową, a jej
zapełnienie należy do procedur ładujących program.
ƒ Przy tworzeniu nowego procesu za pomocą funkcji systemowej fork – proces
otrzymuje pełną kopię wirtualnej przestrzeni adresowej swojego przodka; po
operacji rozwidlenia procesy macierzysty i potomny dzielą w swoich przestrzeniach
adresowych te same fizyczne strony pamięci.
•
Ważnym zadaniem systemu pamięci wirtualnej jest przemieszczanie stron z
pamięci operacyjnej na dysk, kiedy występuje zapotrzebowanie na pamięć.
System stronicowania Linuxa można podzielić na dwie części:
ƒ Algorytm postępowania (policy algorithm) – decyduje o tym, które strony zapisywać
na dysku i kiedy; przy odsyłaniu stron stosuje się zmodyfikowany algorytm zegarowy
z postarzaniem stron, gdzie wiek strony jest miarą stopnia jej aktywności w ostatnim
czasie – przy odsyłaniu stron stosuje się kryterium najrzadszego ich używania (LFU).
ƒ Mechanizm stronicowania (paging mechanism) – realizuje przesłanie i sprowadza
strony danych z powrotem do pamięci fizycznej w razie potrzeby; umożliwia
stronicowanie zarówno z użyciem urządzeń i partycji wymiany, jak i zwykłych
plików – przy zapisie stron na dysku stosuje się algorytm najbliższego dopasowania
(next fit), bloki na dysku przydzielane są wg. mapy bitowej używanych bloków.
•
Wirtualna pamięć jądra – stały, zależny od architektury obszar wirtualnej
przestrzeni adresowej każdego procesu zarezerwowany do użytku jądra; zawiera
m.in. odwołania tablicy stron do każdej dostępnej, fizycznej strony w systemie.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
21
Wykonywanie i ładowanie programów użytkownika
• Linux utrzymuje tablicę możliwych funkcji ładujących, dając
każdej z nich szansę spróbowania umieszczenia w pamięci danego
pliku podczas wykonywania funkcji systemowej exec.
• Dzięki możliwości rejestrowania wielu procedur ładujących, Linux
może łatwo obsługiwać zarówno nowszy format ELF, jak i a.out.
• Plik binarny nie jest wprowadzany do pamięci przez ładowacz
plików binarnych (binary loader), ale dokonywane jest
odwzorowanie jego stron w obszary pamięci wirtualnej; strona jest
ładowana do pamięci fizycznej dopiero po nieudanej próbie
odwołania do niej przez program.
• Plik binarny formatu ELF (Executable and Linking Format) składa
się z nagłówka, po którym następuje kilka sekcji dopasowanych do
granic stron (page-aligned).
ƒ Program ładujący formatu ELF czyta nagłówek i odwzorowuje sekcje pliku
na osobne obszary pamięci wirtualnej.
ƒ Po dokonaniu odwzorowania program ładujący ustawia w procesie wstępny
stan rejestru licznika rozkazów za pomocą wartości początkowej
zapamiętanej w nagłówku ELF i wtedy proces staje się gotowy do wykonania
(może kandydować do przydziału procesora).
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
22
Organizacja pamięci w programach formatu ELF
Pamięć niewidoczna
dla kodu w trybie
użytkownika
Pamięć wirtualna jądra
Stos
Obszar odwzorowany w pamięci
Obszar odwzorowany w pamięci
Obszar odwzorowany w pamięci
Wskaźnik brk
Dane fazy wykonywania
Dane bez wartości początkowych
Dane z wartościami początkowymi
Tekst programu (kod binarny)
(granica obszaru danych
przydzielanych dynamicznie)
Obszar zakazany
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
23
Łączenie statyczne i dynamiczne
• Łączenie statyczne (static linking):
ƒ Wszystkie potrzebne funkcje biblioteczne zostają osadzone wprost w binarnym
pliku wykonywalnym podczas budowania przez programistę aplikacji.
ƒ Statycznie połączone (skonsolidowane) pliki wykonywalne mogą podjąć
działanie natychmiast po załadowaniu.
/ Główną wadą jest to, że każdy wygenerowany program musi zawierać kopie
dokładnie tych samych systemowych funkcji bibliotecznych.
•
Łączenie dynamiczne (dynamic linking):
ƒ Każdy program zawiera małą, statycznie dołączaną funkcję, wywoływaną na
początku programu.
ƒ Funkcja ta odwzorowuje specjalną bibliotekę konsolidacji w pamięci i
powoduje wykonanie jej kodu.
ƒ Biblioteka konsolidacji czyta wykaz bibliotek dynamicznych (dzielonych)
wymaganych przez program oraz zawartych w nich potrzebnych zmiennych i
funkcji, analizując informacje zawarte w formacie binarnym ELF.
ƒ Następnie odwzorowuje te biblioteki w pamięci wirtualnej, kierując odwołania
systemowe do zawartych w nich symboli.
¾ Biblioteki dzielone są kompilowane w kod niezależny od położenia
(position-indepentent code – PIC), dzięki czemu mogą być odwzorowywane w
dowolne miejsca pamięci wirtualnej (i wykonywane pod każdym adresem).
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
24
Systemy plików
•
•
•
Dla użytkownika system plików Linuxa jawi się jako hierarchiczne drzewo
katalogów spełniające semantykę systemu UNIX.
Jądro Linuxa obsługuje różnorodne typy plików, ukrywając szczegóły
implementacyjne za warstwą programową, czyli wirtualnym systemem plików
(virtual file system – VFS).
Wirtualny system plików Linuxa został zaprojektowany w oparciu o zasady
programowania obiektowego – ma dwie składowe:
ƒ Zbiór definicji określających, jak powinien wyglądać obiekt o nazwie plik: struktury
obiektu i-węzła oraz obiektu pliku reprezentują poszczególne pliki, a obiekt
systemu plików reprezentuje cały system plików.
ƒ Warstwa oprogramowania do działań na takich obiektach: każdy z obiektów
powyższych typów zawiera wskaźnik do tablicy funkcji, zawierającej adresy funkcji
implementujących działania na danym obiekcie.
•
•
Obiekt systemu plików reprezentuje połączony zbiór plików, który tworzy
zamkniętą w sobie hierarchię katalogów – utrzymywany przez jądro dla
każdego systemu plików udostępnianego z zamontowanego dysku lub przez sieć.
Obiekty i-węzłów oraz plików są mechanizmami dostępu do plików: obiekt iwęzła reprezentuje plik jako całość, a obiekt pliku reprezentuje punkt dostępu do
danych wewnątrz pliku (proces uzyskuje dostęp do i-węzła poprzez obiekt pliku).
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
25
•
•
•
System plików ext3
Standardowym dyskowym systemem plików Linuxa jest system ext3, będący
rozszerzeniem systemu ext2 o kronikowanie (journaling) (strukturę dziennika).
System ext2 stosuje on podobny jak w systemie BSD ffs (Fast File System)
mechanizm odnajdywania bloków danych należących do konkretnego pliku.
Główna różnica między systemami ext2 i ffs dotyczy sposobu przydziału dysku:
ƒ System ffs przydziela plikom dysk blokami po 8 KB oraz dzieli bloki na porcje 1 KB
w celu pamiętania małych plików lub niepełnych bloków na końcach plików.
ƒ System ext2 używa bloków cząstkowych, ale dokonuje przydziałów za pomocą
mniejszych jednostek: standardowy blok ma wielkość 1 KB, choć stosuje się też bloki
o wielkościach 2 KB i 4 KB.
ƒ System ext2 stosuje politykę przydziału zmierzającą do umieszczania logicznie
sąsiadujących bloków pliku w fizycznie przylegających blokach dyskowych, dzięki
czemu może on w jednej operacji składać zamówienia WE/WY dla wielu bloków.
•
Zasady przydziału miejsca na dysku w systemie ext2:
ƒ System plików jest podzielony na wiele grup bloków – przydzielając miejsce dla
pliku, system najpierw wybiera grupę bloków, do której przydzielono i-węzeł pliku; do
przydzielania i-węzła pliku wybiera tę grupę bloków, w której jest katalog macierzysty.
ƒ Wewnątrz grupy bloków system ext2 próbuje w miarę możliwości dokonywać
przydziałów ciągłych fizycznie, dążąc do zmniejszenia fragmentacji; aby zwiększyć
wydajność stara się, gdzie to możliwe, przydzielać miejsce porcjami 8-blokowymi.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
26
Zasady przydziału bloków w systemie ext2
Przydzielanie rozrzuconych wolnych bloków
Przydzielanie przyległych wolnych bloków
Blok zajęty
Blok wybrany przez
procedurę przydziału
Granica bitu
Blok wolny
Kierunek przeszukiwania mapy bitowej
Granica bajta
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
27
•
•
•
System plików Linux-proc
Procesowy system plików (process file system) Linuxa, zwany systemem plików
proc, jest przykładem systemu plików, którego dane nie są nigdzie pamiętane,
natomiast oblicza się je na żądanie, stosownie do wydawanych przez użytkownika
zamówień na operacje WE/WY.
System plików proc wprowadzono w systemie UNIX SVR4 jako wydajny interfejs
wspierający usuwanie błędów z procesów jądra – pojedynczy podkatalog tego
systemu odpowiadał aktywnemu procesowi.
Linux rozszerza system plików proc o specjalne katalogi i pliki, odpowiadające
różnym statystykom dotyczącym jądra i skojarzonych z nim modułów sterujących,
‰ Np. polecenie ps podaje informacje o procesach pobrane z systemu plików proc.
•
System proc musi realizować strukturę katalogów oraz zawartość umieszczonego w
niej pliku; zgodnie z semantyką systemu UNIX, musi definiować niepowtarzalny i
trwały numer i-węzła dla każdego katalogu i skojarzonych z nim plików.
ƒ Te numery i-węzłów są używane w celu rozpoznawania operacji potrzebnej wtedy,
gdy użytkownik próbuje czytać dane z i-węzła pliku lub przeszukiwać i-węzeł katalogu.
ƒ 32-bitowy numer i-węzła podzielony jest na dwie części: 16 górnych bitów zawiera PID
procesu, a pozostałe bity określają zamawiany typ informacji o danym procesie.
ƒ Kiedy dane są czytane z któregoś z tych plików, proc gromadzi odpowiednie informacje,
nadając im formę tekstową i umieszcza je w buforze zamawiającego je procesu.
ƒ Do wydajnego dostępu do danych jądra służy wywołanie systemowe sysctl.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
28
Wejście-wyjście (WE/WY)
• System WE/WY Linux jest zrealizowany jak w typowym systemie
UNIX: wszystkim modułom sterującym urządzeń nadaje się
wygląd zwykłych plików.
• Administrator systemu może tworzyć w systemie plików specjalne
pliki, które zawierają odwołania do określonych modułów
sterujących urządzeń; może im nadawać prawa dostępu jak dla
zwykłych plików.
• Użytkownik może otwierać kanał dostępu do urządzenia w ten sam
sposób, jak otwiera dowolny inny plik – urządzenia mogą wyglądać
jak obiekty w systemie plików.
• Linux dzieli wszystkie urządzenia na trzy klasy:
ƒ Urządzenia blokowe – umożliwiają swobodny dostęp do całkowicie
niezależnych bloków danych o stałym rozmiarze, np. dyski.
ƒ Urządzenia znakowe – obejmują większość innych urządzeń, np. taśmy,
klawiatury, terminale, myszy, głośniki, mikrofony itd.; nie muszą mieć
wszystkich własności regularnych plików.
ƒ Urządzenia sieciowe – użytkownicy nie mogą do nich bezpośrednio
przekazywać danych, lecz muszą się komunikować za pośrednictwem
podsystemu sieciowego jądra.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
29
Komunikacja międzyprocesowa
• Standardowym mechanizmem służącym do powiadamiania procesu
o wystąpieniu asynchronicznego zdarzenia jest sygnał:
ƒ Liczba sygnałów jest ograniczona i nie mogą one przenosić informacji –
jedynie fakt wystąpienia sygnału jest dostępny procesowi.
ƒ Jądro Linuxa nie korzysta wewnętrznie z sygnałów w celu komunikowanie
się z procesami wykonywanymi w trybie jądra, zamiast tego używa
mechanizmu planowanych stanów i struktur wait_queue.
• Do synchronizowania procesów Linux implementuje mechanizm
semaforów systemu UNIX wydania V (przy użyciu wait_queue).
• Przekazywanie danych między procesami:
ƒ Standardowy uniksowy mechanizm potoku nienazwanego (pipe) – potok ma
dwie kolejki wait_queue do synchronizowania producenta i konsumenta.
ƒ Mechanizm potoku nazwanego (named pipe), zwanego też potokiem FIFO
– może łączyć dowolne procesy w systemie, a nie tylko procesy pokrewne.
ƒ Pamięć dzielona (shared memory) systemu UNIX V – najszybszy środek
przekazywania danych między procesami, ale nie zapewnia synchronizacji.
ƒ Kolejki komunikatów (message queues) systemu UNIX V – synchroniczne
przekazywanie danych między procesami drogą przesyłania komunikatów.
¾ Więcej szczegółów na ćwiczeniach.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
30
¾
Bezpieczeństwo
Zagadnienia bezpieczeństwa można podzielić na dwie grupy:
ƒ
ƒ
•
Uwierzytelnianie – zapewnienie, że nikomu nie uda się uzyskać dostępu do
systemu bez uprzedniego wykazania, że ma do tego prawo.
Kontrola dostępu – dostarczanie mechanizmu sprawdzania, czy użytkownik ma
prawo dostępu do danego obiektu i realizowanie ochrony obiektów przed dostępem.
Uwierzytelnianie:
ƒ
ƒ
ƒ
ƒ
Podstawowym mechanizmem uwierzytelniania są hasła: hasło użytkownika zostaje
zmieszane z wartością losową („przyprawione”), zakodowane za pomocą funkcji
jednokierunkowej i zapamiętane w pliku haseł.
Aby utrudnić łamanie haseł, przechowuje się zaszyfrowane hasło w pliku
niedostępnym do czytania dla ogółu, pozwala się na dłuższe hasła, nie zezwala się
na używanie łatwych haseł (np. wyrazów słownikowych), ogranicza się liczbę
niepoprawnie wprowadzonych haseł, rejestruje się przypadki nieudanych prób
uwierzytelnienia, stosuje się bezpieczniejsze metody kodowania itd.
Linux implementuje też system dołączalnych modułów uwierzytelniania
(pluggable authentication modules – PAM) – umożliwia ładowanie modułów
uwierzytelniania, które mogą określać sposoby uwierzytelniania, ograniczenia
działań na kontach, funkcje kształtowania sesji lub funkcje zmiany hasła (w celu
uaktualnienia wszystkich niezbędnych uwierzytelnień).
System PAM może być używany przez dowolną składową systemu, która
potrzebuje uwierzytelnień.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
31
•
Bezpieczeństwo – c.d.
Kontrola dostępu:
ƒ
ƒ
ƒ
ƒ
Kontrolowanie dostępu odbywa się za pomocą niepowtarzalnych
identyfikatorów numerycznych: użytkownika – UID, grupy – GID.
Linux nadzoruje dostępy przez przypisywanie obiektom masek
ochronnych (protection masks), określających, które tryby dostępu:
pisanie, czytanie lub wykonywania są udzielane procesom z dostępem
właściciela, grupy lub świata (pozostałych użytkowników).
Jedynym wyjątkiem jest uprzywilejowany identyfikator użytkownika root
– automatycznie udziela się mu dostępu do dowolnego obiektu w systemie.
Linux rozszerza standardowy uniksowy mechanizm setuid na dwa sposoby:
1. Mechanizm przechowywanego identyfikatora użytkownika (saved user-id)
standardu POSIX, który pozwala procesowi wielokrotnie pozbywać się
identyfikatora efektywnego (skutecznego) (EUID) i ponownie go nabywać.
2. Dodatkowe charakterystyki procesu (np. FSUID i FSGID) umożliwiające
udzielanie podzbioru praw efektywnego identyfikatora użytkownika (EUID).
ƒ
Linux dostarcza też mechanizm umożliwiający klientowi wybiórcze
przekazanie dostępu do jednego pliku jakiemuś procesowi serwera, bez
dawania temu procesowi jakichkolwiek innych praw (np. możliwość
wydrukowania pliku przez serwer) – przy pomocy gniazda sieciowego.
Wiesław Płaczek
Systemy Operacyjne: Wykład 12
32

Podobne dokumenty