#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const int version_major = 0, version_minor = 0, version_patch = 1; void init_mmap(multiboot_info_t *multiboot_info) { if (multiboot_info->flags & (1 << 6)) { mmap_init_multiboot((struct multiboot_mmap_entry *) multiboot_info->mmap_addr, multiboot_info->mmap_length / sizeof(struct multiboot_mmap_entry)); // malloc_init(); // todo fallback on other mechanisms? } else { k_panics("mmap invalid!\n"); } } void register_pci_drivers() { ide_register(); } void init_pci_system() { register_pci_drivers(); pci_sort_drivers(); pci_scan(); pci_init_drivers(); } void init_block_devices() { // register drivers mbr_register_block_driver(); fat_register_block_driver(); // scan block_dev_scan_repeat(); } void noreturn kmain(multiboot_info_t *multiboot_info) { isr_install(); vga_clear_screen(); vga_clear_screen(' ', VGA_WHITE | (VGA_GRAY << VGA_SHIFT_BG)); kprint_register(vga_kprint); serial_init(); kprint_register(serial_kprint); cpuidx_print_info(); store_bootloader_info(multiboot_info); init_mmap(multiboot_info); // init done, enable interrupts __asm__ __volatile__("sti"); init_timer(1000); init_keyboard(); init_pci_system(); init_block_devices(); printf("Booted successfully v%d.%d.%d\n", version_major, version_minor, version_patch); task_init(); task_spawn(main_loop, NULL); syscall_start_scheduler(); }