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