\documentclass[a4paper,fleqn,12pt]{JMThesis}
\renewcommand{\footnotesize}{\fontsize{9pt}{11pt}\selectfont}
\usepackage{listings}
\lstset{
    basicstyle=\footnotesize,
    frame=single,
    showstringspaces=false,
    tabsize=4,
    escapeinside={<@}{@>},
%    numbers=left
}
\lstset{defaultdialect=[x86masm]Assembler}

\usepackage[OT2]{fontenc}
\newcommand\eng{\fontencoding{OT1}\fontfamily{\rmdefault}\selectfont}
\newcommand\srb{\fontencoding{OT2}\fontfamily{\rmdefault}\selectfont}

% \usepackage[serbian,english]{babel}

\renewcommand{\baselinestretch}{1}
\usepackage{amsfonts}
\usepackage{amsthm}
\usepackage{amsmath}
\usepackage{multicol}
\usepackage{hyperref}
\usepackage{tocloft}
\usepackage[
    backend=bibtex,
    natbib=true,
    style=numeric,
    block=ragged,
    sorting=none
]{biblatex}
\bibliography{kernel}
\renewcommand*{\bibfont}{\eng}

\newlength\tindent
\setlength{\tindent}{\parindent}
\setlength{\parindent}{0pt}
\setlength{\itemsep}{0pt}
\setlength{\parskip}{0pt}
\setlength{\parsep}{0pt}
\renewcommand{\indent}{\hspace*{\tindent}}

\oddsidemargin 1cm
\evensidemargin 0cm
\textwidth 15cm

\pagestyle{headings}

\font \matematicka=wncsc10 scaled 1600
\font \maturski=wncyb10 scaled 2500
\font \naslov=wncyb10 scaled 1900
\font \naslovlat=cmr10 scaled 1900
\font \imen=wncyr10 scaled 1600


\def\zn{,\kern-0.09em,}
\def\zng{'\kern-0.09em'}
\pagenumbering{roman}
\begin{document}


\thispagestyle{empty}

\begin{center}
{\matematicka Matematichka gimnazija}
\end{center}
\vspace*{50mm}

\begin{center}
{\maturski MATURSKI RAD}

\vspace*{8pt}
{\naslov - iz rachunarstva i informatike -}
\end{center}

\vspace*{10pt}
\begin{center}
    {\naslov \textbf{\eng\Large 32bit X86} jezgro operativnog sistema}
\end{center}

\vspace*{70mm}
\setlength{\columnsep}{50pt}
\begin{multicols}{2}
 {\noindent \imen Uchenik:
\\Aleksa Vuchkovic1  $\operatorname{IV}$c}


{ \noindent \hfill \imen Mentor:\\
\hfill \phantom{aaaaaaaa} Milosh Arsic1}
\end{multicols}

\vfill
\begin{center}
{\imen Beograd, jun 2022.}
\end{center}
\clearpage

\thispagestyle{empty}
\mbox{}
\clearpage


\renewcommand{\contentsname}{Sadrzhaj}
\thispagestyle{empty}

\pagenumbering{gobble}

\tableofcontents \clearpage

\thispagestyle{empty}
\mbox{}
\clearpage

\pagenumbering{arabic}
\renewcommand{\chaptername}{}
\setcounter{page}{1}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Uvod}
\bigskip

Ideja za ovaj rad proizishla je iz ekstenzivnog korish\/c1enja {\eng GNU/Linux}
sistema, kao i zhelja za razumevanjem rada rachunara na najnizhem nivou.

