diff --git a/com1.out b/com1.out index 7d4bdc4..a4fd5da 100644 Binary files a/com1.out and b/com1.out differ diff --git a/gdt.c b/gdt.c new file mode 100644 index 0000000..65dc5c5 --- /dev/null +++ b/gdt.c @@ -0,0 +1,48 @@ +#include "gdt.h" + +struct gdt_entry +{ + unsigned short limit_low; + unsigned short base_low; + unsigned char base_middle; + unsigned char access; + unsigned char granularity; + unsigned char base_high; +} __attribute__((packed)); + +struct gdt_ptr +{ + unsigned short limit; + unsigned int base; +} __attribute__((packed)); + +struct gdt_entry gdt[3]; +struct gdt_ptr gp; + +extern void gdt_flush(); + +void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran) +{ + gdt[num].base_low = (base & 0xFFFF); + gdt[num].base_middle = (base >> 16) & 0xFF; + gdt[num].base_high = (base >> 24) & 0xFF; + + gdt[num].limit_low = (limit & 0xFFFF); + gdt[num].granularity = ((limit >> 16) & 0x0F); + + gdt[num].granularity |= (gran & 0xF0); + gdt[num].access = access; +} + +void gdt_install() +{ + gp.limit = (sizeof(struct gdt_entry)*3) - 1; + gp.base = (unsigned int)&gdt; + + gdt_set_gate(0, 0, 0, 0, 0); + + gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); + gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF); + + gdt_flush(); +} diff --git a/gdt.h b/gdt.h new file mode 100644 index 0000000..2607869 --- /dev/null +++ b/gdt.h @@ -0,0 +1,8 @@ +#ifndef GDT_H +#define GDT_H + +void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran); + +void gdt_install(); + +#endif diff --git a/iso/boot/kernel.elf b/iso/boot/kernel.elf index 5315e60..4fafbb5 100755 Binary files a/iso/boot/kernel.elf and b/iso/boot/kernel.elf differ diff --git a/kernel.elf b/kernel.elf index 5315e60..4fafbb5 100755 Binary files a/kernel.elf and b/kernel.elf differ diff --git a/kmain.c b/kmain.c index 8cd6cef..b15b916 100644 --- a/kmain.c +++ b/kmain.c @@ -1,14 +1,19 @@ #include "stdio.h" #include "serial.h" +#include "gdt.h" int kmain(int retvalue) { + + gdt_install(); // serial testing init_serial(); + log("serial connection established", 3); - log("Kernel started", 2); + log("initialized GDT entries", 2); + log("kernel started", 2); clear(); diff --git a/loader.s b/loader.s index 0d3f9ce..bdf1dd1 100644 --- a/loader.s +++ b/loader.s @@ -14,6 +14,7 @@ align 4 extern kmain loader: + cli ; mov eax, 0xCAFEBABE push dword 42 call kmain @@ -21,6 +22,22 @@ loader: .loop: jmp .loop +global gdt_flush +extern gp + +gdt_flush: + lgdt [gp] + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + jmp 0x08:flush2 + +flush2: + ret + section .bss align 4 kernel_stack: diff --git a/makefile b/makefile index 1559535..2f40e62 100644 --- a/makefile +++ b/makefile @@ -1,4 +1,4 @@ -OBJECTS = loader.o kmain.o stdio.o io.o string.o serial.o +OBJECTS = loader.o kmain.o stdio.o io.o string.o serial.o gdt.o CC = gcc CFLAGS = -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nostartfiles -nodefaultlibs -Wall -Wextra -c LDFLAGS = -T link.ld -melf_i386 diff --git a/os.iso b/os.iso index 6c0640a..33455f4 100644 Binary files a/os.iso and b/os.iso differ