% 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$

\chapter{Opis projektu.}

\section{Wstęp.}

System operacyjny Impala został zrealizowany w~ramach licencjackiego
projektu programistycznego na~Uniwersytecie Wrocławskim. W~skład
systemu wchodzi jądro, biblioteka systemowa (języka C), biblioteka wątków
oraz oprogramowanie. System jest wzorowany na~systemach wywodzących się
z~systemu UNIX i~przeznaczony jest dla~komputerów klasy PC. 

\subsection{Cele i motywacje projektu.}

Głównym celem i~motywacją do~powstania projektu była chęć stworzenia systemu
operacyjnego, który stanowiłby pomoc w~nauce ich budowy i~zasad działania oraz
mechanizmów niskopoziomowych komputera. Projekt miał być wzorowany na systemach
wywodzących się z~systemu UNIX i~implementować możliwie najwięcej zgodnie
ze~standardem POSIX. Jako wyznacznik dojrzałości projektu oraz funkcjonalności
kodu przyjęte zostało przeniesienie powłoki systemowej \texttt{ash}
oraz~edytora tekstu
vi. Projektowany system pomimo, że tworzony wyłącznie na komputerach klasy PC,
wyposażonych w~procesor Pentium Pro,
miał być możliwie najbardziej przenośny. Dodatkową motywacją była chęć
zgłębienia kodu i mechanizmów działania popularnych następców systemu UNIX.

Powłoka \texttt{ash} została zaprogramowana w~1992 roku przez Kennetha
Almquista
dla~systemu BSD UNIX\footnote{Powłoka do~dziś jest stosowana w~systemie
FreeBSD jako główna powłoka systemowa. Niektóre dystrybucje systemu Linux
używają tej powłoki jako wyznacznik zgodności skryptów ze standardem,
w~dystrybuowanych paczkach jest dostępna pod nazwą \texttt{dash}.
}
jako zastępca oryginalnej powłoki Bourna. Nie posiada
wielu wygodnych funkcji, jak historia poleceń i dopełnianie komend,
 dostępnych w~popularnych powłokach jak \texttt{bash}, \texttt{tcsh},
\texttt{zsh}, lecz posiada obsługę zarządzania zadaniami, stąd można ją
uznać za~wyznacznik podobieństwa do~systemu UNIX.

\subsection{Co udało się osiągnąć.}

Zrealizowany projekt z pewnością stwarza możliwość zgłębienia tajników
budowy i zasad działania systemu operacyjnego, wszystkie ważne mechanizmy
zostały zaprojektowane, zaimplementowane i omówione w tej dokumentacji.
Założenie o przenośności systemu zostało zrealizowane poprzez oddzielenie kodu
działającego na poziomie sprzętu i operującego bezpośrednio na nim od kodu
działającego niezależnie od platformy. Podejście to umożliwia studiowanie
mechanizmów niskopoziomowych niezależnie od reszty systemu. Udało się
zrealizować założenie podobieństwa do~systemu UNIX,
czego konsekwencją jest przeniesienie z powodzeniem powłoki systemowej \texttt{ash},
nie został jednak zrealizowany cel przeniesienia edytora tekstowego, który
wymaga dalszego dostosowania.
Udało się również przenieść program \texttt{vttest}, który posłużył przy
sprawdzaniu i~udoskanalaniu naszej implementacji terminali w~emulacji VT100.

Ponieważ powłoka systemowa została zaprojektowana dla~systemu BSD to~podczas
rozwijania naszego systemu by był w~stanie uruchomić ten program mogliśmy
odbiec od~semantyki procedur systemowej ze standardu POSIX, na~rzecz systemu
docelowego powłoki. Stwierdzenie zgodności ze~standardem wymaga przeprowadzenia
testów.

\section{Organizacja.}

\subsection{Użyte narzędzia.}

Realizacja projektu wymagała użycia wielu narzędzi dostarczonych z zewnątrz.
Poniżej znajduje się zwięzły opis tych, które odegrały kluczową rolę
podczas pracy.

