/* * This file contains the entrance point for the Kernel proper. The code here * is called by the bootloader when it finishes. The kmain routine is * responsible for setting up memory and starting the processes running. */ #include #include #include #include #include #include #include #include #include #include #include "acpi/acpi.h" #include "desc.h" #include "multiboot.h" extern char _bss[], _end[]; void ipiq_handler(struct InterruptFrame *frame); void cpu_load(void); /* Kernel main function */ _Noreturn void kmain(struct MultibootInfo *mbinfo) { void *ebda = (void *) (*((uint16_t *) 0x040E) << 4); memset(_bss, 0, _end - _bss); /* Setup frame allocator */ init_frames(mbinfo->mmapLen, (void *) mbinfo->mmapAddr); /* Processor startup */ init_idt(); init_pic(); cpu_load(); register_ipi(0, ipiq_handler); /* Initialise sub-systems */ init_paging(); init_tasking(); init_vfs(); /* Search ACPI tables */ init_acpi(ebda); init_pci(); /* Mount drive */ mkdir("root", 0); mount("/dev/hd0", "/root", "ext2fs", MS_RDONLY, NULL); chroot("/root"); chdir("/"); mount("devfs", "/dev", "devfs", 0, NULL); mount("tmpfs", "/tmp", "tmpfs", 0, NULL); /* Start init */ char *argv[] = { "init", NULL }; execve("/bin/init", argv, NULL); panic("Could not run init"); }