Ceo kod je pisan u {\eng GNU Asembler}-u i {\eng C}-u i mozhe se nac1i na
{\eng GitHub}-u na stranici {\eng\url{https://github.com/aleksav013/mykernel}}.
Kod, zajedno sa svim alatima za njegovo korishenje i upotrebu, je dostupan pod
{\eng GPLv3} licencom.

Ovaj projekat se konstantno unapredjuje i nemoguc1e je odrzhavati
sinhronizovanim fajlove koji sachinjavaju operativni sistem, a koji se
istovremeno pominju u ovom radu. Iz tog razloga, rad c1e biti napisan za
verziju operativnog sistema 1.0.0. Na stranici {\eng GitHub}-a ova verzija se
mozhe nac1i pod {\eng tag/s} sekcijom na stranici projekta.

Radi laksheg kompajlovanja koda od strane chitaoca, kreiran je {\eng toolchain}
- set alata, specifichno za kompajlovanje ovog operativnog sistema, koji se
mozhe nac1i na stranici
{\eng\url{https://github.com/aleksav013/aleksa-toolchain}},
takodje dostupan pod {\eng GPLv3} licencom otvorenog koda. Set alata {\eng
aleksa-toolchain} kreiran je takodje i iz razloga shto je zapravo neizbezhan
proces kreiranja {\eng cross-compilera} - kompajlera koji kompapajluje kod za
drugi sistem/arhitekturu na trenutnom sistemu/arhitekturi. Na taj nachin i
drugi ljudi osim autora mogu doprineti izradi i pobojshanju ovog operativnog
sistema u buduc1nosti.\\

Ovaj projekat ima za cilj da prikazhe postupak kreiranja jednog za sada
vrlo jednostavnog operativnog sistema, kao i da potkrepi chitaoce teorijom
potrebnom za njegovo razumevanje.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{{\eng X86} arhitektura}
\bigskip

{\eng X86} je familija arhitektura {\eng CISC} seta instrukcija razvijena od
strane Intel-a koja je bazirana na 8086 mikroprocesoru. 8086 je nastao 1978.
kao shesnaestobitna ekstenzija 8080 osmobitnog mikroprocesora, da bi 1985.
godine nastao 80386 sa velichinom registra od chak 32 bita. Svi procesori iz
ove familije nose zajednichki naziv upravo po sufiksu 86 koji se pojavljuje u
imenima svih ovih procesora.\\

U periodu od 1999. do 2003. {\eng AMD} je proshirio velichinu registra na 64 bita
i ta arhitektura ima vishe naziva od kojih su najkorisheniji: {\eng x86\_64,
amd64} i {\eng x64}. Velika vec1ina uredjaja danas koristi {\eng x86\_64} arhitekturu
procesora.\\

Jezgo operativnog sistema prikazano u ovom radu bazirano je na {\eng X86}
arhitekturi sa registrom velichine 32 bita. Konkretna verzija ove arhitekture
je {\eng i386}. Ova verzija dobila je ime po Intelovom mikroprocesoru pod
imenom 80386 shto oznachava trec1u generaciju {\eng X86} arhitekture.


\section{Registri procesora}
\medskip

Postoji vishe vrsta registara procesora\cite[75]{misc:1}. Neki od osnovnih
registara koje je potrebno pomenuti dati su u tekstu koji sledi. Razlog zbog
kojeg su navedena i imena registara prethodnih verzija {\eng X86} arhitekture
je zbog toga shto je moguc1e adresirati prvih {\eng x} bitova ako se koristi
ime registra za {\eng x}-tobitnu verziju {\eng X86} arhitekture. Naravno, ovo
vazhi samo ukoliko je duzhina registra nasheg sistema (32 bita), vec1a ili
jednaka duzhini registra chiju notaciju koristimo.

\newpage
Registri opshte namene:\\[1mm]
{\eng\begin{tabular}{|c|c|c|c|c|c|c|c|c|}
\hline
8bit & al & bl & cl & dl & sil & dil & spl & bpl \\
\hline
16bit & ax & bx & cx & dx & si & di & sp & bp \\
\hline
32bit & eax & ebx & ecx & edx & esi & edi & esp & ebp \\
\hline
64bit & rax & rbx & rcx & rdx & rsi & rdi & rsp & rdp \\
\hline
\end{tabular}}\\

Segmentni registri:\\[1mm]
{\eng\begin{tabular}{|c|c|c|c|c|c|}
\hline
cs & ds & ss & es & fs & gs \\
\hline
\end{tabular}}\\

Kontrolni registri:\\[1mm]
{\eng\begin{tabular}{|c|c|c|c|c|}
\hline
cr0 & cr2 & cr3 & cr4 & cr8 \\
\hline
\end{tabular}}\\

Sistemski registri (pokazivachi na tabele):\\[1mm]
{\eng\begin{tabular}{|c|c|c|}
\hline
gdtr & ldtr & idtr \\
\hline
\end{tabular}}\\

Osim pomenutih, pochev od shesnaestobitne {\eng X86} arhitekture postoje i
registri {\eng ah, bh, ch, dh (h-higher)} koji predstavljaju gornju polovinu
(od 9. do 16. bita) {\eng ax, bx, cx, dx} registara redom. U daljem tekstu
bic1e prikazan odnos izmedju registara o kome je ranije bilo rechi, kao i
prikaz i na to od kog do kog bita registra se odnosi data notacija.\\

{\eng\begin{tabular}{|c|c|c|c|c|c|c|c|}
63-56 & 55-48 & 47-40 & 39-32 & 31-24 & 23-16 & 15-8 & 7-0 \\
\hline
&&&&&& ah & al \\
\hline
&&&&&& \multicolumn{2}{|c|}{ax} \\
\hline
&&&& \multicolumn{4}{|c|}{eax} \\
\hline
\multicolumn{8}{|c|}{rax} \\
\hline
\end{tabular}}\\

Primetimo da ukoliko nas interesuje vrednost drugog bajta u {\eng X86\_64}
arhitekturi, do nje mozhemo doc1i na sledec1a 4 nachina:
{\eng ah, ax\&0xFF00, eax\&0x0000FF00} ili {\eng rax\&0x000000000000FF00}.


\section{Registri opshte namene}
\medskip

Registri opshte namene imaju ulogu u chuvanju operandi i pokazivacha:
\begin{itemize}
\item Operandi za logichke i aritmetichke operacije
\item Operandi za adresne kalkulacije
\item Pokazivache na memorijsku lokaciju
\end{itemize}

Registri opshte namene se mogu koristiti proizvoljno prema potrebi. Medjutim,
dizajneri hardvera su uvideli da postoji moguc1nost daljih optimizacija ukoliko
se svakom od ovih registara dodeli neka specifichna uloga u kojoj je malo bolji
od ostalih registara opshte namene.\\

Na taj nachin kompajleri vec1inu vremena kreiraju bolji asemblerski kod nego
ljudi, prosto iz razloga jer svaki od registara opshte namene takodje koriste i
za njihovu specifichnu funkciju svaki put gde je to moguc1e.\\

Specifichna uloga registara opshte namene:
\begin{itemize}
\item {\eng eax} - akumulator za operande i podatke rezultata
\item {\eng ebx} - pokazivach na podatke u {\eng ds} segmentu
\item {\eng ecx} - brojach za petlje i operacije nad stringovima
\item {\eng edx} - pokazivach na U/I
\item {\eng esi} - pokazivach na podatke na koji pokazuje {\eng ds} registar;
    pochetni pokazivach za operacije nad stringovima
\item {\eng edi} - pokazivach na podatke u segmentu na koji pokazuje {\eng es}
    registar; krajnji pokazivach za operacije nad stringovima
\item {\eng esp} - pokazivach na pochetak steka
\item {\eng ebp} - pokazivach na podatke u steku

\end{itemize}

\section{Segmentni registri}
\medskip

Segmentni registri sadrzhe shesnaestobitne selektore segmenta. Selektor segmenta je
specijalan pokazivach koji identifikuje segment u memoriji. Da bi pristupili
odredjenom segmentu u memoriji, selektor segmenta koji pokazuje na taj segment
mora biti dostupan u odgovarajuc1em segmentnom registru.

Specifichna uloga segmentnih registara:
\begin{itemize}
\item {\eng cs - code segment}. {\eng cs} registar sadrzhi selektor segmenta
    koji pokazuje na segment koda u kome se nalaze instrukcije koje se
    izvrshavaju.
\item {\eng ds - data segment}. Osim {\eng ds}, segmentni registri za segmente
    podataka su i {\eng es, fs}, kao i {\eng gs}.
\item {\eng ss - stack segment} {\eng ss} registar sadrzhi selektor segmenta
    koji pokazuje na segment steka gde se chuva stek programa koji se trenutno
    izvrshava. Za razliku od registra za segment koda, {\eng ss} registar
    se mozhe eksplicitno postaviti shto dozvoljava aplikacijama da postave
    vishe stekova i da alterniraju izmedju njih.
\end{itemize}


\section{{\eng Real mode}}
\medskip

Realni mod karakterishe 20-tobitna segmentirana memorija shto znachi da se
mozhe adresirati samo malo vishe od jednog megabajta. Svi procesori pochev od
80286 zapochinju u ovom modu nakon paljenja rachunara zbog kompatibilnosti. Da
bismo mogli da adresiramo vishe memorije potrebno je da koristimo segmentne
registre.\\

Postupak kojim iz realnoh moda prelazimo u zashtic1en mod naziva se daleki skok
{\eng (far jump)} gde pri postavljanju segmentnih registara "skachemo" iz
jednog segmenta u drugi. Daleki skok najchesh\/c1e podrazumeva promenu selektora
segmenta, koji se nalazi u segmentu koda, i koji pokazuje na segment koda u
kome se nalaze instrukcije koje se trenutno izvrshavaju.

\section{Segmentacija}
\medskip

Segmentacija je reshenje kojim se omoguc1ava adresiranje vishe memorije nego
shto je to hardverski predvidjeno. Segmentacija se postizhe korish\/c1enjem
{\eng offset}-a. Sa segmenatcijom smo u realnom modu da adresiramo memoriju sa
20 umesto predvidjenih 16 bitova.

\section{{\eng Protected mode}}
\medskip

Zashtic1en mod je stanje procesora u kojem procesor ima pun pristup celom
opsegu memorije za razliku od realnog moda. Maksimalna velichina {\eng RAM}
memorije koju arhitektura {\eng i386} podrzhava je {\eng 4GB} upravo zbog
velichine registra od 32 bita ($2^{32}B = 4GB$). Neki procesori koji
podrzhavaju {\eng PAE - Physical Address Extension} podrzhavaju i adresiranje
memorija preko 64 bita. Kasnije je na ovom starndardu utemeljeno i adresiranje
memorija na {\eng X86\_64}.\\

Adresiranje svih 32 bita memorije postizhe se  korish\/c1enjem stranichenja
({\eng paging}), koje nam dozvoljava da mapiramo fizichku memoriju na
virtuelnu. Na taj nachin prilikom izvrshavanja svakog programa mozhe se
zavarati program tako da misli da njegovo izvrshavanje krec1e od pocheka
memorije. Na taj nachin znachajno nam je olakshano izvrshavanje programa jer
nam svi programi postaju nezavisni od adrese fizichke memorije gde se oni
zapravo nalaze, dok prilikom kreiranja programa mozhemo fiksno postaviti adresu
prve instrukcije.

%{\eng\url{https://wiki.osdev.org/Protected_Mode}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{{\eng Boot}}

\section{Redosled pokretanja}
\medskip

Od pritiska dugmeta za paljenje rachunara, pa do uchitavanja operativnog sitema
postoji ceo jedan proces. Nakon pritiska dugmeta rachunar prvo izvrshava {\eng
POST (Power On Self Test)} rutinu koja je jedna od pochetnih faza {\eng BIOS}-a
{\eng (Basic Input Output System)}. U {\eng POST}-u rachunar pokushava da
inicijalizuje komponente rachunarskog sistema jednu po jednu i proverava da li
one ispunjavaju sve uslove za startovanje rachunara. Ukoliko je ceo proces
proshao bez greshaka nastavlja se dalje izvrshavanje {\eng BIOS}-a. {\eng BIOS}
sada ima ulogu da pronadje medijum koji sadrzhi program koji c1e uchitati
jezgro operativnog sistema u ram memoriju rachunara. Taj program se naziva
{\eng Bootloader}.

%{\eng\url{https://wiki.osdev.org/Boot_Sequence}}

\section{{\eng Bootloader}}
\medskip

{\eng Bootloader} je program koji se nalazi u prvih 512 bajtova medijuma u
{\eng MBR} odeljku, i njegov zadatak je da uchita jezgro operativnog sistema u
{\eng RAM} memoriju i preda mu dalje upravljanje. Zbog kompleksnosti danashnjeg
softvera, 512 bajtova je vrlo malo za uchitavanje celog {\eng bootloader}-a. Iz
tog razloga neki {\eng bootloader}-i razdvojeni su u vishe delova,
najchesh\/c1e 2. Prvi deo je vrlo mali i staje u 512 bajtova {\eng MBR}-a i on
sluzhi samo da bi uchitao drugi deo u kome se nalazi glavni kod koji dalje
predaje upravljanje jezgru operativnog sistema.\\

Neki od najpopularnijih {\eng bootloader}-a jesu {\eng GRUB, LILO,
systemd-boot, rEFInd}, kao i {\eng Windows Boot Manager}. Za potrebe ovog
operativnog sistema korish\/c1en je {\eng GRUB} o kome c1e biti vishe rechi u
odeljku Korish\/c1eni alati.

%{\eng\url{https://wiki.osdev.org/Bootloader}}

\section{{\eng Multiboot2} specifikacija}
\medskip

{\eng Multiboot} specifikacija je otvoreni standard koji jezgrima obezbedjuje
ujednachen nachin pokretanja od strane {\eng bootloader}-a usaglashenih sa ovom
specifikacijom. Jedna od prvih stvari koji svako jezgro uradi je postavljanje
konstanti definisanih {\eng multiboot2} standardom da bi bilo prepoznato od
strane {\eng bootloader}-a i da bi mu bilo predato dalje upravljanje.

\section{{\eng ELF}}
\medskip

{\eng ELF} je format za skladishtenje programa ili fragmenata programa na
disku, kreiran kao rezultat kompajlovanja i linkovanja. {\eng ELF} fajl je
podeljen na odeljke. Za program koji mozhe da se izvrshi, postoje sledec1i
odeljci: odeljak sa tekstom za kod, odeljak sa podacima za globalne promenljive
i odeljak {\eng ".rodata" (read only data)} koji obichno sadrzhi konstantne
niske. {\eng ELF} fajl sadrzhi zaglavlja koja opisuju kako ovi odeljci treba
da budu uskladishteni u memoriji.\\

Ovaj format definisan je u {\eng System V ABI} ({\eng System V Application
Binary Interface})\cite{misc:3}, koji je set specifikacija koji definishe
pozivanje funkcija, format objektnih fajlova, format fajlova koji mogu da se
izvrshe, dinamichno linkovanje kao i mnoge druge.\\

Funkcije arhitekture {\eng i386} po konvenciji povratne vrednosti celobrojnog
tipa chuvaju u {\eng eax} registru, dok se vrednosti koje ne staju u 32
bita {\eng eax} registra "prelivaju" u {\eng edx} registar. Ova informacija c1e
nam biti kljuchna kada budemo pozivali funkcija napisane u {\eng C}-u iz {\eng
Assembler}-a.

%{\eng\url{https://wiki.osdev.org/ELF}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Korish\/c1eni alati}
\bigskip

U daljem tekstu se mogu videti neki od alata korish\/c1enih u kreiranju ovog
rada. Vec1ina korish\/c1enih alata poseduje {\eng GPLv3} licencu.
{\eng GNU Public Licence} je licenca otvorenog koda koja dozvoljava
modifikovanje i distribuiranje koda sve dok taj je taj kod javno dostupan.
Jedini programi sa ove liste koji nije kreirao {\eng GNU} su {\eng QEMU}
virtuelna mashina, {\eng git} i {\eng NeoVim} koji koriste {\eng GPLv2}
licencu.\\

Operativni sistem korish\/c1en u izradi ovog projekta je {\eng Artix Linux}.
{\eng Artix Linux} je {\eng GNU/Linux} distribucija bazirana na {\eng Arch
Linux}-u.
Vec1ina korish\/c1enih programa je vec1 kompajlovana i spremna za upotrebu i
nalazi se u oficijalnim repozitorijima.\\

Za programe koji su morali biti manuelno kompajlovani date su instrukcije u
njihovoj podsekciji. Programi koji su morali biti naknadno kompajlovani su
{\eng binutils} i {\eng GCC} i to da ne bi koristili standardnu biblioteku koju
nam je obezbedio operativni sistem domac1in (onaj na kome se kompajluje ovaj
projekat), vec1 posebnu bibloteku kreiranu za ovo jezgro. Za ostale programe
koji su korish\/c1eni preporuka je koristiti one koji su dostupni kao spremni
paketi u izvorima odabrane distrubucije {\eng GNU/Linux}-a.

\section{{\eng Binutils}}
\medskip

Izvorni kod softvera se mozhe nac1i na stranici
{\eng\url{https://www.gnu.org/software/binutils/}},
zajedno sa uput\/stvom za kompajlovanje i korish\/c1enje.\\

Ovaj softverski paket sadrzhi programe neophodne za izradu programa od kojih su
najkorish\/c1eniji asembler ({\eng as}), linker ({\eng ld}), kao i program za
kreiranje biblioteka ({\eng ar}).

\subsection{Pre dodavanja {\eng C} biblioteke}
\smallskip

Iz razloga shto se ne koristi standardna biblioteka vec1 samostalno napisana
specifichno za ovaj projekat, potrebno je manuelno kompajlovati {\eng GNU
Binutils}. Medjutim, postoji moguc1nost korish\/c1enja vec1 spremnog paketa
koji se za distribucije bazirane na {\eng Arch Linux}-u mozhe nac1i na stanici
{\eng\url{https://aur.archlinux.org/packages/i686-elf-binutils/}}. Pojedine
distribucije vec1 imaju ovaj paket kompajlovan, ali je preporuka manuelno
kompajlovati da bi se izbegla nekompatibilnost, a i prosto iz razloga shto c1e
nakon formiranja nashe {\eng C} biblioteke biti neophodno kompajlovati ovaj
program za svaki sistem posebno.\\

Za one koje zhele sami da kompajluju {\eng binutils}, dat je deo instrukcija
koji se razlikuje od uput\/stva datog na zvanichnom sajtu a tiche se
konfigurisanja pre kompilacije.\\

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=make]{include/00.alati/binutils/binutils1}\srb\end{minipage}\smallskip

\subsection{Nakon dodavanja  {\eng C} biblioteke}
\smallskip

Nakon dodavanja nashe {\eng C} biblioteke potrebno je kompajlovati {\eng GNU
Binutils} tako da tu biblioteku i koristi prilikom kompajlovanja nasheg
operativnog sistema.

\textbf{Napomena:} Potrebno je postaviti {\eng \$SYSROOT} na lokaciju koja
sadrzhi biblioteku. To je moguc1e uraditi na sledec1i nachin:\\

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=make]{include/00.alati/binutils/exportsysroot}\srb\end{minipage}\smallskip

Instrukcije za kompajlovanje date su u nastavku.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=make]{include/00.alati/binutils/binutils2}\srb\end{minipage}\smallskip

\subsection{{\eng GNU Assembler}}
\smallskip

Iako trenutno postoje mnogo popularnije alternative poput {\eng NASM (Netwide
Assembler)} i {\eng MASM (Microsoft Assembler)} koji koriste noviju Intelovu
sintaksu, autor se ipak odluchio za {\eng GASM} zbog kompatibilnosti sa {\eng
GCC} kompajlerom. {\eng GASM} kosristi stariju {\eng AT\&T} sintaksu koju
karakterishe: obrnut poredak parametara, prefiks pre imena registara i
vrednosti konstanti, a i velichina parametara mora biti eksplicitno definisana.
Zbog toga c1e mozhda nekim chitaocima biti koristan program {\eng intel2gas}
koji se za {\eng Arch Linux} mozhe nac1i na stanici
{\eng\url{https://aur.archlinux.org/packages/intel2gas/}}.\\

{\eng GNU Assembler} je korish\/c1en za kompajlovanje dela koda
napisanog u asembleru.

\subsection{{\eng GNU Linker}}
\smallskip

{\eng GNU Linker} je korish\/c1en za linkovanje, tj. "spajanje" svog
komapjlovanog koda u jednu binarnu datoteku tipa {\eng ELF} koja predstavlja
jezgro (kernel).

\section{{\eng GCC}}
\medskip

Izvorni kod softvera se mozhe nac1i na stranici
{\eng\url{https://gcc.gnu.org/}}, zajedno sa uput\/stvom za kompajlovanje i
korish\/c1enje.\\

Isto kao i za {\eng GNU Binutils} moguc1e je pronac1i vec1 spreman paket u
pojedinim distribucijama ali je preporuka manuelno kompajlovati iz
prethodno navedenih razloga. Za {\eng Arch Linux} ovaj paket se mozhe nac1i na
stanici {\eng\url{https://aur.archlinux.org/packages/i686-elf-gcc/}}.\\

{\eng GCC} je {\eng GNU}-ov set kompajlera koji je korish\/c1en za kompajlovanje
ovog operativnog sistema.

\subsection{Pre dodavanja {\eng C} biblioteke}
\smallskip

Za one koje zhele sami da kompajluju {\eng GCC}, dat je deo instrukcija koji se
razlikuje od uput\/stva datog na zvanichnom sajtu a tiche se konfigurisanja pre
kompilacije.\\

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=make]{include/00.alati/gcc/gcc1}\srb\end{minipage}\smallskip

\subsection{Nakon dodavanja {\eng C} biblioteke}
\smallskip

Instrukcije za kompajlovanje nakon dodavanja biblioteke date su u nastavku.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=make]{include/00.alati/gcc/gcc2}\srb\end{minipage}\smallskip

Kompajlovanje {\eng GCC}-a sa datim opcijama obezbedjuje nam korish\/c1enje
date biblioteke umesto standardne koju nam je obezbedio operativni sistem
domac1in.

\section{{\eng GRUB}}
\medskip

Izvorni kod softvera se mozhe nac1i na stranici
{\eng\url{https://www.gnu.org/software/grub/}}, zajedno sa uput\/stvom za
kompajlovanje i korish\/c1enje.\\

{\eng GRUB} je {\eng bootloader} koji je korish\/c1en na ovom projektu.

\section{{\eng QEMU}}
\medskip

Vishe informacija o softveru se mozhe nac1i na stranici
{\eng\url{https://www.qemu.org/}}, zajedno sa uput\/stvom za korish\/c1enje.\\

{\eng QEMU} je virtuelna mashina u kojoj c1e jezgro biti testirano i
prikazano zarad praktichnih razloga. {\eng QEMU} je odabran za ovaj projekat
jer za razliku od drugih virtuelnih mashina poseduje {\eng cli (command line
interface)} iz koga se lako mozhe pozivati pomoc1u skripti kao shto su {\eng
Makefile}-ovi.

\section{{\eng Make}}
\medskip

Izvorni kod softvera se mozhe nac1i na stranici
{\eng\url{https://www.gnu.org/software/make/}}
zajedno sa uput\/stvom za kompajlovanje i korish\/c1enje.\\

{\eng Make}\cite{book:78575} nam omoguc1ava da sa lakoc1om odrzhavamo i manipulishemo izvornim
fajlovima. Moguc1e je sve kompajlovati, obrisati, kreirati {\eng iso} fajl kao
i pokrenuti {\eng QEMU} virtuelnu mashinu sa samo jednom kljchnom rechi u
terminalu. Kreirani {\eng Makefile} za potrebe ovog projekta bic1e detaljno
objashnjen u sekciji {\eng Build system}.

\section{Manje bitni alati}
\medskip

\subsection{{\eng NeoVim}}
{\eng NeoVim} je uredjivach teksta nastao od {\eng Vim}-a ({\eng Vi improved})
\cite{book:78583}. Konfiguracijski fajlovi autora, mogu se nac1i na
{\eng\url{https://github.com/aleksav013/nvim}}, i imaju za cilj da stvore
okruzhenje pogodno za rad na ovom projektu.

\subsection{{\eng git}}
\smallskip

Kreator ovog programa je {\eng Linus Torvalds}, chovek koji je kreirao {\eng
Linux} kernel. Izvorni kod softvera se mozhe nac1i na stranici
{\eng\url{https://git.kernel.org/pub/scm/git/git.git}}.\\

{\eng Git} je program koji nam pomazhe da odrzhavamo izvodne fajlove
sinhronizovanim sa repozitorijumom. Osim toga znachajan je i njegov sistem
kontrole verzija - moguc1nost da se za svaku promenu({\eng commit}) vidi
tachno koji su se fajlovi izmenili i koja je razlika izmedju neke dve verzije
projekta.

\subsection{{\eng xorriso (libisoburn)}}
\smallskip

Izvorni kod softvera se mozhe nac1i na stranici
{\eng\url{https://www.gnu.org/software/xorriso/}}
zajedno sa uput\/stvom za kompajlovanje i korish\/c1enje.\\

Sluzhi za kreiranje {\eng ISO} fajlova koji se mogu "narezati" na {\eng CD}
disk ili {\eng USB} flesh i koji se kasnije mogu koristiti kao optichki disk
koji sadrzhi sve shto je neophodno za uspeshno podizanje sistema.

\subsection{{\eng GDB}}
\smallskip

Izvorni kod softvera se mozhe nac1i na stranici
{\eng\url{https://www.sourceware.org/gdb/}}
zajedno sa uput\/stvom za kompajlovanje i korish\/c1enje.\\

{\eng GDB} je {\eng GNU}-ov {\eng debugger} koji sluzhi za pronalazhenje
greshaka u kodu, kao i aktivno prac1enje izvrshavanja programa (u ovom sluchaju
jezgra). Uz pomoc1 ovog programa ustanovljeno je shta svako dugme na tastaturi
vrac1a nakon pritiska shto je znachajno ubzalo proces mapiranja tastature.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Inspiracija}
\bigskip

\section{{\eng Minix}}
\medskip

{\eng Minix} je operativni sistem baziran na {\eng UNIX}-u koji koristi
mikrokernelsku arhitekturu. Pochev od verzije 2.0 zadovoljava {\eng POSIX
(Portable Operating System Interface)} standard. Pochetne verzije {\eng Minix}
operativnog sistema kreirao je Endrju S. Tanenbaum kao profesor Vrije
univerziteta u Amsterdamu. Profesor Tanenbaum kreirao je operativni sistem kao
primer principa koji su prikazani u njegovoj knjizi "Operativni sistemi: Dizajn
i Implementacija" ({\eng Operating Systems: Design and
Implementation})\cite{book:1400099}. Osim ove knjige Tanenbaum napisao je i
mnoge druge koje mogu biti od koristi svima koji zhele da se bave dizajnom
operativnih sistema\cite{book:821745}\cite{book:915673}.
Zanimljiva chinjenica je da je {\eng Minix} najpopularniji operativni sistem
chije jezgro koristi mikrokernelsku arhitekturu.\\

Spekulishe se da svi Intelovi procesori nakon {\eng Core2Duo} serije koji imaju
chip pod nazivom {\eng Intem ME (Intel Managment Engine)}, zapravo pokrec1u
{\eng Minix} operativni sistem. Ovo bi {\eng Minix} uchinilo
najkorish\/c1enijim operativnim sistemom ikada.


\section{{\eng Linux}}
\medskip

Vec1 duzhe od dve godine koristim operativni sistem sa {\eng Linux} jezgrom
shto je bio i glavni razlog zashto sam izabrao rad na ovu temu.
U toku izrade ovog projekta pozheleo sam da bolje razumem kako funkcionishe
izrada {\eng Linux} kernela i kako je to "zajednica" ona koja ga pokrec1e i
odrzhava, a ne neka velika korporacija. Stoga sam odluchio da dam svoj doprinos 
i poslao sam nekoliko zakrpa ({\eng patch}-eva) koji su primljeni i
implemetirani u novoj 5.17 verziji {\eng Linux} kernela. Ovo iskustvo pokazalo
mi je koliko je ozbiljna organizacija koja stoji iza celog tog projekta i
koliko je bitno raditi na svim sferama nekog projekta kao shto su i izrada
dokumentacije i spremnost da se edukuju i zaiteresuju mladi ljudi kojima c1e
ovakvo iskustvo znachiti u daljem profesionalnom usavrshavanju. Drago mi je
shto me je ovaj projekat odvazhio da nachinim taj korak i doprinesem mozhda
najvec1em softverskom projektu ikada.

\section{{\eng BSD}}
\medskip
Najpopularniji {\eng BSD} operativni sistemi su redom {\eng
FreeBSD\cite{book:1310096}, OpenBSD} i {\eng NetBSD}. Svaki od njih ima
razlichite ciljeve ali svi se slazhu u jednom: softver mora ostati minimalan.
Svi ovi operativni sistemi svoje sistemske programe i biblioteke imaju napisano
u duplo ako ne i nekoliko puta manje linija koda nego {\eng GNU/Linux}. To ih chini
mnogo lakshim za odrzhavanje, ali i mnogo sigurnijim.\\

{\eng BSD} oprativni sistemi razlikuju se od {\eng GNU/Linux}-a po tome shto su
kod {\eng BSD}-a jezgro i korisnichki programi celina koje je nastala od
strane jednog tima ljudi i odrzhavaju se uporedo, dok je kod {\eng GNU/Linux}-a
jezgro {\eng Linux}, a {\eng GNU Coreutils} chini korisnichke programe {\eng
(user space)} i njihov razvoj je potpuno nezavisan. Zbog te chinjenice, {\eng
BSD} je mnogo lakshe odrzhavati i mnogo brzhe se mogu implementirati nove ideje
i moguc1nosti, prosto iz razloga shto ne zavisi od druge strane da se pre svega
uskladi, a potom i implementira datu promenu. \\

Takodje osim gore navedenih razlika, josh jedna veoma bitna razlika je to shto
{\eng BSD} koristi {\eng MIT} licencu dok {\eng GNU/Linux} koristi {\eng
GPLv2/GPLv3} licencu. To znachi da za {\eng BSD} sisteme nakon modifikacije ne
moramo uchiniti kod javno dostupnim. Ta chinjenica chini {\eng BSD}
vrlo primamljivim za velike korporacije koje na taj nachin svoja softverska
reshenja mogu bazirati na vec1 postojec1im. Tako na primer mnoge konzole
pokrec1u upravo izmenjenu verziju {\eng FreeBSD}-a, dok sa druge strane imamo i
kompanije poput {\eng Apple}-a koja takodje koristi {\eng FreeBSD}, ali kao
podlogu za svoje operativne sisteme za rachunare i mobilne telefone.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{{\eng Build system}}
\bigskip

Sistem koji kreira {\eng toolchain} koji se koristi za kompajlovanje,
linkovanje i kreiranje upotrebljivog operativnog sistema u {\eng ISO} formatu.
Osim seta alata mozhe se videti i {\eng Makefile} koji pamti na koji se tachno
nachin koristi taj set alata da bi se izgradilo jezgro.

\section{{\eng aleksa-toolchain}}
\medskip

U sklopu ovog projekta nastao je i {\eng aleksa-toolchain}, kao i {\eng
shell}\cite{book:2751214} skripta koja kreira taj {\eng toolchain} (set alata)
koji se dalje koristi za kompajlovanje jezgra.

U tekstu koji sledi mozhe se videti koje sve funkcije skripta sadrzhi.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=sh,linerange={131-140}]{include/00.build/setup.sh}\srb\end{minipage}\smallskip

Skripta prvo skida izvorni kod {\eng binutils}-a i {\eng GCC}-a, ekstraktuje iz
arhive, a zatim je {\eng patch}-uje (primenjuje skup izmena). Nakon toga
korish\/c1enjem {\eng GCC} kompajlera na {\eng host} sistemu, kompajluje se
poseban {\eng GCC} kompajler koji sluzhi za kompajlovanje izvornog koda
namenjenog jezgru ovog operativnog sistema. Nakon toga on se instalira na
put {\eng /opt/aleksa/usr/bin/} gde se nalazi novi {\eng SYSROOT} koji koristi
{\eng Makefile}.

\section{{\eng Makefile}}
\medskip

{\eng Makefile} je fajl koji kontrolishe ponashanje {\eng make} komande u
terminalu. Svaki {\eng Makefile} sadrzhi neki set pravila koji definishe proces
koji se pokrec1e ukucavanjem komande {\eng make $<$ime\_pravila$>$}. U tekstu
koji sledi mozhe se videti koji je to set pravila koje su definisani za ovaj
projekat.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=make,linerange={70-98}]{include/00.build/Makefile}\srb\end{minipage}\smallskip

Mozhemo videti da je ovo kompleksnija forma {\eng Makefile}-a jer sadrzhi
proces rekurzivnog pozivanja {\eng \$(MAKE)} komande. To znachi da ovaj
projekat sadrzhi vishe razlichitih {\eng Makefile}-ova za svaki deo projekta,
shto je i standardna procedura pri velikim projektima kao shto je ovaj.
Konkretno kod ovog jezgra postoje josh dva {\eng Makefile}-a, a tichu se koda
napisanog u {\eng C}-u, kao i koda napisanog u {\eng GNU Assembler}-u za {\eng
X86} arhitekturu.\\

Na taj nachin bi sa lakoc1om projekat mogao biti proshiren na vishe razlichitih
arhitektura procesora shto je i autorov plan u buduc1nosti. Biblioteke,
interaktivni {\eng shell}, kao i drajver za tastaturu napisan za ovo jezgo se
ne bi menjali, dok bi zbog specifichnosti druge arhitekture bile promenjene
komponente zaduzhene za pochetnu inicijalizaciju i kontolisanje hardvera na
najnizhem nivou.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Jezgro operativnog sistema}
\bigskip

Rad je prvobitno bio zamishljen kao postupno izlaganje nastajanja ovog
operativnog sistema, ali se kasnije autor odluchio da ipak izlozhi samo
trenutnu verziju rada, s obrzirom na to da bi rad bio nepotrebno duzhi.
Jezgro je, kao shto je vec1 recheno napisano u asembleru i {\eng C} programskom
jeziku\cite{book:441007}\cite{book:690930}.

\section{Pochetak}
\medskip
%{\eng\url{https://wiki.osdev.org/Bare_Bones}}

{\eng as/boot.s}:\\

U prvom delu postavljamo promenljive na vrednosti koje su odredjene {\eng
Multiboot2} standardom da bi {\eng bootloader} prepoznao nashe jezgro.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot1.s}\srb\end{minipage}\smallskip

Nakon toga postavljamo prvih 512 bajtova na prethodno pomenute vrednosti ali
tako da za svaku promenljivu ostavljamo 32 bita prostora.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot2.s}\srb\end{minipage}\smallskip

Postavljamo promenljive koje chuvaju adrese na kojima pochinju segmenti koda i
podataka, redom.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot3.s}\srb\end{minipage}\smallskip

Definishemo sekciju {\eng bss} u kojoj kreiramo stek i dodeljujemo mu 16
kilobajta.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot4.s}\srb\end{minipage}\smallskip

Definishemo pochetnu funkciju {\eng \_start} pozivajuc1i funkciju za
inicijalizaciju {\eng gdt} tabele i "skachemo" na segment koda. Ovaj postupak
ima naziv {\eng "far jump"} jer skachemo van tekuc1eg segmenta.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot5.s}\srb\end{minipage}\smallskip

U segmentu koda postavljamo segmentne registre na adresu segmenta podataka.
Zatim postavljamo {\eng esp} registar na pochetak steka koji smo
inicijalizovali u {\eng bss} sekciji i predajemo upravljanje {\eng
kernel\_main} funkciji.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot6.s}\srb\end{minipage}\smallskip

Postavljamo velichinu funkcije {\eng \_start} shto nam kasnije mozhe biti
korisno pri {\eng debug}-ovanju.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot7.s}\srb\end{minipage}\smallskip


\section{Ispis na ekran - {\eng VGA}}
\medskip

{\eng c/vga.c}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga1.c}\srb\end{minipage}\smallskip

Primetimo da u {\eng C}-u koristimo {\eng uintX\_t} promenljive. To je zbog
toga shto nam je u ovakvom okruzhenju vrlo bitno da pazimo na velichinu koju
zauzimaju promenljive.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga2.c}\srb\end{minipage}\smallskip

4 znachajnija bita oznachavaju boju pozadine, dok ostala 4 bita oznachavaju
boju karaktera.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga3.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga4.c}\srb\end{minipage}\smallskip

Na {\eng VGA} izlaz ispisujemo karaktere tako shto pochev od adrese {\eng
0xB80000} pishemo shesnaestobitne vrednosti koje se prevode u karaktere i
njihovu boju. 8 znachajnijih bitova odredjuju boju karaktera dok preostalih 8
bitova oznachavaju karakter.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga5.c}\srb\end{minipage}\smallskip

Funkcija koja ispisuje odredjeni karakter na ekranu.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga6.c}\srb\end{minipage}\smallskip

Funkcija koja pomera sve do sada ispisano za jedan red na gore i oslobadja novi
red za ispis kada ponestane mesta na ekranu.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga7.c}\srb\end{minipage}\smallskip

Funkcija koja postavlja brojache kolone i reda na sledec1e, uglavnom prazno,
polje na ekranu.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga8.c}\srb\end{minipage}\smallskip

Funkcija koja postavlja brojache kolone i reda na prethodno polje na ekranu i
koristi se prilikom brisanja prethodno ispisanih karaktera.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga9.c}\srb\end{minipage}\smallskip

Funkcija koja ispisuje jedan karakter na ekranu. Funkcija proverava da li je
potrebno ispisati novi red umesto karaktera {\eng '$\backslash$n'}, kao i da li
je potrebno osloboditi novi red ukoliko se ekran popunio.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga10.c}\srb\end{minipage}\smallskip

Funkcija koja ispisuje niz karaktera na ekran.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga11.c}\srb\end{minipage}\smallskip

Funkcija koja ispisuje celobrojnu vrednost na ekran tako shto je prvo pretvori u
niz karaktera a zatim iskoristi prethodnu funkciju.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga12.c}\srb\end{minipage}\smallskip

Funkcija koja ispisuje realnan broj na ekran tako shto je prvo pretvori u niz
karaktera a zatim iskoristi funkciju za ispis niza karaktera.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga13.c}\srb\end{minipage}\smallskip

Funkcija koja brishe sve do sada ispisane karaktere sa ekrana i postavlja
brojache kolone i reda na pochetnu poziciju.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga14.c}\srb\end{minipage}\smallskip


\section{{\eng Global Desctiptor Table}}
\medskip

Globalna tabela deskriptora je struktura u kojoj se chuvaju informacije o
segmentima memorije.\\

{\eng include/source/gdt.h}:

Koristimo {\eng \#ifndef} i {\eng \#define} direktive da bi se osigurali da se
ovaj fajl ukljuchuje ({\eng include}-uje) samo jednom u toku celog rada
operativnog sistema. Ove direktive deluju kao osigurach koji preskache sve
deklaracije ukoliko su one vec1 definisane pod tim imenom.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt1.h}\srb\end{minipage}\smallskip

Autor je kreirao biblioteku {\eng types.h} da bi od\/jednom dodao sve
kompajlerske biblioteke koje definishu vrste promenljivih kao shto su
{\eng int, uint16\_t, bool,...}, kao i konstante kao shto su {\eng true, false,
UINT16\_MAX...}.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt2.h}\srb\end{minipage}\smallskip

Format u kom rachunar prihvata unos pojedinachnih definicija segmenata.
Primetimo {\eng \_\_attribute\_\_((packed))}, na kraju definicije strukture. To
nam oznachava da se nec1e ostavljati mesta u memoriji izmedju promenljivih
unutar strukture, vec1 c1e se "pakovati" jedna do druge u memoriji.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt3.h}\srb\end{minipage}\smallskip

Format koji rachunar prihvata za tabelu svih definicija segmenata memorije.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt4.h}\srb\end{minipage}\smallskip

Funkcije koje su definisane u {\eng c/gdt.c}, a tichu se inicijalizacije
globalne tabele deskriptora.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt5.h}\srb\end{minipage}\smallskip

Direktiva za zatvaranje koja se nalazi na kraju fajla i kojom se zavrshava
segment koda predvidjen za deklaracije.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt6.h}\srb\end{minipage}\smallskip

{\eng c/gdt.c}:\\

U {\eng source/} folderu se nalaze prototipi za funkcije istoimenog {\eng C}
izvornog fajla.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt1.c}\srb\end{minipage}\smallskip

Funkcija napisana u {\eng Assembler}-u koja uchitava tabelu deskriptora u
\text predvidjeni registar.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt2.c}\srb\end{minipage}\smallskip

