Architektura Komputerów/Wykład 13: Wyjątki

Plan wykładu





Wyjątek (sytuacja wyjątkowa) - definicja



Zdarzenie w systemie komputerowym wymagające przerwania wykonania bieżącego strumienia instrukcji i przekazania sterowania do systemu operacyjnego


Podział sytuacji wyjątkowych



  • Przerwania
  • Pułapki
  • Błędy


Przerwa



  • 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 rzą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
      • timer systemowy służący do periodycznego przełączania procesów w systemie wieloprocesowym
      • "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 niezbyt fortunnie nazywana "przerwaniem programowym")
      • MIPS - instrukcja SYSCALL
    • sygnalizacja błędów wykonania wykrytych przez program użytkowy do systemu operacyjnego
      • MIPS - instrukcje ADD, SUB - w przypadku wystawienia nadmiaru generują pułapkę
      • x86 - instrukcje dzielenia DIV, IDIV, AAM generują pułapkę przy nadmiarze
    • pułapka śledzenia (tracę 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 timera
    • na poziomie procesora - zespół czynności, których efektem jest zaniechanie wykonywania bieżącego strumienia instrukcji i rozpoczęcie wykonanie programowej procedury systemu operacyjnego
      • obsługa wyjątku przez system operacyjny rozpoczyna się z chwilą zakończenia obsługi wyjątku przez procesor


Obsługa wyjątku przez procesor - fazy



  • 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ć przerowadzona 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 jest 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
      • CISC - na stosie
      • RISC - zwykle w rejestrach
  • Po co?
    • powrót po obsłudze
    • komunikat diagnostyczny w przypadku usunięcia błędnego procesu


Składanie kontekstu - licznik instrukcji



  • 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ład 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 wyją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ą wykonywa nie 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ń niemaskowalnych 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 wykonania systemowej procedury obsługi wyjątku
    • nowe wartości są ładowane do licznika instrukcji, rejestru stanu. ew. 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 wskazyany 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




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*numer_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 wyją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 instrukcji
  • Odwołania te mogą spowodować błąd związany z zarządzaniem pamięcią


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