% Impala Operating System
%
% Copyright (C) 2009 University of Wroclaw. Department of Computer Science
%    http://www.ii.uni.wroc.pl/
% Copyright (C) 2009 Mateusz Kocielski, Artur Koninski, Pawel Wieczorek
%    http://bitbucket.org/wieczyk/impala/
% All rights reserved.
%
% Redistribution and use in source and binary forms, with or without
% modification, are permitted provided that the following conditions
% are met:
% 1. Redistributions of source code must retain the above copyright
%  notice, this list of conditions and the following disclaimer.
% 2. Redistributions in binary form must reproduce the above copyright
%  notice, this list of conditions and the following disclaimer in the
%  documentation and/or other materials provided with the distribution.
%
% THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
% ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
% ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
% FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
% OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
% HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
% OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
% SUCH DAMAGE.
%
% $Id$

\section{Przerwania.} \label{INT}

Przerwaniem (\emph{interrupt}) jest wywłaszczenie pracy procesora
przez zdarzenie, które powoduje wykonanie kodu jego obsługi.
Przerwania mogą być generowane przez:
\begin{itemize}
 \item sprzęt komputerowy - nazywamy je wtedy przerwaniami sprzętowymi
 \item kod programu - nazywamy je wtedy przerwaniami programowymi
 \item procesor - nazywamy je wtedy pułapkami lub wyjątkami procesora
\end{itemize}

Obsługę przerwań opisuje tablica deskryptorów dostarczona procesorowi
na~początku inicjalizacji systemu. W niej są zapisane takie informacje
jak adres podprogramu obsługi oraz poziom uprzywilejowania pracy procesora.
Po zakończeniu obsługi przerwania procesor wraca do~wykonywania wywłaszczonego
zadania.

Przerwanie może nadejść w~każdym momencie pracy, pomiędzy dowolnymi
instrukcjami procesora. W systemie z~podziałem czasu stwarza
to~ryzyko uszkodzenia struktur danych, które są jednocześnie modyfikowane
przez wywłaszczony program oraz obsługę danego przerwania. Np. sterownik
stacji dyskietek obsługując przerwanie może pobrać zlecenie wejścia-wyjścia
z~kolejki, która właśnie była modyfikowana przez wywłaszczony program, chcący
zakolejkować kolejne zlecenie.

Problem jest rozwiązywany przez wprowadzenia poziomów uprzywilejowania dla
przerwań. Przerwania z~niższym priorytetem niż obecny są odwlekane.
Do zwiększania priorytetu służą procedury \texttt{splXXX}, gdzie \texttt{XXX}
jest nazwą poziomu. Zwracają one obecny poziom uprzywilejowania.
Procedury nigdy nie zmniejszają poziomu uprzywilejowania, co zapobiega
sytuacjom gdzie priorytet zostanie po cichu zmniejszony przez jedną
z~wykorzystanych procedur w~kodzie mającym działać z większym.
Priorytet jest przywracany za~pomocą procedury \texttt{splx}.

Przerwania sprzętowe są obsługiwane przez chipset Intel 8259A\footnote{
Tak naprawdę ten chipset nie jest już produkowany, jest obecnie emulowany
przez mostek na płycie głównej. W nowoczesnych procesorach jest zastąpiony
nowym kontrolerem wbudowanym w~procesor.}, za pomocą niego jest również
wykonane manipulowanie poziomami uprzywilejowania i~odwlekania
obsługi przerwań.

Obecnie wyszczególnionymi poziomami uprzywilejowania są:
\begin{itemize}
 \item \texttt{TTY} - poziom odwleka wszystkie przerwania związane z~obsługą
    terminali, klawiatur.

 \item \texttt{BIO} - poziom odwleka wszystkie przerwania związane z~obsługą
    urządzeń blokowych.

 \item \texttt{SOFTCLOCK} - poziom odwleka wszystkie przerwania związane
    z obsługą czasomierzy, w~tym zegar systemowy.

 \item \texttt{HIGH} - poziom odwleka wszystkie przerwania w systemie.
\end{itemize}

Manipulując poziomem uprzywilejowania należy zwrócić szczególną uwagę na~to,
że może to~opóźniać obsługę urządzeń przez sterowniki, co może wpłynąć
na~wydajność systemu.

Poziom uprzywilejowania można interpretować również jako element tworzenia
sekcji krytycznych blokujących sterowniki lub zegar systemowy uruchamiający
program planisty.

Nieuważne mieszanie zmian poziomu uprzywilejowania
z~mechanizmami synchronizacji na~wątkach może spowodować zakleszczenie całego
systemu, ponieważ mechanizmy synchronizacji wątków będą czekać aż inny proces
opuści sekcję krytyczną, a zmiana poziomu uprzywilejowania wyłączy program
planisty, który odpowiada za~zmianę aktualnie wykonywanego wątku.

Sterowniki urządzeń mogą instalować swoje podprogramy obsługi za~pomocą
procedury \texttt{irq\_install\_handler}, przypisując od~razu odpowiedni
poziom uprzywilejowania.

Przerwania będące wyjątkami procesora są przez niego~rzucane w~szczególnych
przypadkach jak nieprawidłowy dostęp do~pamięci czy wykonanie nieprawidłowej
instrukcji. System Impala zostaje zatrzymany przy każdej pułapce procesora,
oprócz pułapki związanej z~nieodpowiednim dostępem pamięci. W takim wypadku,
w zależności od tego kto wykonał nieprawidłowy dostęp są podejmowane różne
akcje. Jeżeli wykonał go proces użytkownika to~jest do~niego dostarczany
sygnał \texttt{SIGSEGV}, jeżeli jądro to system jest zatrzymywany.

Przerwania programowe są wykorzystywane do~komunikacji użytkownika z~systemem,
mechanizm jest omówiony szerzej w~\ref{SYSCALL}.

