#include "multiboot.h" #include "interrupts.h" #include "gdt.h" #include "scheduler.h" #include "common.h" #include "vfs.h" #include #include #include #include #include #include #include #include #include #include #include #include #include extern char __kernel_start; extern char __kernel_end; void parse_multiboot_modules(uint32_t mbi_vaddr) { // find where grub put the boot module containing initrd multiboot_info* mbi = (multiboot_info*)mbi_vaddr; uint32_t mod_count = mbi->mods_count; multiboot_module_t* mod = (multiboot_module_t*)((uint32_t)mbi->mods_addr + 0xC0000000); kprintf("found %d mods starting @ [v]0x%x\n", mod_count, (uint32_t)mod); for (uint32_t i = 0; i < mod_count; i++) { uint32_t start = mod[i].mod_start; uint32_t end = mod[i].mod_end; uint32_t cmdline = mod[i].cmdline; multiboot_module_info_table[i].mod_start = start + 0xC0000000; multiboot_module_info_table[i].mod_end = end + 0xC0000000; multiboot_module_info_table[i].cmdline = cmdline + 0xC0000000; } } vfs_node_t* load_initrd() { multiboot_module_t* initrd_module = &multiboot_module_info_table[0]; kprintf("initrd found @ [v] 0x%x\n", initrd_module->mod_start); return cpio_read_fs(initrd_module->mod_start); } void load_origin_program() { vfs_node_t* vfs_root = vfs_create_root(); vfs_node_t* initrd_root = load_initrd(); if (initrd_root) { mount(vfs_root, initrd_root); kprintf("initrd read, mounted @ /\n"); int fd = open("/origin.elf", 0); if (fd == -1) { kprintf("failed to read origin program\n"); } void* buf = kalloc(512); int rd = read(fd, buf, 512); if (rd > 0) { kprintf("read %d bytes from origin.elf\n", rd); } } 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(); parse_multiboot_modules((uint32_t)mbi); kprintf("basic initializations complete\n"); disable_interrupts(); init_scheduler(); enable_interrupts(); create_task((uint32_t)load_origin_program, fetch_cr3()); }