Architektura Systemów Komputerowych Wykład 12: Zarządzanie zasobami komputera. Sytuacje wyjątkowe. Dr inż. Marek Mika Państwowa Wyższa Szkoła Zawodowa im. Jana Amosa Komeńskiego W Lesznie
Plan Zarządzanie zasobami komputera: Potrzeby ochrony w systemie wieloprocesorowym Ogólne zasady ochrony zasobów Użytkownik i system Poziomy zaufania Ochrona procesora Ochrona urządzeń wejścia-wyjścia Maszyny wirtualne Sytuacje wyjątkowe: Definicja i podział sytuacji wyjątkowych Zasady obsługi sytuacji wyjątkowych Priorytety sytuacji wyjątkowych Szczególne sytuacje wyjątkowe
Potrzeby ochrony Współczesne komputery pracują, z wieloprocesowymi i wieloużytkowymi systemami operacyjnymi Procesy nie mogą sobie nawzajem przeszkadzać ani się szpiegować żadne błędne lub świadomie destrukcyjne zachowanie procesu nie może powodować zakłóceń w pracy innych procesów i całego systemu proces nie może mieć dostępu do danych innego procesu bez jego wiedzy Konieczne jest wprowadzenie mechanizmów ochrony, które zabezpieczą przed błędnymi lub świadomymi akcjami programów w celu zagwarantowania poprawnej pracy pozostałych procesów
Zasoby podlegające ochronie Procesor proces nie może zmonopolizować czasu procesora inne procesy muszą mieć możliwość wykonywania się (inne aspekty ochrony procesora - w dalszej części wykładu) Pamięć proces może mieć dostęp tylko do przydzielonej mu pamięci ew. do danych współdzielonych - za zgodą innego procesu proces nie powinien odwoływać się do własnej pamięci w nieprawidłowy sposób (np. zapis stałych. odczyt lub zapis kodu, wykonanie danych) Wejście - wyjście dostęp do urządzeń zewnętrznych musi być realizowany w taki sposób, aby procesy nie przeszkadzały sobie nawzajem w praktyce uzyskuje się to przez całkowite uniemożliwienie bezpośrednich odwołań do urządzeń
Użytkownik i system Realizacja mechanizmów ochrony wymaga wyodrębnienia co najmniej dwóch poziomów uprawnień tzw. Poziomów zaufania Procesy użytkowe pracują na poziomie użytkownika, na którym podlegają one zasadom określonym przez system operacyjny System operacyjny pracuje na poziomie systemowym, na którym istnieje możliwość określania zasad ochrony obowiązujących procesy użytkowe Zakłada się, że oprogramowanie działające na poziomie systemowym jest zaufane czyli wolne od błędów Oprogramowanie działające na poziomie użytkownika może zawierać dowolne błędy i nie mogą one wpływać destrukcyjnie na działanie systemu
Poziomy zaufania W prostych realizacjach systemów ochrony występują dwa lub trzy poziomy zaufania poziom jądra systemu pełny dostęp do wszystkich zasobów poziom usług systemu (opcjonalny) dostęp ograniczony, ale o znacznych uprawnieniach poziom użytkownika dostęp do zasobów przydzielonych przez system. na zasadach określonych przez system Dostęp do zasobów zależy od poziomu zaufania w każdej chwili procesor pracuje z określonym poziomem zaufania Informacja o bieżącym poziomie zaufania jest przechowywana w procesorze najczęściej w systemowym rejestrze stanu procesora informacja ta ma postać jednego lub dwóch bitów, w zależności od liczby poziomów zaufania dostępnych w danej architekturze
Poziomy zaufania x86 Cztery poziomy zaufania 0 jądro 1, 2 dodatkowe poziomy systemowe 3 użytkownik Współczesne oprogramowanie korzysta z dwóch poziomów: 0 i 3 Informacja o bieżącym poziomie zaufania jest przechowywana w niewidocznym programowo rejestrze deskryptora segmentu kodu informacja ta ma postać pola 2-bitowego oznaczonego jako CPL(Current Privílege Level)j
Ochrona procesora W celu umożliwienia sterowania mechanizmami ochrony procesor jest wyposażony w rejestry zawierające informacje sterujące np. bieżący poziom zaufania Dostęp do tych rejestrów jest możliwy tylko na poziomie systemowym w przeciwnym razie użytkownik mógłby np. zmienić poziom zaufania na systemowy Rejestry systemowe procesora muszą podlegać ochronie
Egzekwowanie zasad ochrony Każda próba naruszenia zasad ochrony musi być wykryta i udaremniona oraz zgłoszona systemowi operacyjnemu jako wyjątek więcej o wyjątkach w dalszej części wykładu Próba nie dochodzi do skutku i sterowanie przejmuje system operacyjny System ma możliwość zakończenia wykonania procesu naruszającego zasady ochrony i usunięcia go
Ochrona czasu procesora System wieloprocesowy musi przełączać procesy w czasie Proces nie może zmonopolizować procesora nawet jeśli wpadnie w pętlę nieskończoną Praca z przydziałem czasu jest realizowana poprzez periodyczne przejmowanie kontroli przez system operacyjny dzieje się to przez zgłoszenie wyjątku przez zegar systemowy częstotliwość w zależności od potrzeb - od kilkudziesięciu Hz do kilku khz Po przejęciu sterowania system ma możliwość usunięcia procesu dzieje się to zwykle na życzenie użytkownika, który zauważył zawieszenie procesu
Ochrona urządzeń we/wy Zwykle realizowana przez całkowite odizolowanie procesów użytkowych od fizycznych urządzeń próba dostępu jest blokowana i sygnalizowana jako wyjątek Fizyczną obsługą urządzeń zajmuje się system operacyjny system operacyjny udostępnia aplikacjom obiekty wirtualne, które są powiązane z urządzeniami w sposób określony przez sam system przykład strumienie STDIN i STDOUT w języku C W niektórych sytuacjach system może zezwolić na wyłączny dostęp pojedynczego procesu do urządzenia przykład: współpraca ze sterownikiem graficznym dla aplikacji intensywnych graficznie podsystem DirectX w Windows
Ochrona pamięci Ochrona pamięci jest najbardziej skomplikowanym aspektem ochrony zasobów proces musi mieć dostęp do pamięci mu przydzielonej, a jednocześnie nie może odwoływać się poza przedzielony obszar Temat omówiony na poprzednim wykładzie
Maszyny wirtualne W niektórych zastosowaniach może istnieć potrzeba równoczesnej pracy kilku systemów operacyjnych na jednym komputerze Jest to podobne do pracy aplikacji z podziałem czasu, ale system operacyjny musi mieć możliwość sterowania ochroną zasobów Współdzielenie komputera przez kilka systemów wymaga: oprogramowania nadrzędnego w stosunku do systemów - tzw. Hypervisora obniżenia poziomu zaufania systemu w sposób, który nie byłby zauważalny przez pracujący w ten sposób system
Maszyny wirtualne implementacja Dawniej: system na poziomie zaufania użytkownika, hypervisor na poziomie zaufania systemu hypervisor emuluje programowo wszelkie operacje o charakterze systemowym Obecnie: próba dostępu do zasobów systemowych powoduje wyjątek, obsługiwany przez hypervisora wymaganie: każda próba odczytu (a nie tylko modyfikacji) informacji systemowych musi być sygnalizowana jako błąd do hypervisora dodatkowy poziom zaufania hypervisora albo hypervisor na poziomie dawnym systemowym (tzw. gospodarz host) i tryb gościa (guest) dla systemów operacyjnych np. AMD64 operacje na niektórych zasobach dostępne tylko w trybie gospodarza
SYTUACJE WYJĄTKOWE
Wyjątek - definicja Zdarzenie w systemie komputerowym wymagające przerwania wykonania bieżącego strumienia instrukcji i przekazania sterowania do systemu operacyjnego
Podział wyjątków Przerwania Pułapki Błędy
Przerwania Powstają poza procesorem za wyjątkiem asynchronicznego przerwania programowego Asynchroniczne względem wykonywanego strumienia instrukcji ich wystąpienie nie jest bezpośrednim wynikiem wykonania konkretnej instrukcji Służą do sygnalizacji zdarzeń istotnych dla systemu operacyjnego zmiana kontekstu urządzeń zewnętrznych, np.: wciśnięcie klawisza na klawiaturze, przesunięcie myszy nadejście pakietu z sieci lokalnej zakończenie transmisji danych do/z pamięci masowej upłynięcie określonego odcinka czasu zegar systemowv służący do periodycznego przełączania procesów w systemie wieloprocesorowym budzenie procesu o określonym czasie
Pułapki Generowane przez procesor Powodowane przez konkretną instrukcję, na końcu wykonania instrukcji ściśle synchroniczne względem instrukcji Rodzaje: wywołanie usługi systemu operacyjnego przez program użytkowy (często nazywana przerwaniem programowym ) MIPS instrukcja SYSCALL sygnalizacja do systemu operacyjnego błędów wykonania wykrytych przez program użytkowy MIPS instrukcje ADD, SUB w przypadku wystąpienia nadmiaru generują pułapkę x86 instrukcje dzielenia DIV, IDIV, AAM generują pułapkę przy nadmiarze pułapka śledzenia (trace trap) wygenerowana po wykonaniu dowolnej instrukcji przy ustawionym trybie śledzenia
Błędy Generowane na ogół przez procesor zarówno przez jednostkę wykonawczą jak i przez jednostkę zarządzania pamięcią wyjątek błąd transmisji generowany poza procesorem Wynikają z wykonywanych instrukcji, ale nie zawsze w sposób jednoznaczny Służą do sygnalizacji błędnych i niedozwolonych zachowań oprogramowania i sprzętu próba wykonania niezdefiniowanej instrukcji błąd wyrównania przy dostępie do pamięci naruszenie zasad ochrony Procesora Pamięci Wykorzystywane do implementacji systemu pamięci wirtualnej
Obsługa wyjątków Każdy wyjątek musi być obsłużony Istnieją dwa pojęcia obsługi: na poziomie oprogramowania - reakcja programowa systemu operacyjnego na zdarzenie np. przesłanie kolejnej porcji danych do urządzenia zgłaszającego gotowość przełączenie procesów przy przerwaniu zegarowym na poziomie procesora zespół czynności, których efektem jest zaniechanie wykonywania bieżącego strumienia instrukcji i rozpoczęcie wykonania programowej procedury systemu operacyjnego obsługa wyjątku przez system operacyjny rozpoczyna się z chwilą zakończenia obsługi wyjątku przez procesor
Fazy obsługi wyjątków przez procesor Rozpoznanie i identyfikacja źródła wyjątku Przerwanie wykonania strumienia instrukcji i zapamiętanie bieżącego kontekstu procesora Załadowanie nowego kontekstu procesora i rozpoczęcie wykonywania nowego strumienia instrukcji procedury systemowej zapewniającej programową reakcję systemu na wyjątek
Identyfikacja wyjątku Jeśli wyjątek powstał w procesorze (pułapka, błąd) procesor zna dokładną jego przyczynę identyfikacja jest zbędna Przerwania: w zależności od budowy systemu przerwań identyfikacja może być przeprowadzona później przez oprogramowanie albo w chwili wykrycia wyjątku przez sprzęt procesora identyfikacja przez procesor wymaga przeprowadzenia zapytania, w postaci specjalnego cyklu transmisji cyklu identyfikacji przerwania w odpowiedzi na cykl identyfikacji procesor otrzymuje z zewnątrz identyfikator przerwania w postaci liczby o długości od 4 do 9 bitów X86 8 bitów M88k 9 bitów mikrokontrolery 8- i 16-bitowe 4 8 bitów identyfikator jest generowany przez układ arbitrażu przerwań
Zapamiętanie kontekstu Co zapamiętywać? informacje o stanie procesora, które zostaną samoczynnie zmodyfikowane przez procesor w czasie obsługi wyjątku zawsze PC i rejestr stanu z informacjami systemowymi rejestry uniwersalne zbędne, bo może to zrobić oprogramowanie informacje niezbędne do rozpoznania dokładnej przyczyny wyjątku, a które mogą zostać zamazane w trakcie wykonania programu informacje o odwołaniu do pamięci przy błędzie dostępu Gdzie zapamiętywać? w miejscu naturalnym dla danej architektury Po co? CISC na stosie RISC zwykle w rejestrach powrót po obsłudze komunikat diagnostyczny w przypadku usunięcia błędnego procesu
Składowanie kontekstu licznik rozkazów Zapamiętywany w celu powrotu do przerwanego programu lub wyświetlenia komunikatu o błędzie Podczas wyjątku wartość nextpc nie zawsze jest dostępna błędy przerywają wykonanie instrukcji instrukcja niedokończona Zapamiętywana wartość: nextpc wskazuje na następną instrukcję po tej, w czasie której wykryto wyjątek przerwania pułapki wywołania systemu i śledzenia currentpc wskazuje na bieżącą instrukcję pułapki sygnalizujące błąd wykonania (potrzebna identyfikacja miejsca błędu) błędy wykonanie instrukcji było niemożliwe jeśli nastąpi powrót, to ponownie do tej samej instrukcji Niektóre procesory RISC zapamiętują nextpc+4 lub nextpc+8
Zmiany kontekstu systemowego w czasie obsługi wyjątku Obsługa wyjątku powoduje zawsze przejście w tryb systemowy podczas wystąpienia wątku procesor mógł być w trybie systemowym lub użytkownika należy zapamiętać poziom zaufania z chwili wystąpienia wyjątku Przy obsłudze wyjątku jest wyłączany tryb śledzenia bit śledzenia znajduje się w rejestrze stanu procesora Przy obsłudze przerwania procesor zmienia poziom wrażliwości na przerwanie należy zapamiętać poziom wrażliwości (tzw. maskę przerwań) z chwili wystąpienia przerwania Wszystkie powyższe informacje znajdują się zwykle w systemowym rejestrze stanu procesora podczas obsługi wyjątków należy zapamiętać systemowy rejestr stanu
Składowanie PC i rejestru stanu W procesorach RISC: zawartość PC i SR kopiowana do rejestrów cieni alternatywa przełączenie banku rejestrów (w procesorach z oddzielnymi rejestrami do obsługi wyjątków) W procesorach CISC: PC i SR zapamiętywane na stosie program użytkowy nie daje gwarancji integralności stosu wartość SP może być nieważna kontekst jest składowany na stosie systemowym każdemu poziomowi zaufania odpowiada oddzielny stos kolejność czynności: utworzenie tymczasowej kopii rejestru stanu przełączenie w tryb systemowy (modyfikacja rejestru stanu) zapamiętanie tymczasowej kopii rejestru stanu na stosie systemowym
Przełączanie stosów w procesorach CISC Każdemu poziomowi zaufania odpowiada oddzielny stos Przy zmianie poziomu zaufania następuje przełączenie stosów można to zrealizować na dwa sposoby oddzielny rejestr wskaźnika stosu dla każdego poziomu zaufania (np. M68k) przeładowanie wskaźnika stosu przez procesor przy użyciu wartości zapisanych w pamięci (np. x86) Na danym poziomie zaufania oprogramowanie może mieć dostęp do własnego wskaźnika stosu i wskaźników stosów poziomów mniej zaufanych oprogramowanie systemowe może inicjować wskaźnik stosu użytkownika instrukcje dostępu do alternatywnych wskaźników stosu są dozwolone tylko w trybie systemowym
Informacje potrzebne do obsługi błędu Błąd różni się od innych wyjątków tym, że uniemożliwia wykonanie bieżącej instrukcji nextpc jest niedostępny lub nieważny zapamiętuje się currpc Błąd sygnalizowany przez MMU może wynikać z pobrania instrukcji lub z dostępu do danych do identyfikacji przyczyny błędu potrzebna jest informacja o adresie i rodzaju odwołania, które spowodowało błąd sam adres instrukcji nie umożliwia jednoznacznej identyfikacji przyczyny błędu Niektóre architektury umożliwiają wykonywanie odwołań w trybie systemowym z poziomem zaufania użytkownika ułatwia to ochronę systemu poziom zaufania odwołania musi być w takim przypadku zapamiętany niezależnie od poziomu zaufania procesora
Informacje zapamiętywane przy błędzie strony x86 Na stosie systemowym: rejestr stanu procesora adres instrukcji, która spowodowała błąd kod błędu słowo 32-bitowe bit 0: 0 deskryptor nieważny, 1 błąd ochrony bit 1: 0 błąd podczas odczytu, 1 błąd podczas zapisu bit 2: 0 błąd w trybie systemowym, 1 błąd w trybie użytkownika bit 3: 1 jeśli w deskryptorze strony napotkano ustawiony bit zarezerwowany bit 4: 1 jeśli błąd powstał podczas pobierania instrukcji W rejestrze systemowym CR2 adres odwołania, które spowodowało błąd
System przerwań Procesor może pracować na wielu poziomach priorytetowych różniących się wrażliwością na przerwania jednopoziomowy system przerwań (np. x86) dwa poziomy: przerwania zablokowane przerwania odblokowane wielopoziomowy system przerwań 3 16 poziomów wrażliwości przerwania przypisane do poziomów priorytetowych przerwania od szybkich urządzeń wyższe poziomy przerwania od wolnych urządzeń niższe poziomy Informacja o aktualnym poziomie wrażliwości jest przechowywana w rejestrze stanu procesora jest to tzw. maska przerwań poziom może być zmieniany tylko przez oprogramowanie systemowe wykonanie niektórych procedur jądra wymaga zablokowania przerwań (sekcje krytyczne)
Zmiany poziomu wrażliwości Podczas obsługi przerwania procesor modyfikuje poziom wrażliwości tak, aby nie były przyjmowane następne przerwania o poziomie tym samym lub niższym, co aktualnie obsługiwane w przypadku jednopoziomowego systemu przerwań oznacza to zablokowanie przerwań Ponieważ poziom jest samoczynnie zmieniany, dotychczasowy poziom musi być zapamiętany podczas obsługi przerwania Istnieją przerwania obsługiwane niezależnie od ustawionego w procesorze poziomu maski przerwań są to tzw. Przerwania niemaskowalne przerwań niemaskowalncvh używa się do sygnalizacji sytuacji krytycznych, np. awarii zasilania
Załadowanie nowego kontekstu Po zapamiętaniu informacji potrzebnych do obsługi wyjątku i ew. powrotu z tej obsługi, procesor rozpoczyna wykonanie systemowej procedury obsługi wyjątku nowe wartości są ładowane do licznika rozkazów, rejestru stanu i ew. w niektórych architekturach również do innych rejestrów Typowe rozwiązania: wspólny punkt wejścia dla wszystkich wyjątków, procedura obsługi identyfikuje rodzaj wyjątku na drodze programowej i wywołuje odpowiedni podprogram (np. MIPS) kilka lub kilkanaście ustalonych adresów początkowych procedur obsługi wyjątków (niektóre mikrokontrolery) tablica adresów lub struktur danych opisujących procedury obsługi - tzw. wektorowy system przerwań stosowany w większości procesorów uniwersalnych i w bardziej rozbudowanych mikrokontrolerach
Wektorowy system obsługi wyjątków Informacja uzyskana w fazie identyfikacji źródła wyjątku ma postać liczby W pamięci jest przechowywana tablica, której każdy element zawiera informacje potrzebne do wywołania procedury obsługi wyjątku tablica ta zajmuje ustalone miejsce w przestrzeni adresowej (zwykle na początku lub na końcu) albo jest wskazywany przez specjalny rejestr systemowy W zależności od architektury, element tablicy może zawierać: adres początkowy procedury (np. M68k) jedną lub więcej instrukcji procedury (zwykle jest to instrukcja skoku do właściwej procedury) ARM, 51, Alpha AXP deskryptor zawierający adres początkowy procedury i inne informacje x86
Wyjątki w x86 Numer Symbol Opis 0 #DE Nadmiar dzielenia stałopozycyjnego 1 #DB Zarezerwowane 2 Przerwanie niemaskowalne (NMI) 3 #BP Pułapka śledzenia, jednostka wspomagania uruchamiania 4 #OF Pułapka przy nadmiarze 5 #BR Przekroczenie zakresu danej instrukcja BOUND 6 #UD Niezdefiniowany kod operacyjny 7 #NM Brak jednostki zmiennopozycyjnej 8 #DF Błąd podwójny 10 #TS Wyjątek związany z przełączaniem zadań (TSS) 11 #NP Nieważny deskryptor segmentu 12 #SS Błąd dostępu do segmentu stosu 13 #GP Ogólny błąd ochrony (jednostka segmentacji) 14 #PF Błąd stronicowania 15 Zarezerwowane 16 #MF Błąd obliczeń jednostki zmiennopozycyjnej x87 17 #AC Błąd wyrównywania danych 18 #MC Błąd sprzętowy procesora 19 #XF Wyjątek (błąd obliczeń) jednostki SSE
Wyjątki w ARM7 Procesor rozpoznaje 8 wyjątków 0 inicjowanie systemu 1 niezidentyfikowana instrukcja 2 pułapka wywołania systemu (SWI software interrupt) 3 błąd pobrania instrukcji 4 błąd dostępu do danych 5 ( pusty) 6 przerwanie (IRQ) 7 przerwanie szybkie (FIQ) Podczas obsługi następuje skok do adresu 4 * nurner_wyjątku pod adresem tym znajduje się instrukcja skoku do właściwej procedury obsługi dla ostatniego wyjątku przerwania szybkiego procedura może zaczynać się od adresu 0x1C, bo jest to ostatni element tablicy
ARM7 obsługa wyjątków
Powrót z obsługi wyjątku Nie z każdej obsługi wyjątku powrót jest możliwy błąd ochrony może wymagać zamknięcia programu Powrót polega na odtworzeniu informacji zapamiętanych podczas obsługi (co najmniej PC i rejestr stanu) służy do tego specjalna instrukcja powrotu z obsługi wyjątku instrukcja ta jest dozwolona wyłącznie w trybie systemowym, w przeciwnym razie użytkownik mógłby załadować nową wartość rejestru stanu i zmienić poziom zaufania na systemowy W praktyce systemów operacyjnych obsługa wyjątku często kończy się przełączeniem procesu powrót z wyjątku następuje do innego strumienia instrukcji, niż strumień przerwany przez wątek wykorzystywany mechanizm jest identyczny jak przy powrocie do przerwanego strumienia instrukcji
Asynchroniczne przerwanie programowe Mechanizm implementowany w niektórych procesorach pożyteczny w systemach czasu rzeczywistego Umożliwia zgłoszenie asynchronicznego, maskowalnego przerwania przez sam procesor Przerwanie zostaje obsłużone, gdy poziom wrażliwości procesora na przerwania osiągnie odpowiednią wartość Zwykle używa się tego mechanizmu do zgłoszenia przerwania o niższym priorytecie z procedury obsługi przerwania o wyższym priorytecie cel: kontynuacja akcji wynikających z przerwania przy zachowaniu możliwości reakcji na przerwania o niższych priorytetach można w ten sposób uniknąć inwersji priorytetów, czyli sytuacji, gdy procesor wykonuje czynność o niskim priorytecie jednocześnie nie obsługując przerwania o wyższym priorytecie
Błąd podwójny Podczas obsługi sytuacji wyjątkowych procesory CISC wykonują serię odwołań do pamięci (składowanie kontekstu, ładowanie nowego kontekstu) nie wynikających z wykonania instrukcji Podczas tych odwołań procesor nie ma ważnej wartości licznika rozkazów Odwołania te mogą spowodować błąd związany z zarządzaniem pamięciąj
Inicjowanie działania procesora - Reset W wielu procesorach inicjowanie działania jest traktowane jako wyjątek o najwyższym priorytecie Powoduje natychmiastowe przekazanie sterowania pod ustalony adres Nie wymaga składowania kontekstu
Priorytety sytuacji wyjątkowych Priorytet określa pilność obsługi danego wyjątku Dwa aspekty priorytetów odpowiadają dwóm pojęciom obsługi na poziomie procesora na poziomie systemu operacyjnego Priorytety na poziomie systemu wynikają z pilności zdarzenia przerwania krytyczne czasowo pułapki (wywołanie systemu) decyduje o wydajności aplikacji Błędy usunięcie programu, pamięć wirtualna Priorytety na poziomie procesora wynikają z logicznej sekwencji czynności w procesorze błędy w razie błędu nie można zakończyć wykonania instrukcji pułapki obsługa stanowi ostatnią fazę wykonania instrukcji przerwania obsługiwane po zakończeniu wykonania instrukcji
DZIĘKUJĘ ZA UWAGĘ!