% 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{Szczegóły techniczne.}

\subsection{Obraz jądra.}\label{tech:elf}

Obraz jądra jest zapisany w~formacie ELF (\emph{Executable and Linkable
Format}). Format charakteryzuje zmienna ilość sekcji w pliku, gdzie
każda ma swoją nazwę. Obraz jądra zapisany w~tym formacie zawiera
następujące sekcje:
\begin{itemize}
 \item \texttt{.bootstrap} - kod rozruchowy jądra.
 \item \texttt{.text} - kod jądra.
 \item \texttt{.data} - dane jądra.
 \item \texttt{.rodata} - dane jądra, przeznaczone tylko do odczytu.
\end{itemize}

Różne dodatkowe sekcje mogą zostać dołączone przez kompilator.

Dużym udogodnieniem tego formatu jest możliwość przypisania każdej sekcji
dwóch różnych adresów ich lokalizacji. Jeden to~adres wirtualny, mówiący
gdzie dana sekcja znajduje się w~wirtualnej przestrzeni adresowej. Drugi
to~adres fizyczny informujący gdzie dana sekcja będzie znajdować się
w~pamięci fizycznej.

Systemy operacyjne, używające tego formatu do~obrazów programów, nie używają
pola z~adresem fizycznym, ponieważ jest on dynamicznie ustalany podczas
ładowania programów. Używa go natomiast program ładujący GRUB przy wybieraniu
lokalizacji w~pamięci gdzie daną sekcję załadować.

\subsection{Obrazy programów.}\label{tech:aout}

Obrazy programów w~naszym systemie są trzymane w~starym formacie
plików wykonywalnych \texttt{A.out} (assembler output). Obecnie ten format
jest wyparty przez format ELF, lecz jego prosta budowa czynią go idealnym
kandydatem do~prostego systemu operacyjnego. Obraz w~tym formacie zawiera
w~pliku dwie sekcje.
\begin{itemize}
 \item \texttt{.text} - kod programu.
 \item \texttt{.data} - dane programu.
\end{itemize}

Początek sekcji danych jest zaokrąglony do~adresu pierwszej strony
po~sekcji tekstu, która rozpoczyna się pod adresem 0.

\subsection{Rozruch systemu.}


Skompresowany obraz jądra (\texttt{/boot/impala.gz}) jest ładowany przez
program GRUB, zainstalowany w~sektorze rozruchowym dyskietki. 

Z~działania jądra w~wysokich adresach (\ref{vm:mmap}) wynika trudność
techniczna przy ładowaniu systemu. Program ładujący nie przygotowuje
mechanizmu stronicowania (pamięci wirtualnej), w~związku z~czym ogólny
kod jądra jest bezużyteczny. 
Ponieważ format ELF umożliwia tworzenie wielu sekcji z możliwością rozróżnienia
adresu fizycznego od wirtualnego to~problem został rozwiązany przez
wprowadzenie specjalnej sekcji \texttt{.bootstrap}. Sekcja w~odróżnieniu
od standardowej sekcji \texttt{.text} jest przystosowana
do~pracy w~środowisku, gdzie adresy wirtualne odpowiadają adresom fizycznym.

Kod rozruchowy z~tej sekcji konfiguruje mechanizm stronicowania aby
odwzorować kod jądra w~wysokich adresach, a następnie przekazuje
sterowanie kodu rozruchowego z~sekcji tekstu.

W pierwszej kolejności uruchamiana jest inicjalizacja modułu platformy
sprzętowej. Następnie sterowanie jest przekazywane do~procedury \texttt{kmain}
niezależnej od~platformy.


\subsection{System budowania.}

System budowania systemu jest wzorowany na~tym z systemu BSD. Idea polega
napisaniu ogólnych skryptów dla~programu \texttt{make}, które sparametryzowane
mogą budować biblioteki, programy i jądro. Skrypty budujące system włączają
w~siebie te ogólne i je parametryzują w~zależności od~zadania jakie chcą
wykonać.

Ta technika zwiększa wygodę budowania systemu, ponieważ cała obsługa
jest zapachnięta do~kilku plików, a w pozostałych częściach drzewa
dostępne są tylko krótkie i~łatwe w~zarządzaniu deklaracje zadań. Poprawianie
błędów tyczy się jedynie tych głównych skryptów, a efekt powiela się we
wszystkich ich klientach.

Przykładowy skrypt \texttt{Makefile} budujący bibliotekę ze sterownikami
jądra:
\begin{verbatim}
LIBRARY= libdev
CFLAGS=-D__KERNEL ${_K_FLAGS}

SRCS=\
    devtable.c\
    fdc/fdc.c\
    md/md.c\
    pseudo/null.c\
    pseudo/zero.c\

include ${IMPALA_MK}/lib.mk
\end{verbatim}

Ostatnia linia w~skrypcie włącza odpowiedni skrypt, a definiowane zmienne
są jego parametrami.

Ponieważ nasz zespół
posługiwal się różnymi wariantami programu \texttt{make} to~byliśmy zmuszeni
zrezygnować z~wygodnych udogodnień oferowanych przez nie, z~powodu
braku wzajemnej kompatybilności. Źródła głównych skryptów znajdują się
w~katalogu \texttt{mk/}.

