\documentclass[a4paper,fleqn,12pt]{JMThesis}
\usepackage{listings}
\lstset{
    basicstyle=\footnotesize,
    frame=single,
    showstringspaces=false,
    tabsize=8,
    escapeinside={<@}{@>},
}
\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 Izrada \textbf{\eng\Large X86 32bit i686} jezgra operativnog sistema}
\end{center}

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


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

\vfill
\begin{center}
{\imen Beograd, jun 2021.}
\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 prozishla 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 projakat 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 projakat 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} arhitektura je probitno bila osmobitna (sadrzhala je registre duzhine 8
bitova), 16bitna, zatim 32bitna i na kraju 64bitna. Danas 64bitnu {\eng X86}
arhitekturu znamo kao i {\eng{} AMD64}, {\eng X86-64} ili {\eng X86\_64}.\\

Zajedno sa {\eng ARM}-om jedna od najkorish\/c1enijih arhitektura danashnjice.

\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 sto 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 vec1a ili jednaka duzhini registra chiju notaciju
koristimo.\\

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 16bit-ne {\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 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 64bitnoj {\eng X86}
arhitekturi, do nje mozhemo doc1i na 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 aritmeticke operacije
\item Operandi za adresne kalkulacije
\item Pokazivace na memorijsku lokaciju
\end{itemize}

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 16bitne 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 je stanje procesora u kojem nam je dozvoljeno adresiranje samo prvih
20mb memorije. Prelazak iz realnog u zasticeni mod postizhe se dalekim skokom
{\eng "far jump"}.

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

\section{Segmentacija}
\medskip

Segmentacija je reshenje kojim se omoguc1ava adresiranje vishe memorije nego
shto je to hardverski predvidjeno.

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

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

Zashtic1en mod je stanje procesora u kojem procesor ima pun pristup celom opsegu
memorije za razliku od realnog moda.

%{\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)} koji je jedna od pochetnih faza {\eng BIOS}-a {\eng
(Basic Input Output System)}. U {\eng POST}-u rachunar pokushava da
incijalizuje komponente rachunarskog sistema 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 512bitova medijuma, i
njegov zadatak je da uchita jezgro operativnog sistema u ram memoriju i preda
mu dalje upravljanje.

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

\section{{\eng Multiboot2}}
\medskip

\section{{\eng ELF}}
\medskip

{\eng ELF} je format binarni fajl koji se sastoji od tachno odredjenih sekcija
i koji mozhe da se pokrene.

%{\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. Svi korish\/c1eni alati poseduju {\eng GPLv2} ili {\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 program sa liste koji nije {\eng GNU}-ov je {\eng QEMU} virtualna
mashina.\\

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. Jedini programi koji su morali biti 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). 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
najkorisheniji 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
specificno 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 dat je deo instrukcija koji se razlikuje
od uput\/stva datog na zvanichnom sajtu a tiche se konfigurisanja pre kompilacije.\\

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

\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 gde se biblioteka nalazi.
To je moguc1e uraditi na sledec1i nachin:\\

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

Instukcije za kompajlovanje date su u nastavku:

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

\subsection{{\eng GNU Asembler}}
\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 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/}}.\\

Ovaj program je korish\/c1en za kompajlovanje dela koda napisanog u asembleru.

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

Ovaj program je korish\/c1en za linkovanje, tj. "spajanje" svog komapjlovanog koda
u jednu binarnu datoteku tipa {\eng ELF} koja predstavlja 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.


