X-Git-Url: http://git.dujemihanovic.xyz/%7B%7B%20%24image.RelPermalink%20%7D%7D?a=blobdiff_plain;f=kernel%2Fkernel.c;h=b274340cd2605ca7a905579cf06f0b32adbf8d99;hb=e07e8457b21a82799a8c1931de13718371898675;hp=4c6efd8692da90d7ab15cf782846b3194e9483f7;hpb=39cd7d8aed9f604f2b03570d94cffee45df1451b;p=nameless-os.git diff --git a/kernel/kernel.c b/kernel/kernel.c index 4c6efd8..b274340 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -3,21 +3,48 @@ #include #include #include +#include extern void double_fault(struct abort_frame *frame); extern void keyb_handler(struct interrupt_frame *frame); -struct idt_descriptor idt[256] __attribute__((aligned(0x10))); -struct idtr idtr __attribute__((aligned(0x10))); +extern void pf_handler(struct fault_frame *frame); +static struct idt_descriptor idt[256] __attribute__((aligned(0x10))); +static struct idtr idtr __attribute__((aligned(0x10))); + +static struct page_directory_entry page_dir[1024] __attribute__((aligned(0x1000))); +static struct page_table_entry page_table[1024] __attribute__((aligned(0x1000))); void kmain(void) { screen_clear(); kprint("Welcome to Nameless OS!\nRunning revision: ", 0); kprint(GIT_COMMIT, 0); - kprint("\n", 0); + kprint("\nEnabling paging...\n", 0); + for (int i=0xb8; i < 0xc0; i++) { + page_table[i].p = 1; + page_table[i].rw = 0; + page_table[i].us = 0; + page_table[i].page_frame_addr = i; + } + for (int i=0x100; i < 0x102; i++) { + page_table[i].p = 1; + page_table[i].rw = 0; + page_table[i].us = 0; + page_table[i].page_frame_addr = i; + } + for (int i=0x102; i < 0x110; i++) { + page_table[i].p = 1; + page_table[i].rw = 1; + page_table[i].us = 0; + page_table[i].page_frame_addr = i; + } + page_dir[0].p = 1; + page_dir[0].page_table_addr = (int) &page_table >> 12; + enable_paging(page_dir); kprint("Preparing IDT...\n", 0); - idt_set_descriptor(idt, 0x8, 0x8, (uint32_t) double_fault, IDT_TRAP_GATE, 0x0); - idt_set_descriptor(idt, 0x21, 0x8, (uint32_t) keyb_handler, IDT_INTERRUPT_GATE, 0x0); + idt_set_descriptor(idt, 8, 0x8, (uint32_t) double_fault, IDT_INTERRUPT_GATE, 0x0); + idt_set_descriptor(idt, 14, 0x8, (uint32_t) pf_handler, IDT_INTERRUPT_GATE, 0x0); + idt_set_descriptor(idt, 33, 0x8, (uint32_t) keyb_handler, IDT_INTERRUPT_GATE, 0x0); kprint("IDT prepared, loading...\n", 0); populate_idtr(&idtr, idt); load_idt(idtr); @@ -27,5 +54,12 @@ void kmain(void) pic_unmask(1); asm volatile ("sti"); kprint("All done\n", 0); + struct idtr curr_idtr; + asm ("sidt %0": "=m" (curr_idtr)); + kprintw(curr_idtr.limit); + kprintd(curr_idtr.base); + //kprint("Gonna force a double fault\n", 0); + //int test = 1/0; + //int test2 = *(int *) (0xa0000000); while(1); }