From e2b78d20b80d89321d8d9df3ab8ade8407642dfc Mon Sep 17 00:00:00 2001 From: Aleksa Vučković Date: Sun, 2 Jan 2022 22:56:02 +0100 Subject: Adding code --- Makefile | 13 + include/00.alati/binutils/binutils1 | 14 + include/00.alati/binutils/binutils2 | 8 + include/00.alati/binutils/exportsysroot | 1 + include/00.alati/gcc/gcc1 | 18 ++ include/00.alati/gcc/gcc2 | 7 + include/01.pocetak/boot00.s | 5 + include/01.pocetak/boot01.s | 5 + include/01.pocetak/boot02.s | 5 + include/01.pocetak/boot03.s | 11 + include/02.vga/vga00.c | 4 + include/02.vga/vga01.c | 4 + include/02.vga/vga02.c | 4 + include/02.vga/vga03.c | 4 + include/02.vga/vga04.c | 15 ++ include/02.vga/vga05.c | 5 + include/02.vga/vga06.c | 5 + include/02.vga/vga07.c | 4 + include/02.vga/vga08.c | 5 + include/02.vga/vga09.c | 10 + include/02.vga/vga10.c | 4 + include/02.vga/vga11.c | 6 + include/03.gdt/gdt00.c | 1 + include/03.gdt/gdt01.c | 9 + include/03.gdt/gdt02.c | 5 + include/03.gdt/gdt03.c | 3 + include/03.gdt/gdt04.c | 9 + include/03.gdt/gdt05.c | 13 + include/04.idt/idt00.c | 3 + include/04.idt/idt01.c | 7 + include/04.idt/idt02.c | 8 + include/04.idt/idt03.c | 5 + include/04.idt/idt04.c | 4 + include/04.idt/idt05.c | 8 + include/04.idt/idt06.c | 4 + include/05.irq/idt07.c | 15 ++ include/05.irq/idt08.c | 44 +++ include/06.keyboard/keyboard00.c | 3 + include/06.keyboard/keyboard01.c | 7 + include/06.keyboard/keyboard02.c | 7 + include/06.keyboard/keyboard03.c | 6 + include/06.keyboard/keyboard04.c | 6 + include/06.keyboard/keyboard05.c | 5 + include/06.keyboard/keyboard06.c | 6 + include/06.keyboard/keyboard07.c | 8 + include/06.keyboard/keyboard08.c | 18 ++ include/06.keyboard/keyboard09.c | 5 + include/06.keyboard/keyboard10.c | 11 + include/06.keyboard/keyboard11.c | 11 + include/06.keyboard/keyboard12.c | 48 ++++ include/07.pit/pit00.c | 3 + include/07.pit/pit01.c | 5 + include/07.pit/pit02.c | 13 + include/07.pit/pit03.c | 20 ++ include/08.heap/heap00.c | 1 + include/08.heap/heap01.c | 7 + include/08.heap/heap02.c | 3 + include/08.heap/heap03.c | 3 + include/08.heap/heap04.c | 33 +++ include/08.heap/heap05.c | 5 + include/08.heap/heap06.c | 58 ++++ include/08.heap/heap07.c | 32 +++ include/08.heap/heap08.c | 9 + include/08.heap/heap09.c | 9 + include/09.paging/paging00.c | 1 + include/09.paging/paging01.c | 3 + include/09.paging/paging02.c | 12 + include/09.paging/paging03.c | 1 + include/09.paging/paging04.c | 15 ++ include/09.paging/paging05.c | 7 + include/10.libc/asm.h | 9 + include/10.libc/errno.h | 0 include/10.libc/heap.h | 11 + include/10.libc/irq.h | 39 +++ include/10.libc/stdio.h | 28 ++ include/10.libc/stdlib.h | 15 ++ include/10.libc/string.h | 26 ++ include/10.libc/sys/types.h | 4 + include/10.libc/time.h | 0 include/10.libc/types.h | 8 + include/10.libc/unistd.h | 14 + include/10.libc/vga.h | 29 ++ include/binutils/binutils1 | 14 - include/binutils/binutils2 | 8 - include/binutils/exportsysroot | 1 - include/gcc/gcc1 | 18 -- include/gcc/gcc2 | 7 - kernel.bib | 9 + kernel.pdf | Bin 264012 -> 435170 bytes kernel.tex | 461 ++++++++++++++++++++++---------- 90 files changed, 1187 insertions(+), 190 deletions(-) create mode 100644 Makefile create mode 100644 include/00.alati/binutils/binutils1 create mode 100644 include/00.alati/binutils/binutils2 create mode 100644 include/00.alati/binutils/exportsysroot create mode 100644 include/00.alati/gcc/gcc1 create mode 100644 include/00.alati/gcc/gcc2 create mode 100644 include/01.pocetak/boot00.s create mode 100644 include/01.pocetak/boot01.s create mode 100644 include/01.pocetak/boot02.s create mode 100644 include/01.pocetak/boot03.s create mode 100644 include/02.vga/vga00.c create mode 100644 include/02.vga/vga01.c create mode 100644 include/02.vga/vga02.c create mode 100644 include/02.vga/vga03.c create mode 100644 include/02.vga/vga04.c create mode 100644 include/02.vga/vga05.c create mode 100644 include/02.vga/vga06.c create mode 100644 include/02.vga/vga07.c create mode 100644 include/02.vga/vga08.c create mode 100644 include/02.vga/vga09.c create mode 100644 include/02.vga/vga10.c create mode 100644 include/02.vga/vga11.c create mode 100644 include/03.gdt/gdt00.c create mode 100644 include/03.gdt/gdt01.c create mode 100644 include/03.gdt/gdt02.c create mode 100644 include/03.gdt/gdt03.c create mode 100644 include/03.gdt/gdt04.c create mode 100644 include/03.gdt/gdt05.c create mode 100644 include/04.idt/idt00.c create mode 100644 include/04.idt/idt01.c create mode 100644 include/04.idt/idt02.c create mode 100644 include/04.idt/idt03.c create mode 100644 include/04.idt/idt04.c create mode 100644 include/04.idt/idt05.c create mode 100644 include/04.idt/idt06.c create mode 100644 include/05.irq/idt07.c create mode 100644 include/05.irq/idt08.c create mode 100644 include/06.keyboard/keyboard00.c create mode 100644 include/06.keyboard/keyboard01.c create mode 100644 include/06.keyboard/keyboard02.c create mode 100644 include/06.keyboard/keyboard03.c create mode 100644 include/06.keyboard/keyboard04.c create mode 100644 include/06.keyboard/keyboard05.c create mode 100644 include/06.keyboard/keyboard06.c create mode 100644 include/06.keyboard/keyboard07.c create mode 100644 include/06.keyboard/keyboard08.c create mode 100644 include/06.keyboard/keyboard09.c create mode 100644 include/06.keyboard/keyboard10.c create mode 100644 include/06.keyboard/keyboard11.c create mode 100644 include/06.keyboard/keyboard12.c create mode 100644 include/07.pit/pit00.c create mode 100644 include/07.pit/pit01.c create mode 100644 include/07.pit/pit02.c create mode 100644 include/07.pit/pit03.c create mode 100644 include/08.heap/heap00.c create mode 100644 include/08.heap/heap01.c create mode 100644 include/08.heap/heap02.c create mode 100644 include/08.heap/heap03.c create mode 100644 include/08.heap/heap04.c create mode 100644 include/08.heap/heap05.c create mode 100644 include/08.heap/heap06.c create mode 100644 include/08.heap/heap07.c create mode 100644 include/08.heap/heap08.c create mode 100644 include/08.heap/heap09.c create mode 100644 include/09.paging/paging00.c create mode 100644 include/09.paging/paging01.c create mode 100644 include/09.paging/paging02.c create mode 100644 include/09.paging/paging03.c create mode 100644 include/09.paging/paging04.c create mode 100644 include/09.paging/paging05.c create mode 100644 include/10.libc/asm.h create mode 100644 include/10.libc/errno.h create mode 100644 include/10.libc/heap.h create mode 100644 include/10.libc/irq.h create mode 100644 include/10.libc/stdio.h create mode 100644 include/10.libc/stdlib.h create mode 100644 include/10.libc/string.h create mode 100644 include/10.libc/sys/types.h create mode 100644 include/10.libc/time.h create mode 100644 include/10.libc/types.h create mode 100644 include/10.libc/unistd.h create mode 100644 include/10.libc/vga.h delete mode 100644 include/binutils/binutils1 delete mode 100644 include/binutils/binutils2 delete mode 100644 include/binutils/exportsysroot delete mode 100644 include/gcc/gcc1 delete mode 100644 include/gcc/gcc2 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/00.alati/binutils/binutils1 b/include/00.alati/binutils/binutils1 new file mode 100644 index 0000000..d24267d --- /dev/null +++ b/include/00.alati/binutils/binutils1 @@ -0,0 +1,14 @@ + mkdir build + cd build + + ../configure \ + --target=i686-elf \ + --with-sysroot \ + --prefix=/usr \ + --bindir=/usr/bin \ + --libdir=/usr/lib/i686-elf \ + --disable-nls \ + --disable-werror + + make + make install diff --git a/include/00.alati/binutils/binutils2 b/include/00.alati/binutils/binutils2 new file mode 100644 index 0000000..d99af99 --- /dev/null +++ b/include/00.alati/binutils/binutils2 @@ -0,0 +1,8 @@ + ../configure \ + --target=i686-elf \ + --with-sysroot=$SYSROOT \ + --prefix=/usr \ + --bindir=/usr/bin \ + --libdir=/usr/lib/i686-elf \ + --disable-nls \ + --disable-werror diff --git a/include/00.alati/binutils/exportsysroot b/include/00.alati/binutils/exportsysroot new file mode 100644 index 0000000..5d61861 --- /dev/null +++ b/include/00.alati/binutils/exportsysroot @@ -0,0 +1 @@ +export SYSROOT=/put/do/biblioteke diff --git a/include/00.alati/gcc/gcc1 b/include/00.alati/gcc/gcc1 new file mode 100644 index 0000000..c555f2c --- /dev/null +++ b/include/00.alati/gcc/gcc1 @@ -0,0 +1,18 @@ + mkdir build + cd build + + ../configure \ + --target=i686-elf \ + --prefix=/usr \ + --disable-nls \ + --disable-plugin \ + --enable-languages=c,c++ \ + --without-headers + + make all-gcc + make all-target-libgcc + + make -k check || true + + make install-gcc + make install-target-libgcc diff --git a/include/00.alati/gcc/gcc2 b/include/00.alati/gcc/gcc2 new file mode 100644 index 0000000..d406f6c --- /dev/null +++ b/include/00.alati/gcc/gcc2 @@ -0,0 +1,7 @@ + ../configure \ + --target=i686-elf \ + --prefix=/usr \ + --with-sysroot=$SYSROOT \ + --disable-nls \ + --disable-plugin \ + --enable-languages=c,c++ 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 +#include +#include +#include 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 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 +#include +#include 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 +#include +#include 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;i0) + { + buffer_size[buffer_current]=buffer_index; + for(size_t i=0;i +#include +#include 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 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 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 + +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 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 + +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 +#include +#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 +#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 + +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 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 +#include +#include + +#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 +#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 + +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/include/binutils/binutils1 b/include/binutils/binutils1 deleted file mode 100644 index d24267d..0000000 --- a/include/binutils/binutils1 +++ /dev/null @@ -1,14 +0,0 @@ - mkdir build - cd build - - ../configure \ - --target=i686-elf \ - --with-sysroot \ - --prefix=/usr \ - --bindir=/usr/bin \ - --libdir=/usr/lib/i686-elf \ - --disable-nls \ - --disable-werror - - make - make install diff --git a/include/binutils/binutils2 b/include/binutils/binutils2 deleted file mode 100644 index d99af99..0000000 --- a/include/binutils/binutils2 +++ /dev/null @@ -1,8 +0,0 @@ - ../configure \ - --target=i686-elf \ - --with-sysroot=$SYSROOT \ - --prefix=/usr \ - --bindir=/usr/bin \ - --libdir=/usr/lib/i686-elf \ - --disable-nls \ - --disable-werror diff --git a/include/binutils/exportsysroot b/include/binutils/exportsysroot deleted file mode 100644 index 5d61861..0000000 --- a/include/binutils/exportsysroot +++ /dev/null @@ -1 +0,0 @@ -export SYSROOT=/put/do/biblioteke diff --git a/include/gcc/gcc1 b/include/gcc/gcc1 deleted file mode 100644 index c555f2c..0000000 --- a/include/gcc/gcc1 +++ /dev/null @@ -1,18 +0,0 @@ - mkdir build - cd build - - ../configure \ - --target=i686-elf \ - --prefix=/usr \ - --disable-nls \ - --disable-plugin \ - --enable-languages=c,c++ \ - --without-headers - - make all-gcc - make all-target-libgcc - - make -k check || true - - make install-gcc - make install-target-libgcc diff --git a/include/gcc/gcc2 b/include/gcc/gcc2 deleted file mode 100644 index d406f6c..0000000 --- a/include/gcc/gcc2 +++ /dev/null @@ -1,7 +0,0 @@ - ../configure \ - --target=i686-elf \ - --prefix=/usr \ - --with-sysroot=$SYSROOT \ - --disable-nls \ - --disable-plugin \ - --enable-languages=c,c++ 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 Binary files a/kernel.pdf and b/kernel.pdf 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}] -- cgit v1.2.3