{\eng\url{https://aur.archlinux.org/packages/i686-elf-gcc/}}

{\eng GCC} je {\eng GNU}-ov set kompajlera.

\subsection{Pre dodavanja {\eng LIBC}}
\smallskip

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

\subsection{Posle dodavanja {\eng LIBC}}

\smallskip

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

\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. Plan je
da u buduc1nosti {\eng GRUB} bude zamenjen sa {\eng bootloader}-om izradjenim
specificno za ovaj operativni sistem i da sve komponente ovog operativnog
sistema na taj nachin budu delo jednog autora.

\section{{\eng QEMU}}
\medskip

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

{\eng QEMU} je virtualna mashina u kojoj c1e jezgro biti testirano i
prikazano zarad praktichnih razloga. {\eng QEMU} je odabran za ovaj projekat
jer za razliku od drugih virutalnih mashina poseduje {\eng cli (command line
interface)} iz koga se lako mozhe pozivati iz 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.
\cite{book:78575}.

{\eng Make} 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
objasnjen u daljem tekstu.

\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
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 repozitorijimom. Osim toga znachajan je i njegov sistem
"kontrole" verzija - moguc1nost da se za svaki {\eng commit}(promenu) vidi
tachno koji su se fajlovi izmenili i koja je razlika izmedju neke dve verzije
projekta.

\subsection{{\eng xorriso(libisoburn)}}
\smallskip
{\eng\url{https://www.gnu.org/software/xorriso/}}

Sluzhi za kreiranje {\eng ISO} fajlova koji se mogu "narezati" na  {\eng CD}
ili {\eng USB} flesh sa kojih se kasnije dizhe sistem.

\subsection{{\eng GDB}}
\smallskip
{\eng\url{https://www.sourceware.org/gdb/}}

{\eng GNU}-ov {\eng debugger} koji sluzhi uglavnom za pronalazhenje greshaka u
kodu.


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

\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.

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

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

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

Postavljamo funkcije koje cemo definisati u ovom fajlu za globalne da bi smo
kasnije mogli da ih pozivamo iz {\eng C}-a.

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

Funkcija za uchitavanje {\eng gdt} tabele.

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

Funkcija za uchitavanje {\eng idt} tabele.

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

Funkcije koje su zaduzene za razmenu informacija preko magistrale za
ulaz/izlaz. Koristi se pri inicijalizaciji {\eng IRQ}-a i korish\/c1enju
tastature.

\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo6}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo7}\srb\end{minipage}

Segmenti za kod i podatke koji su postavljeni u {\eng gdt} tabeli.

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

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

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

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.

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

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.

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

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

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



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

{\eng c/vga.c}:

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

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.

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

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

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

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

Na {\eng VGA} izlaz ispisujemo 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.

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

Funkcija koja ispisuje karakter na monitoru.

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

Fukcija koja pomera sve do sada ispisano za jedan red na dole i oslobadja novi
red kada ponestane mesta na ekranu.

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

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

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

Funkfija koja postavlja brojache kolone i reda na proshlo polje na ekranu.

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

Funkcija koja ispisuje jedan karakter na ekran. 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.

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

Funkcija koja ispisuje niz karaktera na ekran.

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

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

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

Funcija koja ispisuje realnu vrednost na ekran tako shto je prvo pretvori u niz
karaktera a zatim iskoristi funkciju za ispis niza karaktera.

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

Funkcija koja brishe sve sa ekrana i postavlja brojache kolone i reda na pochetnu poziciju.

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


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

{\eng c/gdt.c}:

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

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

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

Format koji rachunar prihvata za tabelu svih definicija segmenata.

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

Funcija iz asemblera koja uchitava tabelu segmenata, kreiranu u sledec1ih
nekoliko funcija, u odgovarajuc1i registar. Ovu funciju smo imali priliku
videti u pochetnom fajlu.

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


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


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


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


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


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

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

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

{\eng c/idt.c}:

\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo1}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo2}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo3}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo4}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo5}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo6}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo7}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo8}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo9}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo10}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo11}\srb\end{minipage}

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

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

\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo12}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo13}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo14}\srb\end{minipage}


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

\section{Tastatura}
\medskip

{\eng c/keyboard.c}:

\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo1}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo2}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo3}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo4}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo5}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo6}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo7}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo8}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo9}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo10}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo11}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo12}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo13}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo14}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo15}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo16}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo17}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo18}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo19}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo20}\srb\end{minipage}

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

{\eng c/timer.c}:

\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo1}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo2}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo3}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo4}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo5}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo6}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo7}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo8}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo9}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo10}\srb\end{minipage}
%{\eng\url{https://wiki.osdev.org/PIT}}

\section{{\eng Heap}}
\medskip

{\eng c/heap.c}:

\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo1}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo2}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo3}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo4}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo5}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo6}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo7}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo8}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo9}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo10}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo11}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo12}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo13}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo14}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo15}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo16}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo17}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo18}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo19}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo20}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo21}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo22}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo23}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo24}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo25}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo26}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo27}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo28}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo29}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo30}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo31}\srb\end{minipage}
%{\eng\url{https://wiki.osdev.org/Heap}}

\section{{\eng Paging}}
\medskip

{\eng c/paging.c}:

\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo1}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo2}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo3}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo4}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo5}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo6}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo7}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo8}\srb\end{minipage}
\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo9}\srb\end{minipage}

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

\section{Moj {\eng LIBC}}
\medskip
%{\eng\url{https://wiki.osdev.org/Creating_a_C_Library}}

{\eng include/asm.h}:

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

{\eng include/errno.h}:

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

{\eng include/heap.h}:

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

{\eng include/irq.h}:

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

{\eng include/stdio.h}:

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

{\eng include/stdlib.h}:

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

{\eng include/string.h}:

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

{\eng include/time.h}:

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

{\eng include/types.h}:

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

{\eng include/unistd.h}:

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

{\eng include/vga.h}:

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

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

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



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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}