Tabela segmenata i pokazivach na nju koji se prosledjuje prethodno pomenutoj 
funkciji.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt3.c}\srb\end{minipage}\smallskip

Funkcija koja na osnovu parameta inicijalizuje jedan globalni segment memorije.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt4.c}\srb\end{minipage}\smallskip

Glavna funkcija koja postavlja velichinu pokazivacha koji se prosledjuje,

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt5.c}\srb\end{minipage}\smallskip

inicijalizuje sve segmente memorije koji c1e se koristiti,

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt6.c}\srb\end{minipage}\smallskip

kao i poziva fukciju kojoj prosledjuje pokazivach na globalnu tabelu segmenata
memorije.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt7.c}\srb\end{minipage}\smallskip


%{\eng\url{https://wiki.osdev.org/GDT}}

\section{{\eng Interrupt Desctiptor Table}}
\medskip

Globalna tabela prekida je struktura koja nam govori koja funkcija zapravo
reaguje kada procesor dobije zahtev za prekid ({\eng interrupt request}). Tada
procesor pauzira ono shto trenutno radi i predaje upravljenje odredjenoj funkciji.\\

Funkcija je duzhna da dojavi procesoru da je c1e ona preuzeti ({\eng
handle}-ovati) taj prekid i ukoliko je prekid fatalan (deljenje nulom, {\eng
triple fault},...) funkcija ima zadatak da ukloni novonastali problem i obezbedi
operativnom sistemu oporavak od greshke.\\

{\eng include/source/idt.h}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt1.h}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt2.h}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt3.h}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt4.h}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt5.h}\srb\end{minipage}\smallskip