Zarządzanie pracą grupową i podział zadań na poszczególnych programistów
było wspomagane przez system EdgeWall
Trac\footnote{Instalacja tego programu na~potrzeby naszego projektu jest dostępna
pod adresem internetowym \texttt{http://bitbucket.org/wieczyk/impala/} },
kolejne etapy projektu zostały podzielone na mniejsze
zadania i wprowadzone jako bilety, dzięki wykorzystaniu tego mechanizmu możliwa
była na bieżąco kontrola efektów pracy i planowanie kolejnych etapów rozwoju.
Wykorzystane zostały również mechanizmy zarządzania treścią do budowania
zalążków dokumentacji oraz wymiany najistotniejszych informacji o projekcie.
Interfejs dodatkowo stanowił graficzną nakładkę na system kontroli wersji pozwalając 
wygodnie przeglądać kolejne rewizje kodu, udostępniony mechanizm wiki
umożliwił również robienie krótkich notek na~stronie dotyczących projektu.


System kontroli wersji SVN został wykorzystany do synchronizacji kodu, umożliwił
on niezależną i wygodną pracę nad projektem każdemu z uczestników. Wykorzystane
zostały mechanizmy gałęzi do rozwijania większych mechanizmów, które następnie
były scalane do głównego drzewa. System pozwolił na bieżąco śledzić zmiany w
kodzie wprowadzane przy kolejnych rewizjach.

Emulatory komputerów PC, Qemu oraz BOCHS, pozwoliły na wygodne testowanie
pisanego kodu, dzięki tym programom nie istniała potrzeba ciągłych restartów
komputera w celu sprawdzenia czy wprowadzane do systemu zmiany przyniosły
oczekiwany skutek. Zostało jednak uznane za sprawę ważną, aby system działał
także na prawdziwych komputerach klasy PC, po dodaniu istotnych części systemu
był więc testowany i dostosowywany tak, aby działał na prawdziwym sprzęcie.
Emulator Qemu dodatkowo posłużył do wpięcia debuggera gdb, co umożliwiało
prostsze wyłapywanie błędów oraz śledzenie przebiegu programu. Do obydwu
emulatorów wraz z~projektem dostarczone są proste łaty wypełniające bajty
pamięci komputera wzorcem \texttt{0xe9}, które pozwalają wykryć więcej błędów
z~użyciem emulatorów, domyślnie zerujących pamięć RAM.


\subsection{Opis drzewa z~kodem źródłowym.}

Drzewo z~kodem źródłowym ma ustaloną strukturę, w~poniższym opisie
katalog \texttt{.} oznacza korzeń drzewa.

\begin{itemize}
\item \texttt{./doc/doxygen/} - 
katalog z~dokumentacją kodu automatycznie
generowaną przez program DoxyGen (po~wykonaniu polecenia
\texttt{make doc} w~katalogu wyższym).

\item \texttt{./doc/handbook/} -
źródła tego dokumentu.

\item \texttt{./sys/} -
drzewo z~kodem jądra systemu.

\item \texttt{./sys/arch/} -
drzewo z~wydzieloną obsługą platform

\item \texttt{./sys/arch/x86/} -
kod obsługi platformy PC z~procesorem PentiumPro.

\item \texttt{./sys/dev/} -
biblioteka \texttt{libdev.a} zawierająca sterowniki urządzeń.

\item \texttt{./sys/fs/} -
biblioteka \texttt{libfs.a} zawierająca obsługę systemów plików.

\item \texttt{./sys/kern/} -
kod właściwy jądra.

\item \texttt{./sys/kern/sc/} -
obsługa wywołań systemowych.

\item \texttt{./sys/sys/}
nagłówki języka C.

\item \texttt{./usr/} -
drzewo z~kodem programów i~bibliotek.

\item \texttt{./usr/bin/} -
źródła standardowych programów.

\item \texttt{./usr/sbin/} -
źródła systemowych programów.

\item \texttt{./usr/demos/} -
źródła programów demonstracyjnych.

\item \texttt{./usr/lib/} -
poddrzewo zawierające kody bibliotek.

\item \texttt{./usr/lib/libc/} -
biblioteka systemowa (języka C).

\item \texttt{./usr/lib/libpthread/} -
biblioteka wątków użytkownika.

\item \texttt{./usr/etc/} -
katalog ze skryptami startowymi systemu.

\item \texttt{./mk/} -
skrypty dla programów Makefile tworzące nasz system budowania.

\item \texttt{./image/} -
skrypty budujące obraz dyskietki.

\end{itemize}
