From 0bff8199e4a800d5ea1bd422dcf06643d6daf008 Mon Sep 17 00:00:00 2001 From: Aleksa Vučković Date: Mon, 10 Jan 2022 22:15:15 +0100 Subject: include/setup.sh --- Makefile | 5 +- include/01.pocetak/boot.s | 70 ++++++++++++++ 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/01.pocetak/deo1 | 5 + include/01.pocetak/deo10 | 5 + include/01.pocetak/deo11 | 12 +++ include/01.pocetak/deo12 | 1 + include/01.pocetak/deo2 | 5 + include/01.pocetak/deo3 | 6 ++ include/01.pocetak/deo4 | 4 + include/01.pocetak/deo5 | 5 + include/01.pocetak/deo6 | 4 + include/01.pocetak/deo7 | 5 + include/01.pocetak/deo8 | 2 + include/01.pocetak/deo9 | 5 + include/02.vga/deo1 | 4 + include/02.vga/deo10 | 10 ++ include/02.vga/deo11 | 4 + include/02.vga/deo12 | 8 ++ include/02.vga/deo13 | 8 ++ include/02.vga/deo14 | 6 ++ include/02.vga/deo2 | 4 + include/02.vga/deo3 | 4 + include/02.vga/deo4 | 4 + include/02.vga/deo5 | 15 +++ include/02.vga/deo6 | 5 + include/02.vga/deo7 | 6 ++ include/02.vga/deo8 | 4 + include/02.vga/deo9 | 5 + include/02.vga/vga.c | 100 ++++++++++++++++++++ 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/deo1 | 1 + include/03.gdt/deo2 | 9 ++ include/03.gdt/deo3 | 5 + include/03.gdt/deo4 | 1 + include/03.gdt/deo5 | 2 + include/03.gdt/deo6 | 9 ++ include/03.gdt/deo7 | 4 + include/03.gdt/deo8 | 5 + include/03.gdt/deo9 | 2 + include/03.gdt/gdt.c | 46 ++++++++++ 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/deo1 | 3 + include/04.idt/deo10 | 4 + include/04.idt/deo11 | 14 +++ include/04.idt/deo12 | 37 ++++++++ include/04.idt/deo13 | 2 + include/04.idt/deo14 | 2 + include/04.idt/deo2 | 1 + include/04.idt/deo3 | 2 + include/04.idt/deo4 | 4 + include/04.idt/deo5 | 8 ++ include/04.idt/deo6 | 5 + include/04.idt/deo7 | 2 + include/04.idt/deo8 | 2 + include/04.idt/deo9 | 8 ++ include/04.idt/idt.c | 108 ++++++++++++++++++++++ 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/deo1 | 3 + include/06.keyboard/deo10 | 18 ++++ include/06.keyboard/deo11 | 5 + include/06.keyboard/deo12 | 11 +++ include/06.keyboard/deo13 | 11 +++ include/06.keyboard/deo14 | 3 + include/06.keyboard/deo15 | 3 + include/06.keyboard/deo16 | 4 + include/06.keyboard/deo17 | 8 ++ include/06.keyboard/deo18 | 23 +++++ include/06.keyboard/deo19 | 22 +++++ include/06.keyboard/deo2 | 7 ++ include/06.keyboard/deo20 | 7 ++ include/06.keyboard/deo3 | 7 ++ include/06.keyboard/deo4 | 6 ++ include/06.keyboard/deo5 | 7 ++ include/06.keyboard/deo6 | 5 + include/06.keyboard/deo7 | 6 ++ include/06.keyboard/deo8 | 3 + include/06.keyboard/deo9 | 4 + include/06.keyboard/keyboard.c | 182 ++++++++++++++++++++++++++++++++++++ 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/deo1 | 3 + include/07.pit/deo10 | 4 + include/07.pit/deo2 | 1 + include/07.pit/deo3 | 4 + include/07.pit/deo4 | 9 ++ include/07.pit/deo5 | 3 + include/07.pit/deo6 | 3 + include/07.pit/deo7 | 4 + include/07.pit/deo8 | 2 + include/07.pit/deo9 | 3 + 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/07.pit/timer.c | 45 +++++++++ include/08.heap/deo1 | 1 + include/08.heap/deo10 | 5 + include/08.heap/deo11 | 4 + include/08.heap/deo12 | 5 + include/08.heap/deo13 | 7 ++ include/08.heap/deo14 | 4 + include/08.heap/deo15 | 3 + include/08.heap/deo16 | 5 + include/08.heap/deo17 | 3 + include/08.heap/deo18 | 4 + include/08.heap/deo19 | 4 + include/08.heap/deo2 | 7 ++ include/08.heap/deo20 | 2 + include/08.heap/deo21 | 2 + include/08.heap/deo22 | 2 + include/08.heap/deo23 | 9 ++ include/08.heap/deo24 | 7 ++ include/08.heap/deo25 | 20 ++++ include/08.heap/deo26 | 3 + include/08.heap/deo27 | 1 + include/08.heap/deo28 | 4 + include/08.heap/deo29 | 4 + include/08.heap/deo3 | 3 + include/08.heap/deo30 | 4 + include/08.heap/deo31 | 4 + include/08.heap/deo4 | 3 + include/08.heap/deo5 | 5 + include/08.heap/deo6 | 3 + include/08.heap/deo7 | 2 + include/08.heap/deo8 | 2 + include/08.heap/deo9 | 4 + include/08.heap/heap.c | 166 +++++++++++++++++++++++++++++++++ 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/deo1 | 1 + include/09.paging/deo2 | 2 + include/09.paging/deo3 | 1 + include/09.paging/deo4 | 12 +++ include/09.paging/deo5 | 1 + include/09.paging/deo6 | 4 + include/09.paging/deo7 | 7 ++ include/09.paging/deo8 | 3 + include/09.paging/deo9 | 7 ++ include/09.paging/paging.c | 46 ++++++++++ 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/stdio.h | 9 +- include/10.libc/stdlib.h | 8 +- include/10.libc/string.h | 8 +- include/10.libc/sys/types.h | 2 + include/10.libc/unistd.h | 9 +- include/setup.sh | 47 ++++++++++ kernel.pdf | Bin 436239 -> 443380 bytes kernel.tex | 194 +++++++++++++++++++++++++-------------- 200 files changed, 1602 insertions(+), 709 deletions(-) create mode 100644 include/01.pocetak/boot.s delete mode 100644 include/01.pocetak/boot00.s delete mode 100644 include/01.pocetak/boot01.s delete mode 100644 include/01.pocetak/boot02.s delete mode 100644 include/01.pocetak/boot03.s create mode 100644 include/01.pocetak/deo1 create mode 100644 include/01.pocetak/deo10 create mode 100644 include/01.pocetak/deo11 create mode 100644 include/01.pocetak/deo12 create mode 100644 include/01.pocetak/deo2 create mode 100644 include/01.pocetak/deo3 create mode 100644 include/01.pocetak/deo4 create mode 100644 include/01.pocetak/deo5 create mode 100644 include/01.pocetak/deo6 create mode 100644 include/01.pocetak/deo7 create mode 100644 include/01.pocetak/deo8 create mode 100644 include/01.pocetak/deo9 create mode 100644 include/02.vga/deo1 create mode 100644 include/02.vga/deo10 create mode 100644 include/02.vga/deo11 create mode 100644 include/02.vga/deo12 create mode 100644 include/02.vga/deo13 create mode 100644 include/02.vga/deo14 create mode 100644 include/02.vga/deo2 create mode 100644 include/02.vga/deo3 create mode 100644 include/02.vga/deo4 create mode 100644 include/02.vga/deo5 create mode 100644 include/02.vga/deo6 create mode 100644 include/02.vga/deo7 create mode 100644 include/02.vga/deo8 create mode 100644 include/02.vga/deo9 create mode 100644 include/02.vga/vga.c delete mode 100644 include/02.vga/vga00.c delete mode 100644 include/02.vga/vga01.c delete mode 100644 include/02.vga/vga02.c delete mode 100644 include/02.vga/vga03.c delete mode 100644 include/02.vga/vga04.c delete mode 100644 include/02.vga/vga05.c delete mode 100644 include/02.vga/vga06.c delete mode 100644 include/02.vga/vga07.c delete mode 100644 include/02.vga/vga08.c delete mode 100644 include/02.vga/vga09.c delete mode 100644 include/02.vga/vga10.c delete mode 100644 include/02.vga/vga11.c create mode 100644 include/03.gdt/deo1 create mode 100644 include/03.gdt/deo2 create mode 100644 include/03.gdt/deo3 create mode 100644 include/03.gdt/deo4 create mode 100644 include/03.gdt/deo5 create mode 100644 include/03.gdt/deo6 create mode 100644 include/03.gdt/deo7 create mode 100644 include/03.gdt/deo8 create mode 100644 include/03.gdt/deo9 create mode 100644 include/03.gdt/gdt.c delete mode 100644 include/03.gdt/gdt00.c delete mode 100644 include/03.gdt/gdt01.c delete mode 100644 include/03.gdt/gdt02.c delete mode 100644 include/03.gdt/gdt03.c delete mode 100644 include/03.gdt/gdt04.c delete mode 100644 include/03.gdt/gdt05.c create mode 100644 include/04.idt/deo1 create mode 100644 include/04.idt/deo10 create mode 100644 include/04.idt/deo11 create mode 100644 include/04.idt/deo12 create mode 100644 include/04.idt/deo13 create mode 100644 include/04.idt/deo14 create mode 100644 include/04.idt/deo2 create mode 100644 include/04.idt/deo3 create mode 100644 include/04.idt/deo4 create mode 100644 include/04.idt/deo5 create mode 100644 include/04.idt/deo6 create mode 100644 include/04.idt/deo7 create mode 100644 include/04.idt/deo8 create mode 100644 include/04.idt/deo9 create mode 100644 include/04.idt/idt.c delete mode 100644 include/04.idt/idt00.c delete mode 100644 include/04.idt/idt01.c delete mode 100644 include/04.idt/idt02.c delete mode 100644 include/04.idt/idt03.c delete mode 100644 include/04.idt/idt04.c delete mode 100644 include/04.idt/idt05.c delete mode 100644 include/04.idt/idt06.c delete mode 100644 include/05.irq/idt07.c delete mode 100644 include/05.irq/idt08.c create mode 100644 include/06.keyboard/deo1 create mode 100644 include/06.keyboard/deo10 create mode 100644 include/06.keyboard/deo11 create mode 100644 include/06.keyboard/deo12 create mode 100644 include/06.keyboard/deo13 create mode 100644 include/06.keyboard/deo14 create mode 100644 include/06.keyboard/deo15 create mode 100644 include/06.keyboard/deo16 create mode 100644 include/06.keyboard/deo17 create mode 100644 include/06.keyboard/deo18 create mode 100644 include/06.keyboard/deo19 create mode 100644 include/06.keyboard/deo2 create mode 100644 include/06.keyboard/deo20 create mode 100644 include/06.keyboard/deo3 create mode 100644 include/06.keyboard/deo4 create mode 100644 include/06.keyboard/deo5 create mode 100644 include/06.keyboard/deo6 create mode 100644 include/06.keyboard/deo7 create mode 100644 include/06.keyboard/deo8 create mode 100644 include/06.keyboard/deo9 create mode 100644 include/06.keyboard/keyboard.c delete mode 100644 include/06.keyboard/keyboard00.c delete mode 100644 include/06.keyboard/keyboard01.c delete mode 100644 include/06.keyboard/keyboard02.c delete mode 100644 include/06.keyboard/keyboard03.c delete mode 100644 include/06.keyboard/keyboard04.c delete mode 100644 include/06.keyboard/keyboard05.c delete mode 100644 include/06.keyboard/keyboard06.c delete mode 100644 include/06.keyboard/keyboard07.c delete mode 100644 include/06.keyboard/keyboard08.c delete mode 100644 include/06.keyboard/keyboard09.c delete mode 100644 include/06.keyboard/keyboard10.c delete mode 100644 include/06.keyboard/keyboard11.c delete mode 100644 include/06.keyboard/keyboard12.c create mode 100644 include/07.pit/deo1 create mode 100644 include/07.pit/deo10 create mode 100644 include/07.pit/deo2 create mode 100644 include/07.pit/deo3 create mode 100644 include/07.pit/deo4 create mode 100644 include/07.pit/deo5 create mode 100644 include/07.pit/deo6 create mode 100644 include/07.pit/deo7 create mode 100644 include/07.pit/deo8 create mode 100644 include/07.pit/deo9 delete mode 100644 include/07.pit/pit00.c delete mode 100644 include/07.pit/pit01.c delete mode 100644 include/07.pit/pit02.c delete mode 100644 include/07.pit/pit03.c create mode 100644 include/07.pit/timer.c create mode 100644 include/08.heap/deo1 create mode 100644 include/08.heap/deo10 create mode 100644 include/08.heap/deo11 create mode 100644 include/08.heap/deo12 create mode 100644 include/08.heap/deo13 create mode 100644 include/08.heap/deo14 create mode 100644 include/08.heap/deo15 create mode 100644 include/08.heap/deo16 create mode 100644 include/08.heap/deo17 create mode 100644 include/08.heap/deo18 create mode 100644 include/08.heap/deo19 create mode 100644 include/08.heap/deo2 create mode 100644 include/08.heap/deo20 create mode 100644 include/08.heap/deo21 create mode 100644 include/08.heap/deo22 create mode 100644 include/08.heap/deo23 create mode 100644 include/08.heap/deo24 create mode 100644 include/08.heap/deo25 create mode 100644 include/08.heap/deo26 create mode 100644 include/08.heap/deo27 create mode 100644 include/08.heap/deo28 create mode 100644 include/08.heap/deo29 create mode 100644 include/08.heap/deo3 create mode 100644 include/08.heap/deo30 create mode 100644 include/08.heap/deo31 create mode 100644 include/08.heap/deo4 create mode 100644 include/08.heap/deo5 create mode 100644 include/08.heap/deo6 create mode 100644 include/08.heap/deo7 create mode 100644 include/08.heap/deo8 create mode 100644 include/08.heap/deo9 create mode 100644 include/08.heap/heap.c delete mode 100644 include/08.heap/heap00.c delete mode 100644 include/08.heap/heap01.c delete mode 100644 include/08.heap/heap02.c delete mode 100644 include/08.heap/heap03.c delete mode 100644 include/08.heap/heap04.c delete mode 100644 include/08.heap/heap05.c delete mode 100644 include/08.heap/heap06.c delete mode 100644 include/08.heap/heap07.c delete mode 100644 include/08.heap/heap08.c delete mode 100644 include/08.heap/heap09.c create mode 100644 include/09.paging/deo1 create mode 100644 include/09.paging/deo2 create mode 100644 include/09.paging/deo3 create mode 100644 include/09.paging/deo4 create mode 100644 include/09.paging/deo5 create mode 100644 include/09.paging/deo6 create mode 100644 include/09.paging/deo7 create mode 100644 include/09.paging/deo8 create mode 100644 include/09.paging/deo9 create mode 100644 include/09.paging/paging.c delete mode 100644 include/09.paging/paging00.c delete mode 100644 include/09.paging/paging01.c delete mode 100644 include/09.paging/paging02.c delete mode 100644 include/09.paging/paging03.c delete mode 100644 include/09.paging/paging04.c delete mode 100644 include/09.paging/paging05.c create mode 100755 include/setup.sh diff --git a/Makefile b/Makefile index e623549..881f5be 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ TEX_FILE=$(NAME).tex BIB_FILE=$(NAME).bib PDF_FILE=$(NAME).pdf -.PHONY: all +.PHONY: all clean all: $(PDF_FILE) @@ -11,3 +11,6 @@ $(PDF_FILE): $(TEX_FILE) $(BIB_FILE) pdflatex $(TEX_FILE) bibtex $(NAME) pdflatex $(TEX_FILE) + +clean: + rm $(PDF_FILE) diff --git a/include/01.pocetak/boot.s b/include/01.pocetak/boot.s new file mode 100644 index 0000000..907cd3c --- /dev/null +++ b/include/01.pocetak/boot.s @@ -0,0 +1,70 @@ +.set ALIGN, 1<<0 +.set MEMINFO, 1<<1 +.set FLAGS, ALIGN | MEMINFO +.set MAGIC, 0x1BADB002 +.set CHECKSUM, -(MAGIC + FLAGS) + +.section .multiboot +.align 4 +.long MAGIC +.long FLAGS +.long CHECKSUM + +.global _start +.global load_gdt +.global load_idt +.global enable_interrupts +.global ioport_in +.global ioport_out + +load_gdt: + movl 4(%esp), %edx + lgdt (%edx) + ret + +load_idt: + movl 4(%esp), %edx + lidt (%edx) + sti + ret + +ioport_in: + movl 4(%esp),%edx + in %dx,%al + ret + +ioport_out: + movl 4(%esp),%edx + movl 8(%esp),%eax + outb %al,%dx + ret + +.set CODE_SEGMENT, 0x08 +.set DATA_SEGMENT, 0x10 + +.section .bss +.align 16 +stack_bottom: +.skip 16384 +stack_top: + +.section .text +.type _start, @function +_start: + call init_gdt_table + ljmp $CODE_SEGMENT, $code + +code: + movw $DATA_SEGMENT, %ax + movw %ax, %ds + movw %ax, %es + movw %ax, %fs + movw %ax, %gs + movw %ax, %ss + movl $stack_top, %esp + cli + call _init + call kernel_main + hlt + +.size _start, . - _start diff --git a/include/01.pocetak/boot00.s b/include/01.pocetak/boot00.s deleted file mode 100644 index 0e1bfbe..0000000 --- a/include/01.pocetak/boot00.s +++ /dev/null @@ -1,5 +0,0 @@ -.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 deleted file mode 100644 index cd7b353..0000000 --- a/include/01.pocetak/boot01.s +++ /dev/null @@ -1,5 +0,0 @@ -.section .multiboot -.align 4 -.long MAGIC -.long FLAGS -.long CHECKSUM diff --git a/include/01.pocetak/boot02.s b/include/01.pocetak/boot02.s deleted file mode 100644 index a9280a6..0000000 --- a/include/01.pocetak/boot02.s +++ /dev/null @@ -1,5 +0,0 @@ -.section .bss -.align 16 -stack_bottom: -.skip 16384 -stack_top: diff --git a/include/01.pocetak/boot03.s b/include/01.pocetak/boot03.s deleted file mode 100644 index 46a4e7f..0000000 --- a/include/01.pocetak/boot03.s +++ /dev/null @@ -1,11 +0,0 @@ -.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/01.pocetak/deo1 b/include/01.pocetak/deo1 new file mode 100644 index 0000000..0e1bfbe --- /dev/null +++ b/include/01.pocetak/deo1 @@ -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/deo10 b/include/01.pocetak/deo10 new file mode 100644 index 0000000..3cd7ea1 --- /dev/null +++ b/include/01.pocetak/deo10 @@ -0,0 +1,5 @@ +.section .text +.type _start, @function +_start: + call init_gdt_table + ljmp $CODE_SEGMENT, $code diff --git a/include/01.pocetak/deo11 b/include/01.pocetak/deo11 new file mode 100644 index 0000000..bd0f1da --- /dev/null +++ b/include/01.pocetak/deo11 @@ -0,0 +1,12 @@ +code: + movw $DATA_SEGMENT, %ax + movw %ax, %ds + movw %ax, %es + movw %ax, %fs + movw %ax, %gs + movw %ax, %ss + movl $stack_top, %esp + cli + call _init + call kernel_main + hlt diff --git a/include/01.pocetak/deo12 b/include/01.pocetak/deo12 new file mode 100644 index 0000000..d1d8388 --- /dev/null +++ b/include/01.pocetak/deo12 @@ -0,0 +1 @@ +.size _start, . - _start diff --git a/include/01.pocetak/deo2 b/include/01.pocetak/deo2 new file mode 100644 index 0000000..cd7b353 --- /dev/null +++ b/include/01.pocetak/deo2 @@ -0,0 +1,5 @@ +.section .multiboot +.align 4 +.long MAGIC +.long FLAGS +.long CHECKSUM diff --git a/include/01.pocetak/deo3 b/include/01.pocetak/deo3 new file mode 100644 index 0000000..44fcb34 --- /dev/null +++ b/include/01.pocetak/deo3 @@ -0,0 +1,6 @@ +.global _start +.global load_gdt +.global load_idt +.global enable_interrupts +.global ioport_in +.global ioport_out diff --git a/include/01.pocetak/deo4 b/include/01.pocetak/deo4 new file mode 100644 index 0000000..975ee19 --- /dev/null +++ b/include/01.pocetak/deo4 @@ -0,0 +1,4 @@ +load_gdt: + movl 4(%esp), %edx + lgdt (%edx) + ret diff --git a/include/01.pocetak/deo5 b/include/01.pocetak/deo5 new file mode 100644 index 0000000..6f095e9 --- /dev/null +++ b/include/01.pocetak/deo5 @@ -0,0 +1,5 @@ +load_idt: + movl 4(%esp), %edx + lidt (%edx) + sti + ret diff --git a/include/01.pocetak/deo6 b/include/01.pocetak/deo6 new file mode 100644 index 0000000..3f23d36 --- /dev/null +++ b/include/01.pocetak/deo6 @@ -0,0 +1,4 @@ +ioport_in: + movl 4(%esp),%edx + in %dx,%al + ret diff --git a/include/01.pocetak/deo7 b/include/01.pocetak/deo7 new file mode 100644 index 0000000..f441d17 --- /dev/null +++ b/include/01.pocetak/deo7 @@ -0,0 +1,5 @@ +ioport_out: + movl 4(%esp),%edx + movl 8(%esp),%eax + outb %al,%dx + ret diff --git a/include/01.pocetak/deo8 b/include/01.pocetak/deo8 new file mode 100644 index 0000000..cd3f772 --- /dev/null +++ b/include/01.pocetak/deo8 @@ -0,0 +1,2 @@ +.set CODE_SEGMENT, 0x08 +.set DATA_SEGMENT, 0x10 diff --git a/include/01.pocetak/deo9 b/include/01.pocetak/deo9 new file mode 100644 index 0000000..a9280a6 --- /dev/null +++ b/include/01.pocetak/deo9 @@ -0,0 +1,5 @@ +.section .bss +.align 16 +stack_bottom: +.skip 16384 +stack_top: diff --git a/include/02.vga/deo1 b/include/02.vga/deo1 new file mode 100644 index 0000000..dfee578 --- /dev/null +++ b/include/02.vga/deo1 @@ -0,0 +1,4 @@ +#include +#include +#include +#include diff --git a/include/02.vga/deo10 b/include/02.vga/deo10 new file mode 100644 index 0000000..9511b21 --- /dev/null +++ b/include/02.vga/deo10 @@ -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/deo11 b/include/02.vga/deo11 new file mode 100644 index 0000000..8a757f4 --- /dev/null +++ b/include/02.vga/deo11 @@ -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/deo12 b/include/02.vga/deo12 new file mode 100644 index 0000000..be40f5a --- /dev/null +++ b/include/02.vga/deo12 @@ -0,0 +1,8 @@ +void terminal_writeint(uint32_t num) +{ + char string[100]; + for(int i=0;i<100;i++) string[i]='\0'; + char *str=string; + itos(num,str); + terminal_writestring(str); +} diff --git a/include/02.vga/deo13 b/include/02.vga/deo13 new file mode 100644 index 0000000..dfa3994 --- /dev/null +++ b/include/02.vga/deo13 @@ -0,0 +1,8 @@ +void terminal_writefloat(double num) +{ + char string[100]; + for(int i=0;i<100;i++) string[i]='\0'; + char *str=string; + ftos(num,str); + terminal_writestring(str); +} diff --git a/include/02.vga/deo14 b/include/02.vga/deo14 new file mode 100644 index 0000000..efe6d3a --- /dev/null +++ b/include/02.vga/deo14 @@ -0,0 +1,6 @@ +void clear() +{ + for(size_t i=0;i +#include +#include +#include + +size_t terminal_row; +size_t terminal_column; +uint8_t terminal_color; +uint16_t* terminal_buffer; + +void set_color(enum vga_color fg, enum vga_color bg) +{ + terminal_color = fg | bg << 4; +} + +static inline uint16_t vga_entry(unsigned char uc, uint8_t color) +{ + return (uint16_t) uc | (uint16_t) color << 8; +} + +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 -#include -#include -#include diff --git a/include/02.vga/vga01.c b/include/02.vga/vga01.c deleted file mode 100644 index be0ba00..0000000 --- a/include/02.vga/vga01.c +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 5a12424..0000000 --- a/include/02.vga/vga02.c +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 173e598..0000000 --- a/include/02.vga/vga03.c +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 50a7d65..0000000 --- a/include/02.vga/vga04.c +++ /dev/null @@ -1,15 +0,0 @@ -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/deo2 b/include/03.gdt/deo2 new file mode 100644 index 0000000..cbc5e1d --- /dev/null +++ b/include/03.gdt/deo2 @@ -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/deo3 b/include/03.gdt/deo3 new file mode 100644 index 0000000..e708661 --- /dev/null +++ b/include/03.gdt/deo3 @@ -0,0 +1,5 @@ +struct gdt_pointer +{ + uint16_t size; + uint32_t offset; +} __attribute__((packed)); diff --git a/include/03.gdt/deo4 b/include/03.gdt/deo4 new file mode 100644 index 0000000..1abf809 --- /dev/null +++ b/include/03.gdt/deo4 @@ -0,0 +1 @@ +extern void load_gdt(struct gdt_pointer *gdtp); diff --git a/include/03.gdt/deo5 b/include/03.gdt/deo5 new file mode 100644 index 0000000..ba7c6e2 --- /dev/null +++ b/include/03.gdt/deo5 @@ -0,0 +1,2 @@ +struct gdt_entry gdt[5]; +struct gdt_pointer gdtp; diff --git a/include/03.gdt/deo6 b/include/03.gdt/deo6 new file mode 100644 index 0000000..8d6a1f0 --- /dev/null +++ b/include/03.gdt/deo6 @@ -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/deo7 b/include/03.gdt/deo7 new file mode 100644 index 0000000..d69d009 --- /dev/null +++ b/include/03.gdt/deo7 @@ -0,0 +1,4 @@ +void init_gdt_table() +{ + gdtp.size=sizeof(gdt)-1; + gdtp.offset=(uint32_t)&gdt; diff --git a/include/03.gdt/deo8 b/include/03.gdt/deo8 new file mode 100644 index 0000000..a122d84 --- /dev/null +++ b/include/03.gdt/deo8 @@ -0,0 +1,5 @@ + 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 diff --git a/include/03.gdt/deo9 b/include/03.gdt/deo9 new file mode 100644 index 0000000..89736a5 --- /dev/null +++ b/include/03.gdt/deo9 @@ -0,0 +1,2 @@ + load_gdt(&gdtp); +} diff --git a/include/03.gdt/gdt.c b/include/03.gdt/gdt.c new file mode 100644 index 0000000..e3d2b4c --- /dev/null +++ b/include/03.gdt/gdt.c @@ -0,0 +1,46 @@ +#include + +struct gdt_entry +{ + uint16_t limit; + uint16_t base1; + uint8_t base2; + uint8_t access; + uint8_t limit_flags; + uint8_t base3; +} __attribute__((packed)); + +struct gdt_pointer +{ + uint16_t size; + uint32_t offset; +} __attribute__((packed)); + +extern void load_gdt(struct gdt_pointer *gdtp); + +struct gdt_entry gdt[5]; +struct gdt_pointer gdtp; + +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; +} + +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/03.gdt/gdt00.c b/include/03.gdt/gdt00.c deleted file mode 100644 index c45e28b..0000000 --- a/include/03.gdt/gdt00.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/03.gdt/gdt01.c b/include/03.gdt/gdt01.c deleted file mode 100644 index cbc5e1d..0000000 --- a/include/03.gdt/gdt01.c +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index e708661..0000000 --- a/include/03.gdt/gdt02.c +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 94c8cd3..0000000 --- a/include/03.gdt/gdt03.c +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100644 index 8d6a1f0..0000000 --- a/include/03.gdt/gdt04.c +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index d525a13..0000000 --- a/include/03.gdt/gdt05.c +++ /dev/null @@ -1,13 +0,0 @@ -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/deo1 b/include/04.idt/deo1 new file mode 100644 index 0000000..7c174c9 --- /dev/null +++ b/include/04.idt/deo1 @@ -0,0 +1,3 @@ +#include +#include +#include diff --git a/include/04.idt/deo10 b/include/04.idt/deo10 new file mode 100644 index 0000000..409dd15 --- /dev/null +++ b/include/04.idt/deo10 @@ -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/04.idt/deo11 b/include/04.idt/deo11 new file mode 100644 index 0000000..055e22a --- /dev/null +++ b/include/04.idt/deo11 @@ -0,0 +1,14 @@ +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/04.idt/deo12 b/include/04.idt/deo12 new file mode 100644 index 0000000..ea57b35 --- /dev/null +++ b/include/04.idt/deo12 @@ -0,0 +1,37 @@ +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); diff --git a/include/04.idt/deo13 b/include/04.idt/deo13 new file mode 100644 index 0000000..427144b --- /dev/null +++ b/include/04.idt/deo13 @@ -0,0 +1,2 @@ + idtp.size=sizeof(struct idt_entry)*256-1; + idtp.offset=(uint32_t)&idt; diff --git a/include/04.idt/deo14 b/include/04.idt/deo14 new file mode 100644 index 0000000..8442fdc --- /dev/null +++ b/include/04.idt/deo14 @@ -0,0 +1,2 @@ + load_idt(&idtp); +} diff --git a/include/04.idt/deo2 b/include/04.idt/deo2 new file mode 100644 index 0000000..afb8506 --- /dev/null +++ b/include/04.idt/deo2 @@ -0,0 +1 @@ +#define INTERRUPT_GATE_32 0x8E diff --git a/include/04.idt/deo3 b/include/04.idt/deo3 new file mode 100644 index 0000000..c564d8a --- /dev/null +++ b/include/04.idt/deo3 @@ -0,0 +1,2 @@ +#define KERNEL_CODE 0x08 +#define KERNEL_DATA 0x10 diff --git a/include/04.idt/deo4 b/include/04.idt/deo4 new file mode 100644 index 0000000..ca70fa7 --- /dev/null +++ b/include/04.idt/deo4 @@ -0,0 +1,4 @@ +#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/deo5 b/include/04.idt/deo5 new file mode 100644 index 0000000..dcab25c --- /dev/null +++ b/include/04.idt/deo5 @@ -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/deo6 b/include/04.idt/deo6 new file mode 100644 index 0000000..fe1bff5 --- /dev/null +++ b/include/04.idt/deo6 @@ -0,0 +1,5 @@ +struct idt_pointer +{ + uint16_t size; + uint32_t offset; +} __attribute__((packed)); diff --git a/include/04.idt/deo7 b/include/04.idt/deo7 new file mode 100644 index 0000000..ffa0e82 --- /dev/null +++ b/include/04.idt/deo7 @@ -0,0 +1,2 @@ +extern void load_idt(struct idt_pointer *idtp); +extern void keyboard_irq(); diff --git a/include/04.idt/deo8 b/include/04.idt/deo8 new file mode 100644 index 0000000..28b2298 --- /dev/null +++ b/include/04.idt/deo8 @@ -0,0 +1,2 @@ +struct idt_entry idt[256]; +struct idt_pointer idtp; diff --git a/include/04.idt/deo9 b/include/04.idt/deo9 new file mode 100644 index 0000000..d11c19e --- /dev/null +++ b/include/04.idt/deo9 @@ -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/idt.c b/include/04.idt/idt.c new file mode 100644 index 0000000..843c9da --- /dev/null +++ b/include/04.idt/idt.c @@ -0,0 +1,108 @@ +#include +#include +#include + +#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 + +struct idt_entry +{ + uint16_t offset1; + uint16_t selector; + uint8_t zero; + uint8_t type_attr; + uint16_t offset2; +} __attribute__((packed)); + +struct idt_pointer +{ + uint16_t size; + uint32_t offset; +} __attribute__((packed)); + + +extern void load_idt(struct idt_pointer *idtp); +extern void keyboard_irq(); + +struct idt_entry idt[256]; +struct idt_pointer idtp; + +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; +} + +void add_idt_entry(size_t num,uint32_t offset) +{ + init_idt_entry(num,offset,KERNEL_CODE,INTERRUPT_GATE_32); +} + +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); +} + +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/04.idt/idt00.c b/include/04.idt/idt00.c deleted file mode 100644 index 7c174c9..0000000 --- a/include/04.idt/idt00.c +++ /dev/null @@ -1,3 +0,0 @@ -#include -#include -#include diff --git a/include/04.idt/idt01.c b/include/04.idt/idt01.c deleted file mode 100644 index c2b91e5..0000000 --- a/include/04.idt/idt01.c +++ /dev/null @@ -1,7 +0,0 @@ -#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 deleted file mode 100644 index dcab25c..0000000 --- a/include/04.idt/idt02.c +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index fe1bff5..0000000 --- a/include/04.idt/idt03.c +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 329ce75..0000000 --- a/include/04.idt/idt04.c +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index d11c19e..0000000 --- a/include/04.idt/idt05.c +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index 409dd15..0000000 --- a/include/04.idt/idt06.c +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index a0d32d2..0000000 --- a/include/05.irq/idt07.c +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index d5754f7..0000000 --- a/include/05.irq/idt08.c +++ /dev/null @@ -1,44 +0,0 @@ -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/deo1 b/include/06.keyboard/deo1 new file mode 100644 index 0000000..13fd550 --- /dev/null +++ b/include/06.keyboard/deo1 @@ -0,0 +1,3 @@ +#include +#include +#include diff --git a/include/06.keyboard/deo10 b/include/06.keyboard/deo10 new file mode 100644 index 0000000..e5d558c --- /dev/null +++ b/include/06.keyboard/deo10 @@ -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 + +#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; + +#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 + +void previous_field(void); +void tty(char *buffer); +void prompt(void); +void clear(); +void us_en(char keymap[]); +void us_en_shift(char keymap[]); + +char charcode[256]; +char shift_charcode[256]; +bool ispressed[128]; +#define lshift 0x2A +#define rshift 0x36 +#define lctrl 0x1D +#define rctrl 0x1D + +void init_keyboard() +{ + us_en(charcode); + us_en_shift(shift_charcode); +} + +void deletelast() +{ + previous_field(); + printf(" "); + previous_field(); +} + +void backspace() +{ + if(buffer_index<=0) return; + + deletelast(); + buffer[buffer_current][--buffer_index]='\0'; + return; +} + +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/06.keyboard/keyboard01.c b/include/06.keyboard/keyboard01.c deleted file mode 100644 index 50d7c07..0000000 --- a/include/06.keyboard/keyboard01.c +++ /dev/null @@ -1,7 +0,0 @@ -#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 deleted file mode 100644 index 239c874..0000000 --- a/include/06.keyboard/keyboard02.c +++ /dev/null @@ -1,7 +0,0 @@ -#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 deleted file mode 100644 index 3322fd7..0000000 --- a/include/06.keyboard/keyboard03.c +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index cc6e7d5..0000000 --- a/include/06.keyboard/keyboard04.c +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index 5c089ce..0000000 --- a/include/06.keyboard/keyboard05.c +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 55e04b8..0000000 --- a/include/06.keyboard/keyboard06.c +++ /dev/null @@ -1,6 +0,0 @@ -void deletelast() -{ - previous_field(); - printf(" "); - previous_field(); -} diff --git a/include/06.keyboard/keyboard07.c b/include/06.keyboard/keyboard07.c deleted file mode 100644 index 480abb1..0000000 --- a/include/06.keyboard/keyboard07.c +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index 822e038..0000000 --- a/include/06.keyboard/keyboard08.c +++ /dev/null @@ -1,18 +0,0 @@ -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/deo10 b/include/07.pit/deo10 new file mode 100644 index 0000000..208a223 --- /dev/null +++ b/include/07.pit/deo10 @@ -0,0 +1,4 @@ + // Send the frequency divisor. + ioport_out(0x40, l); + ioport_out(0x40, h); +} diff --git a/include/07.pit/deo2 b/include/07.pit/deo2 new file mode 100644 index 0000000..dfa7284 --- /dev/null +++ b/include/07.pit/deo2 @@ -0,0 +1 @@ +void add_idt_entry(size_t num,uint32_t offset); diff --git a/include/07.pit/deo3 b/include/07.pit/deo3 new file mode 100644 index 0000000..025eb31 --- /dev/null +++ b/include/07.pit/deo3 @@ -0,0 +1,4 @@ +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/deo4 b/include/07.pit/deo4 new file mode 100644 index 0000000..8eba051 --- /dev/null +++ b/include/07.pit/deo4 @@ -0,0 +1,9 @@ +void timer_handler() +{ + tick++; + if(tick==TICKS_PER_SECOND) + { + //printf("%d seconds passed\n",time); + tick=0; + time++; + } diff --git a/include/07.pit/deo5 b/include/07.pit/deo5 new file mode 100644 index 0000000..eaf7bcf --- /dev/null +++ b/include/07.pit/deo5 @@ -0,0 +1,3 @@ + ioport_out(0x20, 0x20); + ioport_out(0xa0,0x20); +} diff --git a/include/07.pit/deo6 b/include/07.pit/deo6 new file mode 100644 index 0000000..12cee6a --- /dev/null +++ b/include/07.pit/deo6 @@ -0,0 +1,3 @@ +void init_timer(uint32_t frequency) +{ + // Firstly, register our timer callback. diff --git a/include/07.pit/deo7 b/include/07.pit/deo7 new file mode 100644 index 0000000..c780ebc --- /dev/null +++ b/include/07.pit/deo7 @@ -0,0 +1,4 @@ + // 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; diff --git a/include/07.pit/deo8 b/include/07.pit/deo8 new file mode 100644 index 0000000..8c64aaf --- /dev/null +++ b/include/07.pit/deo8 @@ -0,0 +1,2 @@ + // Send the command byte. + ioport_out(0x43, 0x36); diff --git a/include/07.pit/deo9 b/include/07.pit/deo9 new file mode 100644 index 0000000..1deca04 --- /dev/null +++ b/include/07.pit/deo9 @@ -0,0 +1,3 @@ + // 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 ); diff --git a/include/07.pit/pit00.c b/include/07.pit/pit00.c deleted file mode 100644 index 13fd550..0000000 --- a/include/07.pit/pit00.c +++ /dev/null @@ -1,3 +0,0 @@ -#include -#include -#include diff --git a/include/07.pit/pit01.c b/include/07.pit/pit01.c deleted file mode 100644 index c199373..0000000 --- a/include/07.pit/pit01.c +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 523d14b..0000000 --- a/include/07.pit/pit02.c +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index 287adba..0000000 --- a/include/07.pit/pit03.c +++ /dev/null @@ -1,20 +0,0 @@ -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/07.pit/timer.c b/include/07.pit/timer.c new file mode 100644 index 0000000..390e512 --- /dev/null +++ b/include/07.pit/timer.c @@ -0,0 +1,45 @@ +#include +#include +#include + +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; + +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); +} + +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/deo1 b/include/08.heap/deo1 new file mode 100644 index 0000000..c45e28b --- /dev/null +++ b/include/08.heap/deo1 @@ -0,0 +1 @@ +#include diff --git a/include/08.heap/deo10 b/include/08.heap/deo10 new file mode 100644 index 0000000..fd64ff9 --- /dev/null +++ b/include/08.heap/deo10 @@ -0,0 +1,5 @@ + /* reserve room for bitmap */ + bcnt = (bcnt / bsize) * bsize < bcnt ? bcnt / bsize + 1 : bcnt / bsize; + for (x = 0; x < bcnt; ++x) { + bm[x] = 5; + } diff --git a/include/08.heap/deo11 b/include/08.heap/deo11 new file mode 100644 index 0000000..a61193b --- /dev/null +++ b/include/08.heap/deo11 @@ -0,0 +1,4 @@ + b->lfb = bcnt - 1; + b->used = bcnt; + return 1; +} diff --git a/include/08.heap/deo12 b/include/08.heap/deo12 new file mode 100644 index 0000000..84c5721 --- /dev/null +++ b/include/08.heap/deo12 @@ -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/deo13 b/include/08.heap/deo13 new file mode 100644 index 0000000..369c3f3 --- /dev/null +++ b/include/08.heap/deo13 @@ -0,0 +1,7 @@ +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; diff --git a/include/08.heap/deo14 b/include/08.heap/deo14 new file mode 100644 index 0000000..8bfb6f0 --- /dev/null +++ b/include/08.heap/deo14 @@ -0,0 +1,4 @@ + /* iterate blocks */ + for (b = heap->fblock; b; b = b->next) { + /* check if block has enough room */ + if (b->size - (b->used * b->bsize) >= size) { diff --git a/include/08.heap/deo15 b/include/08.heap/deo15 new file mode 100644 index 0000000..a867821 --- /dev/null +++ b/include/08.heap/deo15 @@ -0,0 +1,3 @@ + bcnt = b->size / b->bsize; + bneed = (size / b->bsize) * b->bsize < size ? size / b->bsize + 1 : size / b->bsize; + bm = (uint8_t*)&b[1]; diff --git a/include/08.heap/deo16 b/include/08.heap/deo16 new file mode 100644 index 0000000..78f4675 --- /dev/null +++ b/include/08.heap/deo16 @@ -0,0 +1,5 @@ + for (x = (b->lfb + 1 >= bcnt ? 0 : b->lfb + 1); x != b->lfb; ++x) { + /* just wrap around */ + if (x >= bcnt) { + x = 0; + } diff --git a/include/08.heap/deo17 b/include/08.heap/deo17 new file mode 100644 index 0000000..d20be4c --- /dev/null +++ b/include/08.heap/deo17 @@ -0,0 +1,3 @@ + if (bm[x] == 0) { + /* count free blocks */ + for (y = 0; bm[x + y] == 0 && y < bneed && (x + y) < bcnt; ++y); diff --git a/include/08.heap/deo18 b/include/08.heap/deo18 new file mode 100644 index 0000000..fed8463 --- /dev/null +++ b/include/08.heap/deo18 @@ -0,0 +1,4 @@ + /* 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]); diff --git a/include/08.heap/deo19 b/include/08.heap/deo19 new file mode 100644 index 0000000..9b49484 --- /dev/null +++ b/include/08.heap/deo19 @@ -0,0 +1,4 @@ + /* allocate by setting id */ + for (z = 0; z < y; ++z) { + bm[x + z] = nid; + } diff --git a/include/08.heap/deo2 b/include/08.heap/deo2 new file mode 100644 index 0000000..2a69314 --- /dev/null +++ b/include/08.heap/deo2 @@ -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/deo20 b/include/08.heap/deo20 new file mode 100644 index 0000000..f141368 --- /dev/null +++ b/include/08.heap/deo20 @@ -0,0 +1,2 @@ + /* optimization */ + b->lfb = (x + bneed) - 2; diff --git a/include/08.heap/deo21 b/include/08.heap/deo21 new file mode 100644 index 0000000..8fd73e2 --- /dev/null +++ b/include/08.heap/deo21 @@ -0,0 +1,2 @@ + /* count used blocks NOT bytes */ + b->used += y; diff --git a/include/08.heap/deo22 b/include/08.heap/deo22 new file mode 100644 index 0000000..98c1157 --- /dev/null +++ b/include/08.heap/deo22 @@ -0,0 +1,2 @@ + return (void*)(x * b->bsize + (uintptr_t)&b[1]); + } diff --git a/include/08.heap/deo23 b/include/08.heap/deo23 new file mode 100644 index 0000000..21aa8c8 --- /dev/null +++ b/include/08.heap/deo23 @@ -0,0 +1,9 @@ + /* x will be incremented by one ONCE more in our FOR loop */ + x += (y - 1); + continue; + } + } + } + } + return 0; +} diff --git a/include/08.heap/deo24 b/include/08.heap/deo24 new file mode 100644 index 0000000..e9c116b --- /dev/null +++ b/include/08.heap/deo24 @@ -0,0 +1,7 @@ +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; diff --git a/include/08.heap/deo25 b/include/08.heap/deo25 new file mode 100644 index 0000000..1a22151 --- /dev/null +++ b/include/08.heap/deo25 @@ -0,0 +1,20 @@ + 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; + } + } diff --git a/include/08.heap/deo26 b/include/08.heap/deo26 new file mode 100644 index 0000000..11a4697 --- /dev/null +++ b/include/08.heap/deo26 @@ -0,0 +1,3 @@ + /* this error needs to be raised or reported somehow */ + return; +} diff --git a/include/08.heap/deo27 b/include/08.heap/deo27 new file mode 100644 index 0000000..6ac75a9 --- /dev/null +++ b/include/08.heap/deo27 @@ -0,0 +1 @@ +KHEAPBM kheap; diff --git a/include/08.heap/deo28 b/include/08.heap/deo28 new file mode 100644 index 0000000..6d7223d --- /dev/null +++ b/include/08.heap/deo28 @@ -0,0 +1,4 @@ +void kheapinit() +{ + k_heapBMInit(&kheap); +} diff --git a/include/08.heap/deo29 b/include/08.heap/deo29 new file mode 100644 index 0000000..de767a2 --- /dev/null +++ b/include/08.heap/deo29 @@ -0,0 +1,4 @@ +int kheapaddblock(uintptr_t addr,uint32_t size,uint32_t bsize) +{ + return k_heapBMAddBlock(&kheap,addr,size,bsize); +} diff --git a/include/08.heap/deo3 b/include/08.heap/deo3 new file mode 100644 index 0000000..d07786d --- /dev/null +++ b/include/08.heap/deo3 @@ -0,0 +1,3 @@ +typedef struct _KHEAPBM { + KHEAPBLOCKBM *fblock; +} KHEAPBM; diff --git a/include/08.heap/deo30 b/include/08.heap/deo30 new file mode 100644 index 0000000..22972f4 --- /dev/null +++ b/include/08.heap/deo30 @@ -0,0 +1,4 @@ +void *kmalloc(uint32_t size) +{ + return k_heapBMAlloc(&kheap,size); +} diff --git a/include/08.heap/deo31 b/include/08.heap/deo31 new file mode 100644 index 0000000..d4d5941 --- /dev/null +++ b/include/08.heap/deo31 @@ -0,0 +1,4 @@ +void kfree(void *ptr) +{ + k_heapBMFree(&kheap,ptr); +} diff --git a/include/08.heap/deo4 b/include/08.heap/deo4 new file mode 100644 index 0000000..c2dc3b5 --- /dev/null +++ b/include/08.heap/deo4 @@ -0,0 +1,3 @@ +void k_heapBMInit(KHEAPBM *heap) { + heap->fblock = 0; +} diff --git a/include/08.heap/deo5 b/include/08.heap/deo5 new file mode 100644 index 0000000..8eda156 --- /dev/null +++ b/include/08.heap/deo5 @@ -0,0 +1,5 @@ +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; diff --git a/include/08.heap/deo6 b/include/08.heap/deo6 new file mode 100644 index 0000000..024a09a --- /dev/null +++ b/include/08.heap/deo6 @@ -0,0 +1,3 @@ + b = (KHEAPBLOCKBM*)addr; + b->size = size - sizeof(KHEAPBLOCKBM); + b->bsize = bsize; diff --git a/include/08.heap/deo7 b/include/08.heap/deo7 new file mode 100644 index 0000000..c816b2c --- /dev/null +++ b/include/08.heap/deo7 @@ -0,0 +1,2 @@ + b->next = heap->fblock; + heap->fblock = b; diff --git a/include/08.heap/deo8 b/include/08.heap/deo8 new file mode 100644 index 0000000..3a9ea03 --- /dev/null +++ b/include/08.heap/deo8 @@ -0,0 +1,2 @@ + bcnt = b->size / b->bsize; + bm = (uint8_t*)&b[1]; diff --git a/include/08.heap/deo9 b/include/08.heap/deo9 new file mode 100644 index 0000000..7183948 --- /dev/null +++ b/include/08.heap/deo9 @@ -0,0 +1,4 @@ + /* clear bitmap */ + for (x = 0; x < bcnt; ++x) { + bm[x] = 0; + } diff --git a/include/08.heap/heap.c b/include/08.heap/heap.c new file mode 100644 index 0000000..99d0a37 --- /dev/null +++ b/include/08.heap/heap.c @@ -0,0 +1,166 @@ +#include + +typedef struct _KHEAPBLOCKBM { + struct _KHEAPBLOCKBM *next; + uint32_t size; + uint32_t used; + uint32_t bsize; + uint32_t lfb; +} KHEAPBLOCKBM; + +typedef struct _KHEAPBM { + KHEAPBLOCKBM *fblock; +} KHEAPBM; + +void k_heapBMInit(KHEAPBM *heap) { + heap->fblock = 0; +} + +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; +} + +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; +} + +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) { + /* 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]; + + 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; +} + +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; +} + +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); +} + +void *kmalloc(uint32_t size) +{ + return k_heapBMAlloc(&kheap,size); +} + +void kfree(void *ptr) +{ + k_heapBMFree(&kheap,ptr); +} diff --git a/include/08.heap/heap00.c b/include/08.heap/heap00.c deleted file mode 100644 index c45e28b..0000000 --- a/include/08.heap/heap00.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/08.heap/heap01.c b/include/08.heap/heap01.c deleted file mode 100644 index e7f4f84..0000000 --- a/include/08.heap/heap01.c +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index e46dc38..0000000 --- a/include/08.heap/heap02.c +++ /dev/null @@ -1,3 +0,0 @@ -typedef struct _KHEAPBM { - KHEAPBLOCKBM *fblock; -} KHEAPBM; diff --git a/include/08.heap/heap03.c b/include/08.heap/heap03.c deleted file mode 100644 index 9e2fe89..0000000 --- a/include/08.heap/heap03.c +++ /dev/null @@ -1,3 +0,0 @@ -void k_heapBMInit(KHEAPBM *heap) { - heap->fblock = 0; -} diff --git a/include/08.heap/heap04.c b/include/08.heap/heap04.c deleted file mode 100644 index be39951..0000000 --- a/include/08.heap/heap04.c +++ /dev/null @@ -1,33 +0,0 @@ -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 deleted file mode 100644 index 1856ca5..0000000 --- a/include/08.heap/heap05.c +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 5ad2787..0000000 --- a/include/08.heap/heap06.c +++ /dev/null @@ -1,58 +0,0 @@ -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 deleted file mode 100644 index 5686cd4..0000000 --- a/include/08.heap/heap07.c +++ /dev/null @@ -1,32 +0,0 @@ -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 deleted file mode 100644 index 05cf132..0000000 --- a/include/08.heap/heap08.c +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 6874578..0000000 --- a/include/08.heap/heap09.c +++ /dev/null @@ -1,9 +0,0 @@ -void *kmalloc(uint32_t size) -{ - return k_heapBMAlloc(&kheap,size); - -} -void kfree(void *ptr) -{ - k_heapBMFree(&kheap,ptr); -} diff --git a/include/09.paging/deo1 b/include/09.paging/deo1 new file mode 100644 index 0000000..c45e28b --- /dev/null +++ b/include/09.paging/deo1 @@ -0,0 +1 @@ +#include diff --git a/include/09.paging/deo2 b/include/09.paging/deo2 new file mode 100644 index 0000000..b56d18e --- /dev/null +++ b/include/09.paging/deo2 @@ -0,0 +1,2 @@ +extern void loadPageDirectory(uint32_t*); +extern void enablePaging(); diff --git a/include/09.paging/deo3 b/include/09.paging/deo3 new file mode 100644 index 0000000..cbfbd25 --- /dev/null +++ b/include/09.paging/deo3 @@ -0,0 +1 @@ +uint32_t page_directory[1024] __attribute__((aligned(4096))); diff --git a/include/09.paging/deo4 b/include/09.paging/deo4 new file mode 100644 index 0000000..6905d35 --- /dev/null +++ b/include/09.paging/deo4 @@ -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/deo5 b/include/09.paging/deo5 new file mode 100644 index 0000000..57f997d --- /dev/null +++ b/include/09.paging/deo5 @@ -0,0 +1 @@ +uint32_t page_table[1024][1024] __attribute__((aligned(4096))); diff --git a/include/09.paging/deo6 b/include/09.paging/deo6 new file mode 100644 index 0000000..4e670bb --- /dev/null +++ b/include/09.paging/deo6 @@ -0,0 +1,4 @@ +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. diff --git a/include/09.paging/deo7 b/include/09.paging/deo7 new file mode 100644 index 0000000..5898f28 --- /dev/null +++ b/include/09.paging/deo7 @@ -0,0 +1,7 @@ + //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. + } diff --git a/include/09.paging/deo8 b/include/09.paging/deo8 new file mode 100644 index 0000000..b842a0c --- /dev/null +++ b/include/09.paging/deo8 @@ -0,0 +1,3 @@ + page_directory[num] = ((uint32_t)page_table[num]) | 3; + // attributes: supervisor level, read/write, present +} diff --git a/include/09.paging/deo9 b/include/09.paging/deo9 new file mode 100644 index 0000000..d99797b --- /dev/null +++ b/include/09.paging/deo9 @@ -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/09.paging/paging.c b/include/09.paging/paging.c new file mode 100644 index 0000000..f08530d --- /dev/null +++ b/include/09.paging/paging.c @@ -0,0 +1,46 @@ +#include + +extern void loadPageDirectory(uint32_t*); +extern void enablePaging(); + +uint32_t page_directory[1024] __attribute__((aligned(4096))); + +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; + } +} + +uint32_t page_table[1024][1024] __attribute__((aligned(4096))); + +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 +} + +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/09.paging/paging00.c b/include/09.paging/paging00.c deleted file mode 100644 index c45e28b..0000000 --- a/include/09.paging/paging00.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/09.paging/paging01.c b/include/09.paging/paging01.c deleted file mode 100644 index 0789338..0000000 --- a/include/09.paging/paging01.c +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100644 index 8c00c89..0000000 --- a/include/09.paging/paging02.c +++ /dev/null @@ -1,12 +0,0 @@ -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 deleted file mode 100644 index 57f997d..0000000 --- a/include/09.paging/paging03.c +++ /dev/null @@ -1 +0,0 @@ -uint32_t page_table[1024][1024] __attribute__((aligned(4096))); diff --git a/include/09.paging/paging04.c b/include/09.paging/paging04.c deleted file mode 100644 index ad7507f..0000000 --- a/include/09.paging/paging04.c +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index d99797b..0000000 --- a/include/09.paging/paging05.c +++ /dev/null @@ -1,7 +0,0 @@ -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/stdio.h b/include/10.libc/stdio.h index 45c9215..6bb87be 100644 --- a/include/10.libc/stdio.h +++ b/include/10.libc/stdio.h @@ -1,12 +1,12 @@ #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*); @@ -22,7 +22,4 @@ 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 index a0afe38..77ffa67 100644 --- a/include/10.libc/stdlib.h +++ b/include/10.libc/stdlib.h @@ -1,15 +1,11 @@ #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 index bef5854..78fa956 100644 --- a/include/10.libc/string.h +++ b/include/10.libc/string.h @@ -1,16 +1,12 @@ #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 diff --git a/include/10.libc/sys/types.h b/include/10.libc/sys/types.h index 4f55189..34c1b65 100644 --- a/include/10.libc/sys/types.h +++ b/include/10.libc/sys/types.h @@ -1,4 +1,6 @@ #ifndef _SYS_TYPES_H #define _SYS_TYPES_H + typedef int pid_t; + #endif diff --git a/include/10.libc/unistd.h b/include/10.libc/unistd.h index a6bfee0..abe7f3c 100644 --- a/include/10.libc/unistd.h +++ b/include/10.libc/unistd.h @@ -1,14 +1,11 @@ #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/setup.sh b/include/setup.sh new file mode 100755 index 0000000..adc27cb --- /dev/null +++ b/include/setup.sh @@ -0,0 +1,47 @@ +#!/bin/sh + +rm -rf "01.pocetak" "02.vga" "03.gdt" "04.idt" "05.irq" "06.keyboard" "07.pit" "08.heap" "09.paging" "10.libc" + +mkdir "01.pocetak" "02.vga" "03.gdt" "04.idt" "05.irq" "06.keyboard" "07.pit" "08.heap" "09.paging" "10.libc" + +cp ../../mykernel/src/as/boot.s ./01.pocetak +cd 01.pocetak || exit +awk -v RS= '{print > ("deo" NR )}' boot.s +cd .. || exit + +cp ../../mykernel/src/c/vga.c ./02.vga +cd 02.vga || exit +awk -v RS= '{print > ("deo" NR )}' vga.c +cd .. || exit + +cp ../../mykernel/src/c/gdt.c ./03.gdt +cd 03.gdt || exit +awk -v RS= '{print > ("deo" NR )}' gdt.c +cd .. || exit + +cp ../../mykernel/src/c/idt.c ./04.idt +cd 04.idt || exit +awk -v RS= '{print > ("deo" NR )}' idt.c +cd .. || exit + +cp ../../mykernel/src/c/keyboard.c ./06.keyboard +cd 06.keyboard || exit +awk -v RS= '{print > ("deo" NR )}' keyboard.c +cd .. || exit + +cp ../../mykernel/src/c/timer.c ./07.pit +cd 07.pit || exit +awk -v RS= '{print > ("deo" NR )}' timer.c +cd .. || exit + +cp ../../mykernel/src/c/heap.c ./08.heap +cd 08.heap || exit +awk -v RS= '{print > ("deo" NR )}' heap.c +cd .. || exit + +cp ../../mykernel/src/c/paging.c ./09.paging +cd 09.paging || exit +awk -v RS= '{print > ("deo" NR )}' paging.c +cd .. || exit + +cp -r ../../mykernel/src/include/* ./10.libc diff --git a/kernel.pdf b/kernel.pdf index 02988f5..d5c3b07 100644 Binary files a/kernel.pdf and b/kernel.pdf differ diff --git a/kernel.tex b/kernel.tex index 8ca59d8..22ab606 100644 --- a/kernel.tex +++ b/kernel.tex @@ -502,48 +502,62 @@ ili {\eng USB} flesh sa kojih se kasnije dizhe sistem. {\eng as/boot.s}:\\ U prvom delu postavljamo promenljive na vrednosti koje su odredjene {\eng Multiboot2} standardom.\\ -\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/deo1}\srb\end{minipage} Nakon toga postavljamo prvih 512 bitova na prethodno pomenute vrednosti ali tako da za svaku promenljivu ostavljamo 32 bita prostora.\\ -\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot01.s}\srb\end{minipage} -Definisemo sekciju {\eng bss} u kojoj kreiramo stek i dodeljujem mu 16 kilobajta.\\ -\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/deo2}\srb\end{minipage} +Definishemo sekciju {\eng bss} u kojoj kreiramo stek i dodeljujem mu 16 kilobajta.\\ +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo3}\srb\end{minipage} I na kraju postavljamo registar esp na vrh steka i pozivamo {\eng kernel\_main} funkciju koja je napisana u {\eng C}-u.\\ -\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot03.s}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo4}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo5}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo6}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo7}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo8}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo9}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo10}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo11}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo12}\srb\end{minipage} \section{Ispis na ekran - {\eng VGA}} \medskip {\eng c/vga.c}:\\ -Primetimo da u {\eng C}-u koristimo {\eng uintX_t} promenljive. To je zbog toga -shto nam je sada vrlo bitno da pazimo na velichinu koju zauzimaju promenljive. -\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga00.c}\srb\end{minipage} -Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju -\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} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo1}\srb\end{minipage} +Primetimo da u {\eng C}-u koristimo {\eng uintX\_t} promenljive. To je zbog toga +shto nam je sada vrlo bitno da pazimo na velichinu koju zauzimaju promenljive.\\ +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo2}\srb\end{minipage} +4 znachajnija bita oznachavaju boju pozadine, dok ostala 4 bita oznachavaju boju karaktera.\\ +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo3}\srb\end{minipage} +Na {\eng VGA} pisemo tako shto\\ +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo4}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo5}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo6}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo7}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo8}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo9}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo10}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo11}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo12}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo13}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo14}\srb\end{minipage} \section{{\eng Global Desctiptor Table}} \medskip {\eng c/gdt.c}:\\ -\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/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} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo1}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo2}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo3}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo4}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo5}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo6}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo7}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo8}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo9}\srb\end{minipage} {\eng\url{https://wiki.osdev.org/GDT}} @@ -552,13 +566,17 @@ Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju {\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} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo1}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo2}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo3}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo4}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo5}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo6}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo7}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo8}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo9}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo10}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo11}\srb\end{minipage} {\eng\url{https://wiki.osdev.org/IDT}} @@ -566,8 +584,10 @@ Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju \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} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo12}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo13}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo14}\srb\end{minipage} + {\eng\url{https://wiki.osdev.org/IRQ}} {\eng\url{https://wiki.osdev.org/PIC}} @@ -577,29 +597,42 @@ Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju {\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} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo1}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo2}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo3}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo4}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo5}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo6}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo7}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo8}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo9}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo10}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo11}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo12}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo13}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo14}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo15}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo16}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo17}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo18}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo19}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo20}\srb\end{minipage} \section{{\eng PIT - Programmable Interval Timer}} \medskip {\eng c/timer.c}:\\ -\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/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} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo1}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo2}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo3}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo4}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo5}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo6}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo7}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo8}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo9}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo10}\srb\end{minipage} {\eng\url{https://wiki.osdev.org/PIT}} \section{{\eng Heap}} @@ -607,16 +640,37 @@ Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju {\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} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo1}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo2}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo3}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo4}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo5}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo6}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo7}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo8}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo9}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo10}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo11}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo12}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo13}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo14}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo15}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo16}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo17}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo18}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo19}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo20}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo21}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo22}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo23}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo24}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo25}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo26}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo27}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo28}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo29}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo30}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo31}\srb\end{minipage} {\eng\url{https://wiki.osdev.org/Heap}} \section{{\eng Paging}} @@ -624,12 +678,15 @@ Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju {\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} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo1}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo2}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo3}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo4}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo5}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo6}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo7}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo8}\srb\end{minipage} +\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo9}\srb\end{minipage} {\eng\url{https://wiki.osdev.org/Paging}} @@ -693,5 +750,4 @@ dizajn. \nocite{*} \printbibliography[heading=bibintoc,title={Literatura}] - \end{document} -- cgit v1.2.3