int ldr_main(struct multiboot_info* boot_info, uint32 krnldr_size_bytes) { SetColor(MakeColor(DARK_BLUE, WHITE)); ClearScreen(); if (krnldr_size_bytes > 40 KB) PANIC("Kernel Loader is too large"); init_kallocations(KRN_LDR_BASE + krnldr_size_bytes, KRN_LDR_LIMIT); Print("Initializing descriptor tables."); INT_OFF; init_isr(); init_descriptor_tables(); init_pic(); INT_ON; init_pit_timer(50, timer_callback); struct kernel_info* k_info = kalloc(sizeof(struct kernel_info)); //setup AHCI HBA_MEM_t* abar = PCIFindAHCI(); // initialize basic virtual memory vmmngr_initialize(); uint32 ahci_base = kalloc_get_ptr() + 1024 - (uint32)kalloc_get_ptr() % 1024; init_ahci(abar, ahci_base); uint32 start, _length, position = 0; fsysSimpleFind("MeOs.exe", 1, &_length, &start); if (start == (uint32)-1 && _length == 0) PANIC("Kernel module could not be found!"); while (position <= _length) { fsysSimpleRead(start + position / 512, 4096, KERNEL_BASE + position); position += 4096; } // after all the loading is done... enable paging vmmngr_paging_enable(true); k_info->kernel_size = _length; k_info->isr_handlers = interrupt_handlers; k_info->gdt_base = gdt_entries; k_info->idt_base = idt_entries; printfln("Executing kernel\0"); execute_kernel(boot_info, k_info); ClearScreen(); _asm cli _asm hlt }
int main(multiboot_t * mbp) { cpu_state_t *cpu; // first is to save critical info from bootloader // and get symbol tables so we can print back traces mbootp = mbp; init_debug(mbp); // reset text-mode c80_clear(); printk_color(rc_black, rc_red, "\t\t\t\tRed Magic\n"); // init processors init_bootstrap_processor(); cpu = get_boot_processor(); ASSERT(cpu != NULL); // initialize descriptors init_global_descriptor_table(cpu); init_interrupt_descriptor_table(); init_io_apic(); // interrupt on local_irq_enable(); // memory management show_kernel_pos(); show_ARDS_from_multiboot(mbp); init_paging(); init_kheap(); // initialize devices and rootfs init_dev(); //init_root_fs(); // start all APs if (mpinfo.ismp) start_smp(); // start system clock if (!mpinfo.ismp) init_pit_timer(CLOCK_INT_HZ); else init_apic_timer(CLOCK_INT_HZ); // initialize kernel task and scheduling setup_init_task(); init_sched(); // All our initialisation calls will go in here. return 0xDEADBABA; }