Struktura u kojoj rachunar prihvata globalnu tabelu prekida.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt6.h}\srb\end{minipage}\smallskip

Pokazivach na tabelu prekida koja se prosledjuje funkciji napisanoj u {\eng
Assembler}-u, a koja uchitava tabelu prekida u odgovarajuc1i registar.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt7.h}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt8.h}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt9.h}\srb\end{minipage}\smallskip

%{\eng\url{https://wiki.osdev.org/IDT}}

\section{{\eng IRQ} i {\eng PIC}}
\medskip
{\eng c/idt.c}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/05.irq/idt1.c}\srb\end{minipage}\smallskip

Asemblerska funkcija koja uchitava pokazivach na tabelu prekida u
predvidjeni registar.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/05.irq/idt2.c}\srb\end{minipage}\smallskip

Tabela segmenata i pokazivach na nju koji se prosledjuje prethodno pomenutoj
funkciji.

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/05.irq/idt3.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/05.irq/idt4.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/05.irq/idt5.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/05.irq/idt6.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C,linerange={1-6,34-37}]{include/05.irq/idt7.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/05.irq/idt8.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/05.irq/idt9.c}\srb\end{minipage}\smallskip


%{\eng\url{https://wiki.osdev.org/IRQ}}
%{\eng\url{https://wiki.osdev.org/PIC}}

\section{Tastatura}
\medskip

{\eng c/keyboard.c}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard1.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard2.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard3.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard4.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard5.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard6.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard7.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard8.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard9.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard10.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard11.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard12.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard13.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard14.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard15.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard16.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard17.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard18.c}\srb\end{minipage}\smallskip

\section{{\eng PIT - Programmable Interval Timer}}
\medskip

{\eng c/timer.c}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/timer1.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/timer2.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/timer3.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/timer4.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/timer5.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/timer6.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/timer7.c}\srb\end{minipage}\smallskip

%{\eng\url{https://wiki.osdev.org/PIT}}

\section{{\eng Heap}}
\medskip

{\eng Heap} za ovo jezgro kotisti algoritam\cite{book:1412} bitmape da bi na
najefikasniji nachin chuvalo podatke o trenutno korishc1enim blokovima. Hip nam
sluzhi da bismo dinamichki alocirali memoriju, tj. da bismo mogli da
koristimo globalne promenljive, kao i promenljive chiji zhivotni vek mora biti
dugotrajniji od funkcije u kojoj je ta promenljiva nastala.\\

{\eng c/heap.c}:


\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap1.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap2.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap3.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap4.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap5.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap6.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap7.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap8.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap9.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap10.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap11.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap12.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap13.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap14.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap15.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap16.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap17.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap18.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap19.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap20.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap21.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap22.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap23.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap24.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap25.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap26.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap27.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap28.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap29.c}\srb\end{minipage}\smallskip

%{\eng\url{https://wiki.osdev.org/Heap}}

\section{{\eng Paging}}
\medskip

{\eng c/paging.c}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging1.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging2.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging3.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging4.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging5.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging6.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging7.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging8.c}\srb\end{minipage}\smallskip

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging9.c}\srb\end{minipage}\smallskip

%{\eng\url{https://wiki.osdev.org/Paging}}

\section{Minimalna \eng{C} biblioteka}
\medskip
%{\eng\url{https://wiki.osdev.org/Creating_a_C_Library}}
%
%{\eng include/asm.h}:
%
%\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/10.libc/asm.h}\srb\end{minipage}\smallskip

{\eng include/errno.h}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/10.libc/errno.h}\srb\end{minipage}\smallskip

{\eng include/stdio.h}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/10.libc/stdio.h}\srb\end{minipage}\smallskip

{\eng include/stdlib.h}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/10.libc/stdlib.h}\srb\end{minipage}\smallskip

{\eng include/string.h}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/10.libc/string.h}\srb\end{minipage}\smallskip

{\eng include/time.h}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/10.libc/time.h}\srb\end{minipage}\smallskip

{\eng include/unistd.h}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/10.libc/unistd.h}\srb\end{minipage}\smallskip

{\eng include/sys/types.h}:

\medskip\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/10.libc/sys/types.h}\srb\end{minipage}\smallskip



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Zakljuchak}
Ovaj projekat je bio sjajan pokazatelj koliko je zapravo kompleksna izrada
jezgra operativnog sistema koji treba da predstavlja most izmedju hardvera i
softvera. Drago mi je shto sam odabrao ovako tezhak projekat za maturski rad iz
razloga shto mi je to pomoglo da probijem barijeru i ulozhim puno truda da bih
zapravo razumeo kako rade operativni sistemi i koliko je sofisticiran njihov
dizajn.

\thispagestyle{empty}
\mbox{}
\clearpage

\nocite{*}
\printbibliography[heading=bibintoc,title={Literatura}]

\end{document}
