% 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{Przestrzeń użytkownika.}

Z punktu widzenia użytkownika opisane poniżej programy można traktować jako
komendy wydawane powłoce systemowej, należy mieć jednak świadomość, że są one
zewnętrznymi programami i nie stanowią jej integralnej części. W projekcie udało
się zawrzeć minimalny podzbiór podstawowych komend systemów UNIXowych, poniżej
znajduje się krótki opis programów, które dostępne są dla użytkownika systemu.

\subsection{Drzewo katalogów}

Drzewo katalogów systemu jest zgodne ze standardem
przyjętym w systemach UNIXowych.

\begin{itemize}
\item \texttt{/bin} - programy standardowe.
\item \texttt{/etc} - skrypty oraz pliki konfiguracyjne.
\item \texttt{/tmp} - pliki tymczasowe.
\item \texttt{/sbin} - programy specjalne.
\item \texttt{/demos} - programy demonstrujące.
\item \texttt{/var} - katalog systemowy.
\end{itemize}

\subsection{Polecenia standardowe.}

W systemie zaimplementowano część podstawowych komend systemów UNIXowych, na
uwagę zasługują programy sh oraz vttest, które zostały przeniesione do projektu
bez istotnych modyfikacji w ich kodzie.

\begin{itemize}
\item \texttt{cat} - wypisywanie zawartości pliku na standardowe
    wyjście.
\item \texttt{ls} - listowanie zawartości katalogów.
\item \texttt{minigzip} - kompresja i dekompresja plików.
\item \texttt{mkdir} - tworzenie katalogów.
\item \texttt{ps} - listowanie procesów.
\item \texttt{sleep} - śpi daną ilość sekund.
\item \texttt{sh} - powłoka systemowa.
\item \texttt{tar} - taśmowy program archiwizujący.
\item \texttt{truncate} - przycięcie (stworzenie) pliku do odpowiedniej
    długości, np \texttt{truncate -s 50 plik}.
\item \texttt{uname} - wyświetlenie informacji o systemie, np
    \texttt{uname -a} wydrukuje nazwę jądra, nazwę wydania, nazwę platformy
    oraz nazwę komputera.
\item \texttt{vttest} - testowanie zgodności z terminalem VT100. Warto go użyć
     jako program demonstrujący emulację terminalu.
\end{itemize}

\subsection{Polecenia specjalne.}

Polecenia specjalne służą do wykonywania prac administracyjnych, systemowych
oraz ewentualnego uzyskiwania informacji na temat systemu.

\begin{itemize}
\item \texttt{init} - rozruch systemu.
\item \texttt{ttyvrun} - uruchomienie programu z zadanym terminalem kontrolującym.
\item \texttt{login} - rozpoczęcie sesji użytkownika.
\end{itemize}

\subsection{Programy demonstracyjne.}

Ponieważ nasz projekt jest głównie przeznaczony dla~programistów
to~stworzyliśmy kilka dodatkowych programów demonstracyjnych
pokazujących możliwości jądra. Wszystkie te~programy można skompilować
na~dowolnym systemie UNIXowym w~celu porównania zachowania systemów.

\begin{itemize}
\item \texttt{pfault} -
program demonstrujący obsługę pułapki procesora wygenerowanej przez program
odwółujący się do~nieprawidłowego adresu \texttt{0xdeadbabe}.

\item \texttt{pipedemo} -
program testujący implementację potoków FIFO, przekopiowany ze~strony
podręcznika standardu. Implementacja potoków jest również testowana
przez program \texttt{tar}, który uruchamia pocmoniczy program dekompresujący
\texttt{minigzip} i komunikuje się z~nim za pomocą potoku. Potoki można
dodatkowo testować powłoką systemową wydajać polecenia z~użyciem znaku
\texttt{|}, np \texttt{echo "To jest napis" | cat}.

