#include "multiboot.h" #include "interrupts.h" #include "gdt.h" #include "scheduler.h" #include "common.h" #include #include #include #include #include #include #include #include #include #include #include #include extern char __kernel_start; extern char __kernel_end; void first_task() { kprintf("task started\n"); int i = 5; while (i--) { sleep(1000); kprintf("task awake [%d]\n", i); } kprintf("exiting\n"); exit(); } void kmain(uint32_t magic, multiboot_info* mbi) { disable_interrupts(); if (!(mbi->flags & (1 << 6))) { return; } vga_init(); uint32_t mmap_virtual_addr = mbi->mmap_addr + 0xC0000000; init_pmm((void*)mmap_virtual_addr, mbi->mmap_length); kprintf("memory detection complete. total free memory: %dMB\n", total_free_memory() / 1024 / 1024); init_gdt(); init_idt(); init_pic(); init_pit(); init_page_tables(); kprintf("basic initializations complete\n"); disable_interrupts(); // just paranoid... do it again init_scheduler(); enable_interrupts(); create_task((uint32_t)first_task, fetch_cr3()); while(1) { sleep(5000); kprintf("kernel awake\n"); } }