aboutsummaryrefslogtreecommitdiff
path: root/kernel.tex
blob: 402ab92ae65bcd89918b69324d0a57512a725880 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
\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}
\usepackage[
    backend=bibtex,
    natbib=true,
    style=numeric,
    block=ragged,
    sorting=none
]{biblatex}
\bibliography{kernel}
\renewcommand*{\bibfont}{\eng}
\nocite{*}

\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
%\cite{book:1412}
%\cite{book:2759472}
%\cite{book:1309309}
%\cite{book:917849}
%\cite{book:2535395}
%\cite{book:915673}
%\cite{book:2560474}
%\cite{book:821745}
%\cite{book:924556}
%\cite{book:748936}
%\cite{book:2398655}
%\cite{book:658757}
%\cite{book:1400099}
%\cite{book:1310096}
%\cite{book:441007}
%\cite{book:690930}
%\cite{book:2751214}
%\cite{book:78583}
%\cite{book:78575}
%\cite{book:1505234}
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

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


\end{document}