aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile13
-rw-r--r--include/00.alati/binutils/binutils1 (renamed from include/binutils/binutils1)0
-rw-r--r--include/00.alati/binutils/binutils2 (renamed from include/binutils/binutils2)0
-rw-r--r--include/00.alati/binutils/exportsysroot (renamed from include/binutils/exportsysroot)0
-rw-r--r--include/00.alati/gcc/gcc1 (renamed from include/gcc/gcc1)0
-rw-r--r--include/00.alati/gcc/gcc2 (renamed from include/gcc/gcc2)0
-rw-r--r--include/01.pocetak/boot00.s5
-rw-r--r--include/01.pocetak/boot01.s5
-rw-r--r--include/01.pocetak/boot02.s5
-rw-r--r--include/01.pocetak/boot03.s11
-rw-r--r--include/02.vga/vga00.c4
-rw-r--r--include/02.vga/vga01.c4
-rw-r--r--include/02.vga/vga02.c4
-rw-r--r--include/02.vga/vga03.c4
-rw-r--r--include/02.vga/vga04.c15
-rw-r--r--include/02.vga/vga05.c5
-rw-r--r--include/02.vga/vga06.c5
-rw-r--r--include/02.vga/vga07.c4
-rw-r--r--include/02.vga/vga08.c5
-rw-r--r--include/02.vga/vga09.c10
-rw-r--r--include/02.vga/vga10.c4
-rw-r--r--include/02.vga/vga11.c6
-rw-r--r--include/03.gdt/gdt00.c1
-rw-r--r--include/03.gdt/gdt01.c9
-rw-r--r--include/03.gdt/gdt02.c5
-rw-r--r--include/03.gdt/gdt03.c3
-rw-r--r--include/03.gdt/gdt04.c9
-rw-r--r--include/03.gdt/gdt05.c13
-rw-r--r--include/04.idt/idt00.c3
-rw-r--r--include/04.idt/idt01.c7
-rw-r--r--include/04.idt/idt02.c8
-rw-r--r--include/04.idt/idt03.c5
-rw-r--r--include/04.idt/idt04.c4
-rw-r--r--include/04.idt/idt05.c8
-rw-r--r--include/04.idt/idt06.c4
-rw-r--r--include/05.irq/idt07.c15
-rw-r--r--include/05.irq/idt08.c44
-rw-r--r--include/06.keyboard/keyboard00.c3
-rw-r--r--include/06.keyboard/keyboard01.c7
-rw-r--r--include/06.keyboard/keyboard02.c7
-rw-r--r--include/06.keyboard/keyboard03.c6
-rw-r--r--include/06.keyboard/keyboard04.c6
-rw-r--r--include/06.keyboard/keyboard05.c5
-rw-r--r--include/06.keyboard/keyboard06.c6
-rw-r--r--include/06.keyboard/keyboard07.c8
-rw-r--r--include/06.keyboard/keyboard08.c18
-rw-r--r--include/06.keyboard/keyboard09.c5
-rw-r--r--include/06.keyboard/keyboard10.c11
-rw-r--r--include/06.keyboard/keyboard11.c11
-rw-r--r--include/06.keyboard/keyboard12.c48
-rw-r--r--include/07.pit/pit00.c3
-rw-r--r--include/07.pit/pit01.c5
-rw-r--r--include/07.pit/pit02.c13
-rw-r--r--include/07.pit/pit03.c20
-rw-r--r--include/08.heap/heap00.c1
-rw-r--r--include/08.heap/heap01.c7
-rw-r--r--include/08.heap/heap02.c3
-rw-r--r--include/08.heap/heap03.c3
-rw-r--r--include/08.heap/heap04.c33
-rw-r--r--include/08.heap/heap05.c5
-rw-r--r--include/08.heap/heap06.c58
-rw-r--r--include/08.heap/heap07.c32
-rw-r--r--include/08.heap/heap08.c9
-rw-r--r--include/08.heap/heap09.c9
-rw-r--r--include/09.paging/paging00.c1
-rw-r--r--include/09.paging/paging01.c3
-rw-r--r--include/09.paging/paging02.c12
-rw-r--r--include/09.paging/paging03.c1
-rw-r--r--include/09.paging/paging04.c15
-rw-r--r--include/09.paging/paging05.c7
-rw-r--r--include/10.libc/asm.h9
-rw-r--r--include/10.libc/errno.h0
-rw-r--r--include/10.libc/heap.h11
-rw-r--r--include/10.libc/irq.h39
-rw-r--r--include/10.libc/stdio.h28
-rw-r--r--include/10.libc/stdlib.h15
-rw-r--r--include/10.libc/string.h26
-rw-r--r--include/10.libc/sys/types.h4
-rw-r--r--include/10.libc/time.h0
-rw-r--r--include/10.libc/types.h8
-rw-r--r--include/10.libc/unistd.h14
-rw-r--r--include/10.libc/vga.h29
-rw-r--r--kernel.bib9
-rw-r--r--kernel.pdfbin264012 -> 435170 bytes
-rw-r--r--kernel.tex461
85 files changed, 1139 insertions, 142 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..e623549
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,13 @@
+NAME=kernel
+TEX_FILE=$(NAME).tex
+BIB_FILE=$(NAME).bib
+PDF_FILE=$(NAME).pdf
+
+.PHONY: all
+
+all: $(PDF_FILE)
+
+$(PDF_FILE): $(TEX_FILE) $(BIB_FILE)
+ pdflatex $(TEX_FILE)
+ bibtex $(NAME)
+ pdflatex $(TEX_FILE)
diff --git a/include/binutils/binutils1 b/include/00.alati/binutils/binutils1
index d24267d..d24267d 100644
--- a/include/binutils/binutils1
+++ b/include/00.alati/binutils/binutils1
diff --git a/include/binutils/binutils2 b/include/00.alati/binutils/binutils2
index d99af99..d99af99 100644
--- a/include/binutils/binutils2
+++ b/include/00.alati/binutils/binutils2
diff --git a/include/binutils/exportsysroot b/include/00.alati/binutils/exportsysroot
index 5d61861..5d61861 100644
--- a/include/binutils/exportsysroot
+++ b/include/00.alati/binutils/exportsysroot
diff --git a/include/gcc/gcc1 b/include/00.alati/gcc/gcc1
index c555f2c..c555f2c 100644
--- a/include/gcc/gcc1
+++ b/include/00.alati/gcc/gcc1
diff --git a/include/gcc/gcc2 b/include/00.alati/gcc/gcc2
index d406f6c..d406f6c 100644
--- a/include/gcc/gcc2
+++ b/include/00.alati/gcc/gcc2
diff --git a/include/01.pocetak/boot00.s b/include/01.pocetak/boot00.s
new file mode 100644
index 0000000..0e1bfbe
--- /dev/null
+++ b/include/01.pocetak/boot00.s
@@ -0,0 +1,5 @@
+.set ALIGN, 1<<0
+.set MEMINFO, 1<<1
+.set FLAGS, ALIGN | MEMINFO
+.set MAGIC, 0x1BADB002
+.set CHECKSUM, -(MAGIC + FLAGS)
diff --git a/include/01.pocetak/boot01.s b/include/01.pocetak/boot01.s
new file mode 100644
index 0000000..cd7b353
--- /dev/null
+++ b/include/01.pocetak/boot01.s
@@ -0,0 +1,5 @@
+.section .multiboot
+.align 4
+.long MAGIC
+.long FLAGS
+.long CHECKSUM
diff --git a/include/01.pocetak/boot02.s b/include/01.pocetak/boot02.s
new file mode 100644
index 0000000..a9280a6
--- /dev/null
+++ b/include/01.pocetak/boot02.s
@@ -0,0 +1,5 @@
+.section .bss
+.align 16
+stack_bottom:
+.skip 16384
+stack_top:
diff --git a/include/01.pocetak/boot03.s b/include/01.pocetak/boot03.s
new file mode 100644
index 0000000..46a4e7f
--- /dev/null
+++ b/include/01.pocetak/boot03.s
@@ -0,0 +1,11 @@
+.section .text
+.global _start
+.type _start, @function
+_start:
+ mov $stack_top, %esp
+ call kernel_main
+ cli
+1: hlt
+ jmp 1b
+
+.size _start, . - _start
diff --git a/include/02.vga/vga00.c b/include/02.vga/vga00.c
new file mode 100644
index 0000000..dfee578
--- /dev/null
+++ b/include/02.vga/vga00.c
@@ -0,0 +1,4 @@
+#include<types.h>
+#include<string.h>
+#include<asm.h>
+#include<vga.h>
diff --git a/include/02.vga/vga01.c b/include/02.vga/vga01.c
new file mode 100644
index 0000000..be0ba00
--- /dev/null
+++ b/include/02.vga/vga01.c
@@ -0,0 +1,4 @@
+size_t terminal_row;
+size_t terminal_column;
+uint8_t terminal_color;
+uint16_t* terminal_buffer;
diff --git a/include/02.vga/vga02.c b/include/02.vga/vga02.c
new file mode 100644
index 0000000..5a12424
--- /dev/null
+++ b/include/02.vga/vga02.c
@@ -0,0 +1,4 @@
+void set_color(enum vga_color fg, enum vga_color bg)
+{
+ terminal_color = fg | bg << 4;
+}
diff --git a/include/02.vga/vga03.c b/include/02.vga/vga03.c
new file mode 100644
index 0000000..173e598
--- /dev/null
+++ b/include/02.vga/vga03.c
@@ -0,0 +1,4 @@
+static inline uint16_t vga_entry(unsigned char uc, uint8_t color)
+{
+ return (uint16_t) uc | (uint16_t) color << 8;
+}
diff --git a/include/02.vga/vga04.c b/include/02.vga/vga04.c
new file mode 100644
index 0000000..50a7d65
--- /dev/null
+++ b/include/02.vga/vga04.c
@@ -0,0 +1,15 @@
+void terminal_initialize()
+{
+ terminal_row=0;
+ terminal_column=0;
+ set_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK);
+ terminal_buffer=(uint16_t*) 0xB8000;
+ for(size_t y=0;y<VGA_HEIGHT;y++)
+ {
+ for(size_t x=0;x<VGA_WIDTH;x++)
+ {
+ const size_t index=y*VGA_WIDTH+x;
+ terminal_buffer[index]=vga_entry(' ', terminal_color);
+ }
+ }
+}
diff --git a/include/02.vga/vga05.c b/include/02.vga/vga05.c
new file mode 100644
index 0000000..7079bf9
--- /dev/null
+++ b/include/02.vga/vga05.c
@@ -0,0 +1,5 @@
+void terminal_putentryat(char c, uint8_t color, size_t x, size_t y)
+{
+ const size_t index=y*VGA_WIDTH+x;
+ terminal_buffer[index]=vga_entry(c, color);
+}
diff --git a/include/02.vga/vga06.c b/include/02.vga/vga06.c
new file mode 100644
index 0000000..f00a403
--- /dev/null
+++ b/include/02.vga/vga06.c
@@ -0,0 +1,5 @@
+void movescreen()
+{
+ terminal_row--;
+ for(size_t i=0;i<VGA_HEIGHT;i++) for(size_t j=0;j<VGA_WIDTH;j++) terminal_buffer[i*VGA_WIDTH+j]=terminal_buffer[(i+1)*VGA_WIDTH+j];
+}
diff --git a/include/02.vga/vga07.c b/include/02.vga/vga07.c
new file mode 100644
index 0000000..cfb7051
--- /dev/null
+++ b/include/02.vga/vga07.c
@@ -0,0 +1,4 @@
+void next_field()
+{
+ if(++terminal_column==VGA_WIDTH) terminal_column=0,terminal_row++;
+}
diff --git a/include/02.vga/vga08.c b/include/02.vga/vga08.c
new file mode 100644
index 0000000..6e1236d
--- /dev/null
+++ b/include/02.vga/vga08.c
@@ -0,0 +1,5 @@
+void previous_field()
+{
+ if(terminal_column) terminal_column--;
+ else terminal_row--,terminal_column=VGA_WIDTH-1;
+}
diff --git a/include/02.vga/vga09.c b/include/02.vga/vga09.c
new file mode 100644
index 0000000..71e5b7d
--- /dev/null
+++ b/include/02.vga/vga09.c
@@ -0,0 +1,10 @@
+void terminal_putchar(char c)
+{
+ if(c=='\n') terminal_column=0,terminal_row++;
+ else
+ {
+ terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
+ next_field();
+ }
+ if (terminal_row==VGA_HEIGHT) movescreen();
+}
diff --git a/include/02.vga/vga10.c b/include/02.vga/vga10.c
new file mode 100644
index 0000000..8a757f4
--- /dev/null
+++ b/include/02.vga/vga10.c
@@ -0,0 +1,4 @@
+void terminal_writestring(char* data)
+{
+ for(int i=0;data[i]!='\0';i++) terminal_putchar(data[i]);
+}
diff --git a/include/02.vga/vga11.c b/include/02.vga/vga11.c
new file mode 100644
index 0000000..efe6d3a
--- /dev/null
+++ b/include/02.vga/vga11.c
@@ -0,0 +1,6 @@
+void clear()
+{
+ for(size_t i=0;i<VGA_HEIGHT;i++) for(size_t j=0;j<VGA_WIDTH;j++) terminal_putchar(' ');
+ terminal_column=0;
+ terminal_row=0;
+}
diff --git a/include/03.gdt/gdt00.c b/include/03.gdt/gdt00.c
new file mode 100644
index 0000000..c45e28b
--- /dev/null
+++ b/include/03.gdt/gdt00.c
@@ -0,0 +1 @@
+#include<types.h>
diff --git a/include/03.gdt/gdt01.c b/include/03.gdt/gdt01.c
new file mode 100644
index 0000000..cbc5e1d
--- /dev/null
+++ b/include/03.gdt/gdt01.c
@@ -0,0 +1,9 @@
+struct gdt_entry
+{
+ uint16_t limit;
+ uint16_t base1;
+ uint8_t base2;
+ uint8_t access;
+ uint8_t limit_flags;
+ uint8_t base3;
+} __attribute__((packed));
diff --git a/include/03.gdt/gdt02.c b/include/03.gdt/gdt02.c
new file mode 100644
index 0000000..e708661
--- /dev/null
+++ b/include/03.gdt/gdt02.c
@@ -0,0 +1,5 @@
+struct gdt_pointer
+{
+ uint16_t size;
+ uint32_t offset;
+} __attribute__((packed));
diff --git a/include/03.gdt/gdt03.c b/include/03.gdt/gdt03.c
new file mode 100644
index 0000000..94c8cd3
--- /dev/null
+++ b/include/03.gdt/gdt03.c
@@ -0,0 +1,3 @@
+extern void load_gdt(struct gdt_pointer *gdtp);
+struct gdt_entry gdt[5];
+struct gdt_pointer gdtp;
diff --git a/include/03.gdt/gdt04.c b/include/03.gdt/gdt04.c
new file mode 100644
index 0000000..8d6a1f0
--- /dev/null
+++ b/include/03.gdt/gdt04.c
@@ -0,0 +1,9 @@
+void init_gdt_entry(size_t num, uint32_t limit, uint32_t base, uint8_t access, uint8_t limit_flags)
+{
+ gdt[num].limit=limit;
+ gdt[num].base1=(base & 0xffff);
+ gdt[num].base2=(base & 0xff0000) >> 16;
+ gdt[num].access=access;
+ gdt[num].limit_flags=limit_flags;
+ gdt[num].base3=(base & 0xff000000) >> 24;
+}
diff --git a/include/03.gdt/gdt05.c b/include/03.gdt/gdt05.c
new file mode 100644
index 0000000..d525a13
--- /dev/null
+++ b/include/03.gdt/gdt05.c
@@ -0,0 +1,13 @@
+void init_gdt_table()
+{
+ gdtp.size=sizeof(gdt)-1;
+ gdtp.offset=(uint32_t)&gdt;
+
+ init_gdt_entry(0,0,0,0,0); // null segment
+ init_gdt_entry(1,0xffffffff,0,0b10011010,0b11001111); // code segment
+ init_gdt_entry(2,0xffffffff,0,0b10010010,0b11001111); // data segment
+ init_gdt_entry(3,0xffffffff,0,0b11111010,0b11001111); // user mode code segment
+ init_gdt_entry(4,0xffffffff,0,0b11110010,0b11001111); // user mode data segment
+
+ load_gdt(&gdtp);
+}
diff --git a/include/04.idt/idt00.c b/include/04.idt/idt00.c
new file mode 100644
index 0000000..7c174c9
--- /dev/null
+++ b/include/04.idt/idt00.c
@@ -0,0 +1,3 @@
+#include<types.h>
+#include<irq.h>
+#include<asm.h>
diff --git a/include/04.idt/idt01.c b/include/04.idt/idt01.c
new file mode 100644
index 0000000..c2b91e5
--- /dev/null
+++ b/include/04.idt/idt01.c
@@ -0,0 +1,7 @@
+#define INTERRUPT_GATE_32 0x8E
+#define KERNEL_CODE 0x08
+#define KERNEL_DATA 0x10
+#define PIC1_COMMAND_PORT 0x20
+#define PIC1_DATA_PORT 0x21
+#define PIC2_COMMAND_PORT 0xA0
+#define PIC2_DATA_PORT 0xA1
diff --git a/include/04.idt/idt02.c b/include/04.idt/idt02.c
new file mode 100644
index 0000000..dcab25c
--- /dev/null
+++ b/include/04.idt/idt02.c
@@ -0,0 +1,8 @@
+struct idt_entry
+{
+ uint16_t offset1;
+ uint16_t selector;
+ uint8_t zero;
+ uint8_t type_attr;
+ uint16_t offset2;
+} __attribute__((packed));
diff --git a/include/04.idt/idt03.c b/include/04.idt/idt03.c
new file mode 100644
index 0000000..fe1bff5
--- /dev/null
+++ b/include/04.idt/idt03.c
@@ -0,0 +1,5 @@
+struct idt_pointer
+{
+ uint16_t size;
+ uint32_t offset;
+} __attribute__((packed));
diff --git a/include/04.idt/idt04.c b/include/04.idt/idt04.c
new file mode 100644
index 0000000..329ce75
--- /dev/null
+++ b/include/04.idt/idt04.c
@@ -0,0 +1,4 @@
+extern void load_idt(struct idt_pointer *idtp);
+extern void keyboard_irq();
+struct idt_entry idt[256];
+struct idt_pointer idtp;
diff --git a/include/04.idt/idt05.c b/include/04.idt/idt05.c
new file mode 100644
index 0000000..d11c19e
--- /dev/null
+++ b/include/04.idt/idt05.c
@@ -0,0 +1,8 @@
+void init_idt_entry(size_t num, uint32_t offset, uint16_t selector, uint8_t type_attr)
+{
+ idt[num].offset1=(offset & 0xffff);
+ idt[num].selector=selector;
+ idt[num].zero=0;
+ idt[num].type_attr=type_attr;
+ idt[num].offset2=(offset & 0xffff0000)>>16;
+}
diff --git a/include/04.idt/idt06.c b/include/04.idt/idt06.c
new file mode 100644
index 0000000..409dd15
--- /dev/null
+++ b/include/04.idt/idt06.c
@@ -0,0 +1,4 @@
+void add_idt_entry(size_t num,uint32_t offset)
+{
+ init_idt_entry(num,offset,KERNEL_CODE,INTERRUPT_GATE_32);
+}
diff --git a/include/05.irq/idt07.c b/include/05.irq/idt07.c
new file mode 100644
index 0000000..a0d32d2
--- /dev/null
+++ b/include/05.irq/idt07.c
@@ -0,0 +1,15 @@
+void init_pic()
+{
+ ioport_out(PIC1_COMMAND_PORT, 0x11);
+ ioport_out(PIC2_COMMAND_PORT, 0x11);
+ ioport_out(PIC1_DATA_PORT, 0x20);
+ ioport_out(PIC2_DATA_PORT, 0x28);
+ ioport_out(PIC1_DATA_PORT, 0x04);
+ ioport_out(PIC2_DATA_PORT, 0x02);
+ ioport_out(PIC1_DATA_PORT, 0x01);
+ ioport_out(PIC2_DATA_PORT, 0x01);
+ ioport_out(PIC1_DATA_PORT, 0xff);
+ ioport_out(PIC2_DATA_PORT, 0xff);
+
+ ioport_out(PIC1_DATA_PORT, 0xFC);
+}
diff --git a/include/05.irq/idt08.c b/include/05.irq/idt08.c
new file mode 100644
index 0000000..d5754f7
--- /dev/null
+++ b/include/05.irq/idt08.c
@@ -0,0 +1,44 @@
+void init_idt_table()
+{
+ init_pic();
+ add_idt_entry(0,(uint32_t)irq0);
+ add_idt_entry(1,(uint32_t)irq1);
+ add_idt_entry(2,(uint32_t)irq2);
+ add_idt_entry(3,(uint32_t)irq3);
+ add_idt_entry(4,(uint32_t)irq4);
+ add_idt_entry(5,(uint32_t)irq5);
+ add_idt_entry(6,(uint32_t)irq6);
+ add_idt_entry(7,(uint32_t)irq7);
+ add_idt_entry(8,(uint32_t)irq8);
+ add_idt_entry(9,(uint32_t)irq9);
+ add_idt_entry(10,(uint32_t)irq10);
+ add_idt_entry(11,(uint32_t)irq11);
+ add_idt_entry(12,(uint32_t)irq12);
+ add_idt_entry(13,(uint32_t)irq13);
+ add_idt_entry(14,(uint32_t)irq14);
+ add_idt_entry(15,(uint32_t)irq15);
+ add_idt_entry(16,(uint32_t)irq16);
+ add_idt_entry(17,(uint32_t)irq17);
+ add_idt_entry(18,(uint32_t)irq18);
+ add_idt_entry(19,(uint32_t)irq19);
+ add_idt_entry(20,(uint32_t)irq20);
+ add_idt_entry(21,(uint32_t)irq21);
+ add_idt_entry(22,(uint32_t)irq22);
+ add_idt_entry(23,(uint32_t)irq23);
+ add_idt_entry(24,(uint32_t)irq24);
+ add_idt_entry(25,(uint32_t)irq25);
+ add_idt_entry(26,(uint32_t)irq26);
+ add_idt_entry(27,(uint32_t)irq27);
+ add_idt_entry(28,(uint32_t)irq28);
+ add_idt_entry(29,(uint32_t)irq29);
+ add_idt_entry(30,(uint32_t)irq30);
+ add_idt_entry(31,(uint32_t)irq31);
+ add_idt_entry(32,(uint32_t)timer_irq);
+ add_idt_entry(33,(uint32_t)keyboard_irq);
+
+ idtp.size=sizeof(struct idt_entry)*256-1;
+ idtp.offset=(uint32_t)&idt;
+
+
+ load_idt(&idtp);
+}
diff --git a/include/06.keyboard/keyboard00.c b/include/06.keyboard/keyboard00.c
new file mode 100644
index 0000000..13fd550
--- /dev/null
+++ b/include/06.keyboard/keyboard00.c
@@ -0,0 +1,3 @@
+#include<types.h>
+#include<asm.h>
+#include<stdio.h>
diff --git a/include/06.keyboard/keyboard01.c b/include/06.keyboard/keyboard01.c
new file mode 100644
index 0000000..50d7c07
--- /dev/null
+++ b/include/06.keyboard/keyboard01.c
@@ -0,0 +1,7 @@
+#define BUFFER_SIZE 200
+#define BUFFER_LOG 200
+char buffer[BUFFER_LOG][BUFFER_SIZE];
+size_t buffer_size[BUFFER_LOG];
+size_t buffer_current=0;
+size_t buffer_all=0;
+size_t buffer_index=0;
diff --git a/include/06.keyboard/keyboard02.c b/include/06.keyboard/keyboard02.c
new file mode 100644
index 0000000..239c874
--- /dev/null
+++ b/include/06.keyboard/keyboard02.c
@@ -0,0 +1,7 @@
+#define PIC1_COMMAND_PORT 0x20
+#define PIC1_DATA_PORT 0x21
+#define PIC2_COMMAND_PORT 0xA0
+#define PIC2_DATA_PORT 0xA1
+// IO Ports for Keyboard
+#define KEYBOARD_DATA_PORT 0x60
+#define KEYBOARD_STATUS_PORT 0x64
diff --git a/include/06.keyboard/keyboard03.c b/include/06.keyboard/keyboard03.c
new file mode 100644
index 0000000..3322fd7
--- /dev/null
+++ b/include/06.keyboard/keyboard03.c
@@ -0,0 +1,6 @@
+void previous_field(void);
+void tty(char *buffer);
+void prompt(void);
+void clear();
+void us_en(char keymap[]);
+void us_en_shift(char keymap[]);
diff --git a/include/06.keyboard/keyboard04.c b/include/06.keyboard/keyboard04.c
new file mode 100644
index 0000000..cc6e7d5
--- /dev/null
+++ b/include/06.keyboard/keyboard04.c
@@ -0,0 +1,6 @@
+char charcode[256];
+char shift_charcode[256];
+bool ispressed[128];
+#define lshift ispressed[0x2A]
+#define rshift ispressed[0x36]
+#define lctrl ispressed[0x1D]
diff --git a/include/06.keyboard/keyboard05.c b/include/06.keyboard/keyboard05.c
new file mode 100644
index 0000000..5c089ce
--- /dev/null
+++ b/include/06.keyboard/keyboard05.c
@@ -0,0 +1,5 @@
+void init_keyboard()
+{
+ us_en(charcode);
+ us_en_shift(shift_charcode);
+}
diff --git a/include/06.keyboard/keyboard06.c b/include/06.keyboard/keyboard06.c
new file mode 100644
index 0000000..55e04b8
--- /dev/null
+++ b/include/06.keyboard/keyboard06.c
@@ -0,0 +1,6 @@
+void deletelast()
+{
+ previous_field();
+ printf(" ");
+ previous_field();
+}
diff --git a/include/06.keyboard/keyboard07.c b/include/06.keyboard/keyboard07.c
new file mode 100644
index 0000000..480abb1
--- /dev/null
+++ b/include/06.keyboard/keyboard07.c
@@ -0,0 +1,8 @@
+void backspace()
+{
+ if(buffer_index<=0) return;
+
+ deletelast();
+ buffer[buffer_current][--buffer_index]='\0';
+ return;
+}
diff --git a/include/06.keyboard/keyboard08.c b/include/06.keyboard/keyboard08.c
new file mode 100644
index 0000000..822e038
--- /dev/null
+++ b/include/06.keyboard/keyboard08.c
@@ -0,0 +1,18 @@
+void enter()
+{
+ printf("\n");
+ if(buffer_index>0)
+ {
+ tty(buffer[buffer_current]);
+ buffer_size[buffer_current]=buffer_index;
+ if(buffer_current==buffer_all) buffer_current=(++buffer_all);
+ else
+ {
+ for(size_t i=0;i<BUFFER_SIZE;i++) buffer[buffer_all][i]='\0';
+ buffer_current=buffer_all;
+ }
+ buffer_index=0;
+ }
+ prompt();
+ return;
+}
diff --git a/include/06.keyboard/keyboard09.c b/include/06.keyboard/keyboard09.c
new file mode 100644
index 0000000..33bc64b
--- /dev/null
+++ b/include/06.keyboard/keyboard09.c
@@ -0,0 +1,5 @@
+void space()
+{
+ buffer[buffer_current][buffer_index++]=' ';
+ printf(" ");
+}
diff --git a/include/06.keyboard/keyboard10.c b/include/06.keyboard/keyboard10.c
new file mode 100644
index 0000000..5c6d048
--- /dev/null
+++ b/include/06.keyboard/keyboard10.c
@@ -0,0 +1,11 @@
+void keyup()
+{
+ if(buffer_current>0)
+ {
+ buffer_size[buffer_current]=buffer_index;
+ for(size_t i=0;i<buffer_index;i++) deletelast();
+ buffer_current--;
+ buffer_index=buffer_size[buffer_current];
+ printf("%s",buffer[buffer_current]);
+ }
+}
diff --git a/include/06.keyboard/keyboard11.c b/include/06.keyboard/keyboard11.c
new file mode 100644
index 0000000..50841fa
--- /dev/null
+++ b/include/06.keyboard/keyboard11.c
@@ -0,0 +1,11 @@
+void keydown()
+{
+ if(buffer_current<buffer_all)
+ {
+ buffer_size[buffer_current]=buffer_index;
+ for(size_t i=0;i<buffer_index;i++) deletelast();
+ buffer_current++;
+ buffer_index=buffer_size[buffer_current];
+ printf("%s",buffer[buffer_current]);
+ }
+}
diff --git a/include/06.keyboard/keyboard12.c b/include/06.keyboard/keyboard12.c
new file mode 100644
index 0000000..a0a8a0f
--- /dev/null
+++ b/include/06.keyboard/keyboard12.c
@@ -0,0 +1,48 @@
+void keyboard_handler()
+{
+ ioport_out(PIC1_COMMAND_PORT, 0x20);
+ uint8_t status = ioport_in(KEYBOARD_STATUS_PORT);
+
+ if (status & 0x1)
+ {
+ uint8_t keycode = ioport_in(KEYBOARD_DATA_PORT);
+ if(keycode<0x80)
+ {
+ ispressed[keycode]=1;
+ if(keycode==0x0E) backspace();
+ else if(keycode==0x1C) enter();
+ else if(keycode==0x39) space();
+ else if(keycode==72) keyup();
+ else if(keycode==80) keydown();
+ else if(keycode==75) keyleft();
+ else if(keycode==77) keyright();
+ else
+ {
+ char c=charcode[keycode];
+ if(c!=' ')
+ {
+ if(lctrl)
+ {
+ if(c=='l')
+ {
+ clear();
+ prompt();
+ printf("%s",buffer[buffer_current]);
+ return;
+ }
+ }
+ if(lshift||rshift)
+ {
+ c=shift_charcode[keycode];
+ }
+ buffer[buffer_current][buffer_index++]=c;
+ printf("%c",c);
+ }
+ }
+ }
+ else
+ {
+ ispressed[keycode-0x80]=0;
+ }
+ }
+}
diff --git a/include/07.pit/pit00.c b/include/07.pit/pit00.c
new file mode 100644
index 0000000..13fd550
--- /dev/null
+++ b/include/07.pit/pit00.c
@@ -0,0 +1,3 @@
+#include<types.h>
+#include<asm.h>
+#include<stdio.h>
diff --git a/include/07.pit/pit01.c b/include/07.pit/pit01.c
new file mode 100644
index 0000000..c199373
--- /dev/null
+++ b/include/07.pit/pit01.c
@@ -0,0 +1,5 @@
+void add_idt_entry(size_t num,uint32_t offset);
+uint32_t tick=0;
+const uint32_t TICKS_PER_SECOND=50;
+extern uint32_t time;
+uint32_t time=0;
diff --git a/include/07.pit/pit02.c b/include/07.pit/pit02.c
new file mode 100644
index 0000000..523d14b
--- /dev/null
+++ b/include/07.pit/pit02.c
@@ -0,0 +1,13 @@
+void timer_handler()
+{
+ tick++;
+ if(tick==TICKS_PER_SECOND)
+ {
+ //printf("%d seconds passed\n",time);
+ tick=0;
+ time++;
+ }
+
+ ioport_out(0x20, 0x20);
+ ioport_out(0xa0,0x20);
+}
diff --git a/include/07.pit/pit03.c b/include/07.pit/pit03.c
new file mode 100644
index 0000000..287adba
--- /dev/null
+++ b/include/07.pit/pit03.c
@@ -0,0 +1,20 @@
+void init_timer(uint32_t frequency)
+{
+ // Firstly, register our timer callback.
+
+ // The value we send to the PIT is the value to divide it's input clock
+ // (1193180 Hz) by, to get our required frequency. Important to note is
+ // that the divisor must be small enough to fit into 16-bits.
+ uint32_t divisor = 1193180 / frequency;
+
+ // Send the command byte.
+ ioport_out(0x43, 0x36);
+
+ // Divisor has to be sent byte-wise, so split here into upper/lower bytes.
+ uint8_t l = (uint8_t)(divisor & 0xFF);
+ uint8_t h = (uint8_t)( (divisor>>8) & 0xFF );
+
+ // Send the frequency divisor.
+ ioport_out(0x40, l);
+ ioport_out(0x40, h);
+}
diff --git a/include/08.heap/heap00.c b/include/08.heap/heap00.c
new file mode 100644
index 0000000..c45e28b
--- /dev/null
+++ b/include/08.heap/heap00.c
@@ -0,0 +1 @@
+#include<types.h>
diff --git a/include/08.heap/heap01.c b/include/08.heap/heap01.c
new file mode 100644
index 0000000..e7f4f84
--- /dev/null
+++ b/include/08.heap/heap01.c
@@ -0,0 +1,7 @@
+typedef struct _KHEAPBLOCKBM {
+ struct _KHEAPBLOCKBM *next;
+ uint32_t size;
+ uint32_t used;
+ uint32_t bsize;
+ uint32_t lfb;
+} KHEAPBLOCKBM;
diff --git a/include/08.heap/heap02.c b/include/08.heap/heap02.c
new file mode 100644
index 0000000..e46dc38
--- /dev/null
+++ b/include/08.heap/heap02.c
@@ -0,0 +1,3 @@
+typedef struct _KHEAPBM {
+ KHEAPBLOCKBM *fblock;
+} KHEAPBM;
diff --git a/include/08.heap/heap03.c b/include/08.heap/heap03.c
new file mode 100644
index 0000000..9e2fe89
--- /dev/null
+++ b/include/08.heap/heap03.c
@@ -0,0 +1,3 @@
+void k_heapBMInit(KHEAPBM *heap) {
+ heap->fblock = 0;
+}
diff --git a/include/08.heap/heap04.c b/include/08.heap/heap04.c
new file mode 100644
index 0000000..be39951
--- /dev/null
+++ b/include/08.heap/heap04.c
@@ -0,0 +1,33 @@
+int k_heapBMAddBlock(KHEAPBM *heap, uintptr_t addr, uint32_t size, uint32_t bsize) {
+ KHEAPBLOCKBM *b;
+ uint32_t bcnt;
+ uint32_t x;
+ uint8_t *bm;
+
+ b = (KHEAPBLOCKBM*)addr;
+ b->size = size - sizeof(KHEAPBLOCKBM);
+ b->bsize = bsize;
+
+ b->next = heap->fblock;
+ heap->fblock = b;
+
+ bcnt = b->size / b->bsize;
+ bm = (uint8_t*)&b[1];
+
+ /* clear bitmap */
+ for (x = 0; x < bcnt; ++x) {
+ bm[x] = 0;
+ }
+
+ /* reserve room for bitmap */
+ bcnt = (bcnt / bsize) * bsize < bcnt ? bcnt / bsize + 1 : bcnt / bsize;
+ for (x = 0; x < bcnt; ++x) {
+ bm[x] = 5;
+ }
+
+ b->lfb = bcnt - 1;
+
+ b->used = bcnt;
+
+ return 1;
+}
diff --git a/include/08.heap/heap05.c b/include/08.heap/heap05.c
new file mode 100644
index 0000000..1856ca5
--- /dev/null
+++ b/include/08.heap/heap05.c
@@ -0,0 +1,5 @@
+static uint8_t k_heapBMGetNID(uint8_t a, uint8_t b) {
+ uint8_t c;
+ for (c = a + 1; c == b || c == 0; ++c);
+ return c;
+}
diff --git a/include/08.heap/heap06.c b/include/08.heap/heap06.c
new file mode 100644
index 0000000..5ad2787
--- /dev/null
+++ b/include/08.heap/heap06.c
@@ -0,0 +1,58 @@
+void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) {
+ KHEAPBLOCKBM *b;
+ uint8_t *bm;
+ uint32_t bcnt;
+ uint32_t x, y, z;
+ uint32_t bneed;
+ uint8_t nid;
+
+ /* iterate blocks */
+ for (b = heap->fblock; b; b = b->next) {
+ //printf("size:%d,used:%d,bsize:%d,lfb:%d\n",b->size,b->used,b->bsize,b->lfb);
+ /* check if block has enough room */
+ if (b->size - (b->used * b->bsize) >= size) {
+
+ bcnt = b->size / b->bsize;
+ bneed = (size / b->bsize) * b->bsize < size ? size / b->bsize + 1 : size / b->bsize;
+ bm = (uint8_t*)&b[1];
+ //printf("bcnt:%d,bneed:%d,bm:%d\n",bcnt,bneed,bm);
+
+ for (x = (b->lfb + 1 >= bcnt ? 0 : b->lfb + 1); x != b->lfb; ++x) {
+ /* just wrap around */
+ if (x >= bcnt) {
+ x = 0;
+ }
+
+ if (bm[x] == 0) {
+ /* count free blocks */
+ for (y = 0; bm[x + y] == 0 && y < bneed && (x + y) < bcnt; ++y);
+
+ /* we have enough, now allocate them */
+ if (y == bneed) {
+ /* find ID that does not match left or right */
+ nid = k_heapBMGetNID(bm[x - 1], bm[x + y]);
+
+ /* allocate by setting id */
+ for (z = 0; z < y; ++z) {
+ bm[x + z] = nid;
+ }
+
+ /* optimization */
+ b->lfb = (x + bneed) - 2;
+
+ /* count used blocks NOT bytes */
+ b->used += y;
+
+ return (void*)(x * b->bsize + (uintptr_t)&b[1]);
+ }
+
+ /* x will be incremented by one ONCE more in our FOR loop */
+ x += (y - 1);
+ continue;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/include/08.heap/heap07.c b/include/08.heap/heap07.c
new file mode 100644
index 0000000..5686cd4
--- /dev/null
+++ b/include/08.heap/heap07.c
@@ -0,0 +1,32 @@
+void k_heapBMFree(KHEAPBM *heap, void *ptr) {
+ KHEAPBLOCKBM *b;
+ uintptr_t ptroff;
+ uint32_t bi, x;
+ uint8_t *bm;
+ uint8_t id;
+ uint32_t max;
+
+ for (b = heap->fblock; b; b = b->next) {
+ if ((uintptr_t)ptr > (uintptr_t)b && (uintptr_t)ptr < (uintptr_t)b + sizeof(KHEAPBLOCKBM) + b->size) {
+ /* found block */
+ ptroff = (uintptr_t)ptr - (uintptr_t)&b[1]; /* get offset to get block */
+ /* block offset in BM */
+ bi = ptroff / b->bsize;
+ /* .. */
+ bm = (uint8_t*)&b[1];
+ /* clear allocation */
+ id = bm[bi];
+ /* oddly.. GCC did not optimize this */
+ max = b->size / b->bsize;
+ for (x = bi; bm[x] == id && x < max; ++x) {
+ bm[x] = 0;
+ }
+ /* update free block count */
+ b->used -= x - bi;
+ return;
+ }
+ }
+
+ /* this error needs to be raised or reported somehow */
+ return;
+}
diff --git a/include/08.heap/heap08.c b/include/08.heap/heap08.c
new file mode 100644
index 0000000..05cf132
--- /dev/null
+++ b/include/08.heap/heap08.c
@@ -0,0 +1,9 @@
+KHEAPBM kheap;
+void kheapinit()
+{
+ k_heapBMInit(&kheap);
+}
+int kheapaddblock(uintptr_t addr,uint32_t size,uint32_t bsize)
+{
+ return k_heapBMAddBlock(&kheap,addr,size,bsize);
+}
diff --git a/include/08.heap/heap09.c b/include/08.heap/heap09.c
new file mode 100644
index 0000000..6874578
--- /dev/null
+++ b/include/08.heap/heap09.c
@@ -0,0 +1,9 @@
+void *kmalloc(uint32_t size)
+{
+ return k_heapBMAlloc(&kheap,size);
+
+}
+void kfree(void *ptr)
+{
+ k_heapBMFree(&kheap,ptr);
+}
diff --git a/include/09.paging/paging00.c b/include/09.paging/paging00.c
new file mode 100644
index 0000000..c45e28b
--- /dev/null
+++ b/include/09.paging/paging00.c
@@ -0,0 +1 @@
+#include<types.h>
diff --git a/include/09.paging/paging01.c b/include/09.paging/paging01.c
new file mode 100644
index 0000000..0789338
--- /dev/null
+++ b/include/09.paging/paging01.c
@@ -0,0 +1,3 @@
+extern void loadPageDirectory(uint32_t*);
+extern void enablePaging();
+uint32_t page_directory[1024] __attribute__((aligned(4096)));
diff --git a/include/09.paging/paging02.c b/include/09.paging/paging02.c
new file mode 100644
index 0000000..8c00c89
--- /dev/null
+++ b/include/09.paging/paging02.c
@@ -0,0 +1,12 @@
+void set_pd()
+{
+ //set each entry to not present
+ for(size_t i=0;i<1024;i++)
+ {
+ // This sets the following flags to the pages:
+ // Supervisor: Only kernel-mode can access them
+ // Write Enabled: It can be both read from and written to
+ // Not Present: The page table is not present
+ page_directory[i] = 0x00000002;
+ }
+}
diff --git a/include/09.paging/paging03.c b/include/09.paging/paging03.c
new file mode 100644
index 0000000..57f997d
--- /dev/null
+++ b/include/09.paging/paging03.c
@@ -0,0 +1 @@
+uint32_t page_table[1024][1024] __attribute__((aligned(4096)));
diff --git a/include/09.paging/paging04.c b/include/09.paging/paging04.c
new file mode 100644
index 0000000..ad7507f
--- /dev/null
+++ b/include/09.paging/paging04.c
@@ -0,0 +1,15 @@
+void set_pt(size_t num,uint32_t address)
+{
+ // holds the physical address where we want to start mapping these pages to.
+ // in this case, we want to map these pages to the very beginning of memory.
+ //we will fill all 1024 entries in the table, mapping 4 megabytes
+ for(size_t i=0;i<1024;i++)
+ {
+ // As the address is page aligned, it will always leave 12 bits zeroed.
+ // Those bits are used by the attributes ;)
+ page_table[num][i] = (address + i * 0x1000) | 3; // attributes: supervisor level, read/write, present.
+ }
+
+ page_directory[num] = ((uint32_t)page_table[num]) | 3;
+ // attributes: supervisor level, read/write, present
+}
diff --git a/include/09.paging/paging05.c b/include/09.paging/paging05.c
new file mode 100644
index 0000000..d99797b
--- /dev/null
+++ b/include/09.paging/paging05.c
@@ -0,0 +1,7 @@
+void set_paging()
+{
+ set_pd();
+ for(size_t i=0;i<1024;i++) set_pt(i,0x00400000 * i); // all 4GB mapped
+ loadPageDirectory(page_directory);
+ enablePaging();
+}
diff --git a/include/10.libc/asm.h b/include/10.libc/asm.h
new file mode 100644
index 0000000..9f2a9e6
--- /dev/null
+++ b/include/10.libc/asm.h
@@ -0,0 +1,9 @@
+#ifndef ASM_H
+#define ASM_H
+
+#include<types.h>
+
+extern uint8_t ioport_in(uint8_t port);
+extern void ioport_out(uint8_t port, char data);
+
+#endif
diff --git a/include/10.libc/errno.h b/include/10.libc/errno.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/include/10.libc/errno.h
diff --git a/include/10.libc/heap.h b/include/10.libc/heap.h
new file mode 100644
index 0000000..fa32f26
--- /dev/null
+++ b/include/10.libc/heap.h
@@ -0,0 +1,11 @@
+#ifndef HEAP_H
+#define HEAP_H
+
+#include<types.h>
+
+void kheapinit();
+int kheapaddblock(uintptr_t addr,uint32_t size,uint32_t bsize);
+void *kmalloc(uint32_t size);
+void kfree(void *ptr);
+
+#endif
diff --git a/include/10.libc/irq.h b/include/10.libc/irq.h
new file mode 100644
index 0000000..58b3cd3
--- /dev/null
+++ b/include/10.libc/irq.h
@@ -0,0 +1,39 @@
+#ifndef IRQ_H
+#define IRQ_H
+
+extern void irq0();
+extern void irq1();
+extern void irq2();
+extern void irq3();
+extern void irq4();
+extern void irq5();
+extern void irq6();
+extern void irq7();
+extern void irq8();
+extern void irq9();
+extern void irq10();
+extern void irq11();
+extern void irq12();
+extern void irq13();
+extern void irq14();
+extern void irq15();
+extern void irq16();
+extern void irq17();
+extern void irq18();
+extern void irq19();
+extern void irq20();
+extern void irq21();
+extern void irq22();
+extern void irq23();
+extern void irq24();
+extern void irq25();
+extern void irq26();
+extern void irq27();
+extern void irq28();
+extern void irq29();
+extern void irq30();
+extern void irq31();
+extern void timer_irq();
+extern void keyboard_irq();
+
+#endif
diff --git a/include/10.libc/stdio.h b/include/10.libc/stdio.h
new file mode 100644
index 0000000..45c9215
--- /dev/null
+++ b/include/10.libc/stdio.h
@@ -0,0 +1,28 @@
+#ifndef _STDIO_H
+#define _STDIO_H
+#include <stdarg.h>
+#include <stddef.h>
+#define SEEK_SET 0
+typedef struct { int unused; } FILE;
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern FILE* stderr;
+#define stderr stderr
+int fclose(FILE*);
+int fflush(FILE*);
+FILE* fopen(const char*, const char*);
+int fprintf(FILE*, const char*, ...);
+size_t fread(void*, size_t, size_t, FILE*);
+int fseek(FILE*, long, int);
+long ftell(FILE*);
+size_t fwrite(const void*, size_t, size_t, FILE*);
+void setbuf(FILE*, char*);
+int vfprintf(FILE*, const char*, va_list);
+
+void printf(char *str, ...);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/include/10.libc/stdlib.h b/include/10.libc/stdlib.h
new file mode 100644
index 0000000..a0afe38
--- /dev/null
+++ b/include/10.libc/stdlib.h
@@ -0,0 +1,15 @@
+#ifndef _STDLIB_H
+#define _STDLIB_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+void abort(void);
+int atexit(void (*)(void));
+int atoi(const char*);
+void free(void*);
+char* getenv(const char*);
+void* malloc(size_t);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/include/10.libc/string.h b/include/10.libc/string.h
new file mode 100644
index 0000000..bef5854
--- /dev/null
+++ b/include/10.libc/string.h
@@ -0,0 +1,26 @@
+#ifndef _STRING_H
+#define _STRING_H
+#include <stddef.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+void* memcpy(void*, const void*, size_t);
+void* memset(void*, int, size_t);
+char* strcpy(char*, const char*);
+size_t strlen(const char*);
+#ifdef __cplusplus
+}
+#endif
+
+#include<types.h>
+
+size_t stringlen(char *str);
+bool stringcmp(char *str1,char *str2);
+void stringcat(char *str1,char *str2);
+void stringrev(char *str);
+void itos(uint32_t num,char *str);
+uint32_t stoi(const char *str);
+double stof(const char *str);
+void ftos(double num, char *str);
+
+#endif
diff --git a/include/10.libc/sys/types.h b/include/10.libc/sys/types.h
new file mode 100644
index 0000000..4f55189
--- /dev/null
+++ b/include/10.libc/sys/types.h
@@ -0,0 +1,4 @@
+#ifndef _SYS_TYPES_H
+#define _SYS_TYPES_H
+typedef int pid_t;
+#endif
diff --git a/include/10.libc/time.h b/include/10.libc/time.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/include/10.libc/time.h
diff --git a/include/10.libc/types.h b/include/10.libc/types.h
new file mode 100644
index 0000000..a6d6530
--- /dev/null
+++ b/include/10.libc/types.h
@@ -0,0 +1,8 @@
+#ifndef TYPES_H
+#define TYPES_H
+
+#include<stdbool.h>
+#include<stddef.h>
+#include<stdint.h>
+
+#endif
diff --git a/include/10.libc/unistd.h b/include/10.libc/unistd.h
new file mode 100644
index 0000000..a6bfee0
--- /dev/null
+++ b/include/10.libc/unistd.h
@@ -0,0 +1,14 @@
+#ifndef _UNISTD_H
+#define _UNISTD_H
+#include <sys/types.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+int execv(const char*, char* const[]);
+int execve(const char*, char* const[], char* const[]);
+int execvp(const char*, char* const[]);
+pid_t fork(void);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/include/10.libc/vga.h b/include/10.libc/vga.h
new file mode 100644
index 0000000..eb43644
--- /dev/null
+++ b/include/10.libc/vga.h
@@ -0,0 +1,29 @@
+#ifndef VGA_H
+#define VGA_H
+
+#include<types.h>
+
+static const size_t VGA_WIDTH = 80;
+static const size_t VGA_HEIGHT = 25;
+
+enum vga_color {
+ VGA_COLOR_BLACK = 0,
+ VGA_COLOR_DARK_BLUE = 1,
+ VGA_COLOR_GREEN = 2,
+ VGA_COLOR_TURQUOISE = 3,
+ VGA_COLOR_RED = 4,
+ VGA_COLOR_PURPLE = 5,
+ VGA_COLOR_BROWN = 6,
+ VGA_COLOR_LIGHT_GREY = 7,
+ VGA_COLOR_DARK_GREY = 8,
+ VGA_COLOR_BLUE = 9,
+ VGA_COLOR_LIGHT_GREEN = 10,
+ VGA_COLOR_LIGHT_BLUE = 11,
+ VGA_COLOR_LIGHT_RED = 12,
+ VGA_COLOR_PINK = 13,
+ VGA_COLOR_YELLOW = 14,
+ VGA_COLOR_WHITE = 15,
+};
+void set_color(enum vga_color fg, enum vga_color bg);
+
+#endif
diff --git a/kernel.bib b/kernel.bib
index eb083df..4f51908 100644
--- a/kernel.bib
+++ b/kernel.bib
@@ -1,3 +1,12 @@
+@misc{misc:1,
+ title = {Intel® 64 and IA-32 architectures software developer’s manual combined volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D, and 4},
+ author = {Intel},
+ url = {https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html}
+}
+@misc{misc:2,
+ title = {OsDev Wiki},
+ url = {https://wiki.osdev.org/Expanded_Main_Page}
+}
@book{book:1412,
title = {Algorithms},
author = {Sanjoy Dasgupta and Christos Papadimitriou and Umesh Vazirani},
diff --git a/kernel.pdf b/kernel.pdf
index 1cf89be..3d60808 100644
--- a/kernel.pdf
+++ b/kernel.pdf
Binary files differ
diff --git a/kernel.tex b/kernel.tex
index 402ab92..59aaa95 100644
--- a/kernel.tex
+++ b/kernel.tex
@@ -1,13 +1,13 @@
\documentclass[a4paper,fleqn,12pt]{JMThesis}
\usepackage{listings}
\lstset{
- language=make,
basicstyle=\footnotesize,
frame=single,
showstringspaces=false,
tabsize=8,
escapeinside={<@}{@>},
}
+\lstset{defaultdialect=[x86masm]Assembler}
\usepackage[OT2]{fontenc}
\newcommand\eng{\fontencoding{OT1}\fontfamily{\rmdefault}\selectfont}
@@ -31,11 +31,13 @@
]{biblatex}
\bibliography{kernel}
\renewcommand*{\bibfont}{\eng}
-\nocite{*}
\newlength\tindent
\setlength{\tindent}{\parindent}
\setlength{\parindent}{0pt}
+\setlength{\itemsep}{0pt}
+\setlength{\parskip}{0pt}
+\setlength{\parsep}{0pt}
\renewcommand{\indent}{\hspace*{\tindent}}
\oddsidemargin 1cm
@@ -118,26 +120,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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.
@@ -148,67 +131,180 @@ Sav kod je dostupan pod {\eng GPLv3} licencom.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Teorija}
+\chapter{{\eng X86} arhitektura}
\bigskip
-\section{{\eng X86} arhitektura}
-\medskip
-{\eng X86} arhitektura je probitno bila 8bitna (sadrzhala je registre duzhine 8
+{\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}.
+arhitekturu znamo kao i {\eng{} AMD64}, {\eng X86-64} ili {\eng X86\_64}.\\
-Zajedno sa {\eng ARM}-om jedna od najkorish\/c1enijih arhitektura.
+Zajedno sa {\eng ARM}-om jedna od najkorish\/c1enijih arhitektura danashnjice.
-\subsection{Registri procesora}
-\smallskip
-Postoji vishe vrsta registara procesora:
-16bitni registri opshte namene: {\eng ax,bx,cx,dx}.
+\section{Registri procesora}
+\medskip
-{\eng\url{https://wiki.osdev.org/CPU_Registers_x86}}
+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 te 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 koji su 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
-\subsection{{\eng 32bit i686}}
-\smallskip
-32bitni registri opshte namene: {\eng eax,ebx,ecx,edx}.
-64bitni registri opshte namene: {\eng rax,rbx,rcx,rdx}.
+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
-\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
+\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}}
-\subsection{{\eng Protected mode}}
-\smallskip
+\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}
-\smallskip
+\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 (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}.
+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}}
-\subsection{{\eng Bootloader}}
-\smallskip
+\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.
@@ -217,6 +313,7 @@ mu dalje upravljanje.
\section{{\eng ELF}}
\medskip
+
{\eng ELF} je format binarni fajl koji se sastoji od tachno odredjenih sekcija
i koji mozhe da se pokrene.
@@ -227,32 +324,40 @@ i koji mozhe da se pokrene.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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.
+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.
+nalazi se u oficijalnim repozitorijima.\\
Za programe koji su morali biti manuelno kompajlovani date su instrukcije u
-daljem tekstu.
+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 korisc1eni 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 paket sadrzhi programe neophodne za kompajlovanje kao shto su asembler i linker.
+Ovaj softverski paket sadrzhi programe neophodne za kompajlovanje kao shto su
+asembler i linker.
-\subsection{Pre dodavanja {\eng LIBC}}
+\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
@@ -264,40 +369,44 @@ 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.
+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}}
+\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:
+To je moguc1e uraditi na sledec1i nachin:\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[]{include/binutils/exportsysroot}\srb\end{minipage}
+\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[]{include/binutils/binutils2}\srb\end{minipage}
+\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, ipak sam izabrao {\eng GASM} zbog kompatibilnosti sa
-{\eng GCC} kompajlerom. {\eng GASM} kosristi stariju {\eng AT\&T} sintaksu koju
+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/}}.
+{\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.
+
+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
@@ -312,10 +421,10 @@ zajedno sa uput\/stvom za kompajlovanje i korish\/c1enje.
\subsection{Pre dodavanja {\eng LIBC}}
\smallskip
-\begin{minipage}{\textwidth}\eng\lstinputlisting[]{include/gcc/gcc1}\srb\end{minipage}
+\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[]{include/gcc/gcc2}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=make]{include/00.alati/gcc/gcc2}\srb\end{minipage}
\section{{\eng GRUB}}
\medskip
@@ -343,6 +452,7 @@ interface)} iz koga se lako mozhe pozivati iz skripti kao shto su {\eng Makefile
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
@@ -353,6 +463,10 @@ objasnjen u daljem tekstu.
\section{Manje bitni alati}
\medskip
+\subsection{{\eng NeoVim}}
+{\eng NeoVim} je tekst editor nastao od {\eng Vim}-a ({\eng Vi improved}).
+\cite{book:78583}.
+
\subsection{{\eng git}}
\smallskip
Izvorni kod softvera se mozhe nac1i na stranici
@@ -382,121 +496,184 @@ ili {\eng USB} flesh sa kojih se kasnije dizhe sistem.
\medskip
{\eng\url{https://wiki.osdev.org/Bare_Bones}}
-\subsection{Teorija}
-\smallskip
-\subsection{Implementacija}
-\smallskip
-
-\section{Ispis na ekran - {\eng VGA}}
-\medskip
+{\eng as/boot.s}:\\
-\subsection{Teorija}
-\smallskip
-\subsection{Implementacija}
-\smallskip
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot00.s}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot01.s}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot02.s}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot03.s}\srb\end{minipage}
-\section{{\eng LIBC} pochetak}
+\section{Ispis na ekran - {\eng VGA}}
\medskip
-\subsection{Teorija}
-\smallskip
-\subsection{Implementacija}
-\smallskip
+{\eng c/vga.c}:\\
+
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga00.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga01.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga02.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga03.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga04.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga05.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga06.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga07.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga08.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga09.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga10.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga11.c}\srb\end{minipage}
-\section{Globalni konstruktori, zashtita steka}
+\section{{\eng Global Desctiptor Table}}
\medskip
-{\eng\url{https://wiki.osdev.org/Calling_Global_Constructors}}
-{\eng\url{https://wiki.osdev.org/Stack_Smashing_Protector}}
+{\eng c/gdt.c}:\\
-\subsection{Teorija}
-\smallskip
-\subsection{Implementacija}
-\smallskip
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt00.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt01.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt02.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt03.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt04.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt05.c}\srb\end{minipage}
-\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
+{\eng c/idt.c}:\\
+
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt00.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt01.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt02.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt03.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt04.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt05.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt06.c}\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/05.irq/idt07.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/05.irq/idt08.c}\srb\end{minipage}
+
{\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
+{\eng c/keyboard.c}:\\
+
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard00.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard01.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard02.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard03.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard04.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard05.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard06.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard07.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard08.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard09.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard10.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard11.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard12.c}\srb\end{minipage}
\section{{\eng PIT - Programmable Interval Timer}}
\medskip
-{\eng\url{https://wiki.osdev.org/PIT}}
-\subsection{Teorija}
-\smallskip
-\subsection{Implementacija}
-\smallskip
+{\eng c/timer.c}:\\
+
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/pit00.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/pit01.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/pit02.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/pit03.c}\srb\end{minipage}
+{\eng\url{https://wiki.osdev.org/PIT}}
\section{{\eng Heap}}
\medskip
-{\eng\url{https://wiki.osdev.org/Heap}}
-\subsection{Teorija}
-\smallskip
-\subsection{Implementacija}
-\smallskip
+{\eng c/heap.c}:\\
+
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap00.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap01.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap02.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap03.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap04.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap05.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap06.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap07.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap08.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap09.c}\srb\end{minipage}
+{\eng\url{https://wiki.osdev.org/Heap}}
\section{{\eng Paging}}
\medskip
-{\eng\url{https://wiki.osdev.org/Paging}}
-\subsection{Teorija}
-\smallskip
-\subsection{Implementacija}
-\smallskip
+{\eng c/paging.c}:\\
+
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging00.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging01.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging02.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging03.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging04.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging05.c}\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}}
-\subsection{Teorija}
-\smallskip
-\subsection{Implementacija}
-\smallskip
+{\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 sjajna prilika da testiram granice svog znanja.
+Ovaj projekat je bio sjajan pokazatelj koliko je zapravo kompleksno.
\thispagestyle{empty}
\mbox{}
\clearpage
+\nocite{*}
\printbibliography[heading=bibintoc,title={Literatura}]