\item \texttt{pthdemo1} - 
pierwszy program demonstrujący bibliotekę wątków POSIX. Tworzy dodatkowy
wątek w~programie, który przez pięć sekund drukuje napis na~ekranie
napis \texttt{I am alive!}, a następnie zwraca napis \texttt{"working well"}.
Główny wątek programu oczekuje zakończenia pierwszego wątku, a następnie
drukuje zwrócony przez niego napis.

\item \texttt{pthdemo2} -
drugi program demonstrujący bibliotekę wątków POSIX. Tworzy blokadę
zamkniętą przez główny wątek oraz dwa dodatkowe wątki,
próbujące wejść w~sekcję krytyczną. Po pięciu sekundach główny wątek
zwalnia blokadę i~oczekuje zakończenia wątków, które synchronizują się
za~pomocą blokady.

\item \texttt{pthdemo3} -
trzeci program demonstrujący bibliotekę wątków POSIX. Tworzy blokadę,
oraz zmienną warunkową (patrz \ref{pthread_condvar}). Następnie symuluje
kolejkę przez licznik, dwa dodatkowe wątki symulują odczytywanie z~kolejki,
a~jeden dodatkowy zapisywanie. Wątek czytający z~kolejki używa zmiennej
warunkowej do~oczekiwania na nową wiadomość, jeżeli kolejka była pusta.
Wątek zapisujący używa zmiennej do~budzenia innych wątków czekających
na~zdarzenie. Program symuluje wysłanie ośmiu wiadomości do~kolejki.

\item \texttt{signal} -
program demonstrujący obsługę sygnalów. Instaluje uchwyty sygnałów
\texttt{SIGHUP} oraz \texttt{SIGUSR1}, a następnie wysyła je sam do~siebie.

\item \texttt{sysvmsg} - 
program testujący implementację kolejek wiadomości (patrz \ref{SYSVMSG}).
Uruchamiając go z~parametrem \texttt{create} tworzymy kolejkę wiadomości;
z~parametrem \texttt{send napis} wysyłamy napis do kolejki, a~z~parametrem
\texttt{recv} program pobiera i drukuje napis z~kolejki. Jeżeli kolejka jest
pusta to~program zostanie zablokowany przez jądro do czasu pojawienia się
wiadomośći w kolejce. Wysyłanie sygnału przerwania
przez terminal po naciśnięciu klawiszy CTRL+C nie odblokuje go, ponieważ
obecna implementacja nie obsługuje przerywania czekania. Należy w~takim
wypadku przełączyć się na~inny wirtualny terminal i wysłać jakąś wiadomość
do~kolejki.

Powłoki systemowej można użyć do~demonstracji kontroli zadań, dodając
znak \texttt{\&} na końcu polecenia - uruchamiający je w~tle.
Można zlecić nigdy nie kończące się polecenie
\texttt{cat /dev/zero > /dev/zero \&}, a następnie użyć polecenia \texttt{jobs}
oraz \texttt{fg}. Polecenie można zakończyć naciskając CTRL+C, co spowoduje
wygenerowanie sygnału przerwania \texttt{SIGINT} przez terminal.

Można również wydać polecenie \texttt{sleep 5 \&}, i zobaczyć jak powłoka
wykrywa zakończenie zadania w~tle. Powłoka informuje o tego typu rzeczach
dopiero po wydaniu jakiegoś polecenia przez użytkownika, ponieważ jest
zablokowana przez jądro~w oczekiwaniu na~wejście z~terminalu. Wpisując
to~polecenie można napisać dowolne inne po~pięciu sekundach w~celu otrzymania
komunikatu.

Potoki można w efektowny sposób przetestować wydając polecenie
\texttt{minigzip -d < /mnt/fd0/impala/syspack.tar.gz | tar tvf -}, które
uruchami dwa programy połączone potokiem. Wejściem programu \texttt{minigzip} będzie plik
\texttt{syspack.tar.gz}, a wejściem programu \texttt{tar} będzie wyjście
poprzedniego programu. Polecenie testuje poprawność archiwum i drukuje
jego zawartość.

\end{itemize}
