SYSTEMY OPERACYJNE
dr. hab. Vitaliy Yakovyna
yakovyna@matman.uwm.edu.pl http://wmii.uwm.edu.pl/~yakovyna/
UNIWERSYTET WARMIŃSKO-MAZURSKI W OLSZTYNIE
Wydział Matematyki i Informatyki
Struktura Systemu
Operacyjnego
Usługi Systemu
Operacyjnego
Usługi Systemu Operacyjnego
• System operacyjny zapewnia środowisko do wykonywania programów
• Udostępnia niektóre usługi programom i użytkownikom tych programów
• Usługi te również ułatwiają programistom zadanie programowania
• Określone usługi różnią się w zależności od systemu operacyjnego
Widok Usług Systemu
Operacyjnego
Wywołania Systemowe
Wywołania Systemowe: Przykład
Interfejs Programowania Aplikacji
• Twórcy aplikacji projektują programy zgodnie z interfejsem programowania aplikacji (API)
• Interfejs API określa zestaw funkcji dostępnych dla programisty, w tym parametry i wartości zwracane
• Najczęstsze interfejsy API:
• Windows API dla systemów Windows
• POSIX API dla systemów POSIX (UNIX, Linux, i macOS)
• Java API dla programów działających na wirtualnej maszynie Java
• Programista uzyskuje dostęp do API za
pośrednictwem biblioteki kodu dostarczonej przez system operacyjny
API i Wywołania Systemowe
• Każdy system operacyjny ma swoją własną nazwę dla każdego wywołania systemowego
• Funkcje tworzące interfejs API zwykle wywołują rzeczywiste wywołania systemowe w imieniu programisty aplikacji
• Używanie API vs. wywoływanie rzeczywistych wywołań systemowych:
• Przenośność
• Wywołania systemowe mogą być często bardziej
szczegółowe i trudniejsze w obsłudze niż interfejs API
Środowisko Wykonawcze
• Środowisko wykonawcze (RTE) – pełny pakiet oprogramowania niezbędny do uruchamiania aplikacji napisanych w danym języku
programowania, w tym kompilatorów, bibliotek, programów ładujących itp.
• RTE zapewnia interfejs do wywołań systemowych, który służy jako łącze do wywołań systemowych
• Przechwytuje wywołania funkcji w interfejsie API
• Utrzymuje tabelę indeksowaną zgodnie z numerami wywołań systemowych
• Wywołuje wywołanie systemowe i zwraca jego status
Obsługa Aplikacji Użytkownika
Przykład: Biblioteka Standardowa C
Przekazywanie Parametrów do Systemu Operacyjnego
1) Rejestry
2) Blok w pamięci* 3) Stos*
* Nie ogranicza liczby ani długości parametrów
Rodzaje Wywołań Systemowych
• Zarządzanie procesami
• Zarządzanie plikami
• Zarządzanie urządzeniami
• Utrzymanie informacji
• Komunikacja
• Ochrona
Przykłady Wywołań Systemowych Windows i UNIX
Windows UNIX
Zarządzanie procesami CreateProcess() ExitProcess()
WaitForSingleObject()
fork() exit() wait() Zarządzanie plikami CreateFile()
ReadFile() WriteFile() CloseHandle()
open() read() write() close() Zarządzanie urządzeniami SetConsoleMode()
ReadConsole() WriteConsole()
ioctl() read() write() Utrzymanie informacji GetCurrentProcessID()
SetTimer() Sleep()
getpid() alarm() sleep() Komunikacja CreatePipe()
CreateFileMapping() MapViewOfFile()
pipe() shm open() mmap()
Ochrona SetFileSecurity()
InitlializeSecurityDescriptor() SetSecurityDescriptorGroup()
chmod() umask() chown()
Usługi Systemowe
Usługi Systemowe
• Usługi systemowe, znane również jako narzędzia systemowe, zapewniają wygodne środowisko do tworzenia i uruchomienia programów
• Niektóre z nich są po prostu interfejsami użytkownika do wywołań systemowych
Kategorie Usług Systemowych
• Zarządzanie plikami (manipulowanie plikami i katalogami)
• Informacje o stanie (data, godzina, dostępna pamięć)
• Modyfikację treści pliku (edytory tekstu)
• Obsługa języka programowania (kompilatory, asemblery, debuggery)
• Ładowanie i wykonanie programu (ładowarki, edytory linków, ładowarki overlay)
Kategorie Usług Systemowych (2)
• Komunikacja (tworzenie połączeń, wysyłanie wiadomości, przeglądanie stron internetowych, logowanie się zdalnie)
• Usługi w tle. Ciągle działające procesy systemowe nazywane są usługami, podsystemami lub
demonami.
Linkery i Ładowarki
Kompilowanie i Linkowanie Programu
• Pliki źródłowe są kompilowane do plików obiektowych, które są zaprojektowane do załadowania do dowolnej fizycznej lokalizacji pamięci – relokowalny plik obiektowy.
• Następnie linker łączy te relokowalne pliki
obiektów w jeden binarny plik wykonywalny.
Podczas fazy łączenia mogą być również zawarte inne pliki obiektowe lub biblioteki.
Ładowanie Programu
• Program ładujący służy do załadowania binarnego pliku wykonywalnego do pamięci, gdzie można go uruchomić w rdzeniu procesora.
• Aktywnością związaną z łączeniem i ładowaniem jest relokacja, która przypisuje końcowe adresy do części programu i dostosowuje kod i dane w
programie do tych adresów.
Rola linkera i ładowarki
Dynamicznie Połączone Biblioteki
• Biblioteki mogą być łączone w pliku wykonywalnym i ładowane do pamięci.
• Większość systemów pozwala dynamicznie łączyć biblioteki w trakcie ładowania programu.
• Dynamicznie połączone biblioteki (DLL).
• Wiele procesów może współdzielić dynamicznie połączone biblioteki – znaczne oszczędności w wykorzystaniu pamięci.
Formaty plików obiektowych i wykonywalnych
• Obejmują one skompilowany kod maszynowy i tabelę symboli zawierającą metadane dotyczące funkcji i zmiennych, do których odwołuje się
program.
• Pliki wykonywalne zawierają punkt wejścia
programu, tj. adres pierwszej instrukcji, która ma zostać wykonana po uruchomieniu programu.
• UNIX i Linux – ELF (Executable and Linkable
Format); Windows – Portable Executable (PE);
MacOS – Mach-O format.
Dlaczego Aplikacje Są
Specyficzne dla Systemu
Operacyjnego?
Aplikacje Specyficzne dla Systemu Operacyjnego
• Zasadniczo aplikacje skompilowane w jednym
systemie operacyjnym nie mogą być uruchomione w innych systemach operacyjnych
• Część problemu — każdy system operacyjny
zapewnia unikalny zestaw wywołań systemowych
Wykonywanie Aplikacji w Różnych Systemach Operacyjnych
1) Aplikacja może być napisana w języku
interpretowanym (takim jak Python lub Ruby), który ma interpreter dostępny dla wielu SO.
2) Aplikacja może być napisana w języku
zawierającym maszynę wirtualną w której aplikacja zostanie uruchomiona (np. Java).
3) Standardowy język lub API: kompilator generuje pliki binarne w języku specyficznym dla maszyny i SO. Program musi zostać przeniesiony do każdego SO, na którym będzie uruchamiany.
Aplikacje Wieloplatformowe:
Wyzwania
• Biblioteki dostarczane z systemem operacyjnym zawierają różne interfejsy API w celu zapewnienia funkcji takich jak interfejs GUI
• Każdy system operacyjny ma format binarny dla aplikacji, więc system operacyjny może otworzyć plik i załadować aplikację
• Procesory mają różne zestawy instrukcji
• Wywołania systemowe różnią się w zależności od systemów operacyjnych pod wieloma względami
Interfejs Binarny Aplikacji
• Interfejsy API określają pewne funkcje na poziomie aplikacji
• Na poziomie architektury stosuje się interfejs
binarny aplikacji (ABI), aby określić, w jaki sposób różne składniki kodu binarnego mogą łączyć się z danym SO w danej architekturze
• ABI określa szczegóły niskiego poziomu, w tym szerokość adresu, metody przekazywania
parametrów do wywołań systemowych, binarny format bibliotek, rozmiar typów danych itp.
Interfejs Binarny Aplikacji (2)
• Zazwyczaj ABI jest określony dla danej architektury
• ABI jest odpowiednikiem API na poziomie architektury
• Jeśli binarny plik wykonywalny został skompilowany i połączony zgodnie z konkretnym ABI (np. ARMv8), powinien być w stanie działać na różnych
systemach obsługujących ten ABI
• Jednak określony ABI jest zdefiniowany dla
określonego systemu operacyjnego działającego w danej architekturze
Struktura Systemu
Operacyjnego
Struktura Monolityczna
• Jądro jest monolityczne, ponieważ działa w trybie jądra w jednej przestrzeni adresowej
• Trudna do wdrożenia i rozszerzenia
• Wyraźna przewaga wydajności
Struktura Monolityczna: UNIX i
Linux
Podejście Warstwowe
• Podejście monolityczne – ściśle połączony system, zmiany w jednej części systemu mogą mieć szeroki wpływ na inne części
• Luźno połączony, np. podejście warstwowe:
system operacyjny dzieli się na kilka warstw
• Typowa warstwa systemu operacyjnego składa się ze struktur danych i zestawu funkcji, które mogą być wywoływane przez warstwy wyższego poziomu
• Podejście warstwowe jest stosowane w sieciach komputerowych i aplikacjach internetowych
Podejście Warstwowe: Zalety i Wady
• Główną zaletą – prostota konstrukcji i debugowania
• Wyzwania związane z odpowiednim
zdefiniowaniem funkcjonalności każdej warstwy
• Ogólna wydajność jest słaba
• Niektóre nawarstwianie jest
powszechne we współczesnych systemach operacyjnych
Mikrojądro
• Ta metoda strukturuje SO, usuwając wszystkie
nieistotne składniki z jądra i implementując je jako programy na poziomie użytkownika, które znajdują się w oddzielnych przestrzeniach adresowych
Mikrojądro: Zalety i Wady
• Rozszerzanie systemu operacyjnego jest łatwiejsze
• System operacyjny można łatwiej przenosić z jednej architektury sprzętowej na drugą
• Mikrojądro zapewnia również większe
bezpieczeństwo i niezawodność, ponieważ
większość usług działa jako procesy użytkownika
• Wydajność mikrojądra może ucierpieć ze względu na zwiększone koszty operacyjne
Moduły
• Być może najlepsza aktualna metodologia
projektowania systemu operacyjnego polega na wykorzystaniu ładowalnych modułów jądra (LKM)
• Jądro ma zestaw podstawowych komponentów i może łączyć się z dodatkowymi usługami za
pośrednictwem modułów, zarówno w czasie startu lub w czasie wykonywania
• Nowoczesne implementacje systemu UNIX, takie jak Linux, macOS i Solaris, a także Windows
Systemy Hybrydowe
• W praktyce bardzo niewiele systemów
operacyjnych przyjmuje jedną, ściśle określoną strukturę
• Łączą różne struktury, w wyniku czego powstają systemy hybrydowe, które dotyczą kwestii
wydajności, bezpieczeństwa i użyteczności
Systemy Hybrydowe: macOS i iOS
Architektura systemów operacyjnych Apple macOS i iOS
Struktura Darwina
Systemy Hybrydowe: Android
• Środowisko wykonawcze Android (ART) – kompilacja z
wyprzedzeniem (AOT)
• Natywny interfejs Java (JNI) – programy nie są przenośne
• Standardowa biblioteka C dla Androida Bionic
Uruchamianie Systemu
Operacyjnego
Rozruch Systemu
• Proces uruchamiania komputera przez ładowanie jądra jest nazywany uruchamianiem systemu
• Proces rozruchu:
1. Mały kawałek kodu, znany jako program ładujący (boot loader), lokalizuje jądro
2. Jądro jest ładowane do pamięci i uruchamiane 3. Jądro inicjalizuje sprzęt
4. Główny system plików jest montowany
BIOS i UEFI
• Wielostopniowy proces uruchamiania:
• Mały program ładujący umieszczony w nieulotnej pamięci (BIOS) działa przy włączeniu zasilania
• Początkowy program ładujący ładuje drugi program
ładujący, który znajduje się w stałej lokalizacji na dysku - bloku startowym (boot block)
• UEFI (Unified Extensible Firmware Interface):
• Lepsze wsparcie dla 64-bitowych systemów i większych dysków
• UEFI jest pojedynczym, kompletnym menedżerem rozruchu i dlatego jest szybszy niż BIOS
Struktura Systemu Operacyjnego.
Streszczenie
Streszczenie (1)
• System operacyjny zapewnia środowisko do wykonania programów, udostępniając usługi użytkownikom i programom.
• Wywołania systemowe stanowią interfejs do usług udostępnianych przez system operacyjny.
Programiści używają interfejsu programowania aplikacji (API) dla dostępu do usług wywołania systemowego.
Streszczenie (2)
• Wywołania systemowe można podzielić na sześć głównych kategorii: (1) zarządzanie procesami, (2) zarządzanie plikami, (3) zarządzanie urządzeniami, (4) obsługa informacji, (5) komunikacja i (6)
ochrona.
• Standardowa biblioteka C udostępnia interfejs wywołania systemowego dla systemów UNIX i Linux.
• Systemy operacyjne obejmują również zbiór programów systemowych, które udostępniają narzędzia użytkownikom.
Streszczenie (3)
• Linker łączy kilka relokowanych modułów
obiektowych w jeden binarny plik wykonywalny.
Program ładujący ładuje plik wykonywalny do pamięci, gdzie może zostać uruchomiony na dostępnym procesorze.
• Aplikacje są specyficzne dla systemu operacyjnego.
Obejmują one różne formaty binarne dla plików wykonywalnych, różne zestawy instrukcji dla
różnych procesorów i wywołania systemowe, które różnią się w zależności od systemu operacyjnego.
Streszczenie (4)
• Monolityczny SO nie ma żadnej struktury; cała funkcjonalność jest zapewniona w pojedynczym, statycznym pliku binarnym, który działa w
pojedynczej przestrzeni adresowej. Chociaż takie
systemy są trudne do modyfikacji, ich główną zaletą jest wydajność.
• Warstwowy SO jest podzielony na kilka oddzielnych warstw, w których dolna warstwa jest interfejsem sprzętowym, a najwyższą warstwą jest interfejsem użytkownika. Takie podejście zazwyczaj nie jest
idealne do projektowania systemu operacyjnego ze względu na problemy z wydajnością.
Streszczenie (5)
• Podejście mikrojądra wykorzystuje minimalne jądro; większość usług działa jako aplikacje na
poziomie użytkownika. Komunikacja odbywa się za pośrednictwem przekazywania wiadomości.
• Modularne podejście zapewnia usługi SO za pomocą modułów, które mogą być ładowane i
usuwane podczas pracy. Wiele współczesnych SO zbudowanych jest w postaci systemów
hybrydowych wykorzystujących kombinację monolitycznego jądra i modułów.
• Program ładujący ładuje SO do pamięci, wykonuje inicjowanie i rozpoczyna wykonywanie systemu.