From c0afee36ea5b3cc7e613ee4021b9a91a3c6f39a4 Mon Sep 17 00:00:00 2001
From: Aleksa Vučković <aleksav013@gmail.com>
Date: Fri, 31 Dec 2021 14:59:29 +0100
Subject: Initial commit

---
 kernel.tex | 480 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 480 insertions(+)
 create mode 100644 kernel.tex

(limited to 'kernel.tex')

diff --git a/kernel.tex b/kernel.tex
new file mode 100644
index 0000000..d9d52ba
--- /dev/null
+++ b/kernel.tex
@@ -0,0 +1,480 @@
+\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}
-- 
cgit v1.2.3

