\documentclass[a4paper,fleqn,12pt]{JMThesis}
\usepackage{listings}
\lstset{
    language=make,
    basicstyle=\footnotesize,
    frame=single,
    showstringspaces=false,
    tabsize=8,
    escapeinside={<@}{@>},
}

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

\newlength\tindent
\setlength{\tindent}{\parindent}
\setlength{\parindent}{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}}.
Sav kod je dostupan pod {\eng GPLv3} licencom.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Teorija}
\bigskip

\section{{\eng X86} arhitektura}
\medskip
{\eng X86} arhitektura je probitno bila 8bitna (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.

\subsection{Registri procesora}
\smallskip
Postoji vishe vrsta registara procesora:
16bitni registri opshte namene: {\eng ax,bx,cx,dx}.

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

\subsection{{\eng 32bit i686}}
\smallskip
32bitni registri opshte namene: {\eng eax,ebx,ecx,edx}.
64bitni registri opshte namene: {\eng rax,rbx,rcx,rdx}.

\subsection{{\eng Real mode}}
\smallskip
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}}

\subsection{Segmentacija}
\smallskip
Segmentacija je reshenje kojim se omoguc1ava adresiranje vishe memorije nego
shto je to hardverski predvidjeno.

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

\subsection{{\eng Protected mode}}
\smallskip
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}}

\section{Redosled pokretanja}
\smallskip
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 (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}}

\subsection{{\eng Bootloader}}
\smallskip
{\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 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
daljem tekstu.

\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 paket sadrzhi programe neophodne za kompajlovanje kao shto su asembler i linker.

\subsection{Pre dodavanja {\eng LIBC}}
\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[]{include/binutils/binutils1}\srb\end{minipage}
\subsection{Posle dodavanja {\eng LIBC}}
\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[]{include/binutils/exportsysroot}\srb\end{minipage}

Instukcije za kompajlovanje date su u nastavku:

\begin{minipage}{\textwidth}\eng\lstinputlisting[]{include/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, ipak sam izabrao {\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("spajanje") svog komapjlovanog koda
u jednu binarnu datoteku 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[]{include/gcc/gcc1}\srb\end{minipage}
\subsection{Posle dodavanja {\eng LIBC}}
\smallskip
\begin{minipage}{\textwidth}\eng\lstinputlisting[]{include/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 mojim {\eng bootloader}-om, i da
se kompletan kod bude moj.

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

{\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 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 i 

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


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

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

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip

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

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip

\section{{\eng LIBC} pochetak}
\medskip

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip

\section{Globalni konstruktori, zashtita steka}
\medskip
{\eng\url{https://wiki.osdev.org/Calling_Global_Constructors}}

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

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip

\section{{\eng Global Desctiptor Table}}
\medskip
{\eng\url{https://wiki.osdev.org/GDT}}

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip

\section{{\eng Interrupt Desctiptor Table}}
\medskip
{\eng\url{https://wiki.osdev.org/IDT}}

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip

\section{{\eng IRQ} i {\eng PIC}}
\medskip
{\eng\url{https://wiki.osdev.org/IRQ}}
{\eng\url{https://wiki.osdev.org/PIC}}

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip

\section{Tastatura}
\medskip

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip

\section{{\eng PIT - Programmable Interval Timer}}
\medskip
{\eng\url{https://wiki.osdev.org/PIT}}

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip

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

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip

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

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip

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

\subsection{Teorija}
\smallskip
\subsection{Implementacija}
\smallskip


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Zakljuchak}
Ovaj projekat je bio sjajna prilika da testiram granice svog znanja.

\thispagestyle{empty}
\mbox{}
\clearpage

\renewcommand\bibname{Literatura}
\begin{thebibliography}{}
\vspace*{15mm}
\rm
\bibitem{} {\eng\url{https://wiki.osdev.org/Expanded_Main_Page}}
\bibitem{} {\eng\url{http://jamesmolloy.co.uk/tutorial_html/}}
\end{thebibliography}
\addcontentsline{toc}{chapter}{Literatura}


\end{document}
