#include "multiboot.h" #include #include #include #include #include #include "memory/mm.h" extern void init_idt(); extern void init_gdt(); extern void init_pic(); extern void init_pit(); extern int init_ps2(); extern void enable_interrupts(); void* page = NULL; extern char __kernel_start; extern char __kernel_end; void* user_page_directories[10]; void kmain(uint32_t magic, multiboot_info* mbi) { extern print_stream_t vga_print_stream; extern print_stream_t* kout; kout = &vga_print_stream; kout->trunc(); kprintf("kernel start: 0x%x\n", &__kernel_start); kprintf("kernel end: 0x%x\n", &__kernel_end); uint32_t size = (&__kernel_end - &__kernel_start) / 1024; kprintf("kernel size: %dKB\n", size); if (!(mbi->flags & (1 << 6))) { return; } kprintf("multiboot virtual address: 0x%x\n", mbi); uint32_t mmap_virtual_addr = mbi->mmap_addr + 0xC0000000; kprintf("mmap virtual address: 0x%x\n", mmap_virtual_addr); init_pmm((void*)mmap_virtual_addr, mbi->mmap_length); uint32_t mem_size = total_free_memory(); kprintf("Total available memory: %d MB\n", mem_size / 1024 / 1024); kprintf("RockOS booting...\n"); init_gdt(); extern uint64_t gdt[5]; kprintf("GDT set @ 0x%x\n", &gdt); init_idt(); extern idt_entry idt[256]; kprintf("IDT set @ 0x%x\n", &idt); init_pic(); kprintf("PIC initialized\n"); init_pit(); kprintf("PIT initialized\n"); // int result = init_ps2(); // if (result == -1) { // kprintf("PS2 init failed\n"); // return; // } // kprintf("PS2 initialized\n"); init_page_tables(); kprintf("Page tables initialized\n"); user_page_directories[0] = create_user_pd(); kprintf("Created first user process page directory @ 0x%x\n", user_page_directories[0]); while(1); }