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 }
void setup() { uint32_t memSize = 1024 + bootinfo->m_memoryLo + bootinfo->m_memoryHi*64; // All data past the kernel is free to use pmmngr_init(memSize,0x100000 + kernelSize * 512); memory_region* region = (memory_region*)0x1000; for(int i = 0;region[i].startLo != 0 || i == 0;i++) { if(region[i].type > 4) region[i].type = 1; if(region[i].type == 1) pmmngr_init_region(region[i].startLo,region[i].sizeLo); } // Kernal location pmmngr_deinit_region(0x100000,kernelSize * 512 + pmmngr_get_block_count() / PMMNGR_BLOCKS_PER_BYTE); // c++ at exit runtime function pointers pmmngr_deinit_region(0x50000,sizeof(unsigned) * 32); // Boot data retained in bootinfo pmmngr_deinit_region((physical_addr)bootinfo,sizeof(multiboot_info)); // Initialize DMA buffer here using deinit, not pmalloc() pmmngr_deinit_region((physical_addr)DMA_BUFFER,0x200); // Don't corrupt the stack mmngr_stack_init(0x90000,0x16000); hal_initialize(); kybrd_init(0x21); install_interrupts(); vmmngr_initialize(); enable_interrupts(); flpydsk_set_working_drive(0); flpydsk_install(0x26); fsysFatInitialize(); return; }
void start_kernel(struct multiboot *mbp, unsigned int magic,u32 esp) { u32 initrd_location = *((u32*)mbp->mods_addr); u32 initrd_end = *(u32*)(mbp->mods_addr+4); __asm__ __volatile__("cli"); cpu_init(); placement_pointer = initrd_end; vmmngr_initialize(mbp->mem_upper + mbp->mem_lower); kheap = _heapmngr_initialize(0x02000000, 0x20000000, 0x200000); con_init(); init_IRQ(); time_init(); _kbd_init_hook(); /*setup_irq(2, &irq2); setup_irq(3, &irq3 ); setup_irq(4, &irq4 ); setup_irq(5, &irq5 ); setup_irq(8, &irq8 ); */ //auto_fpu(); task_initialize(); syscalls_install(); fs_root_initrd = install_initrd(initrd_location); //pci_inst_check(); //enable_pci_master(0,3,0); //8139 need this struct request *info = 0; probe_ide(info); hd_init_hook_(); putch('P'); double test = 3.14444; printk("test ::: %d\n", test); //serial_install(); //unsigned long cpu_khz = init_tsc(); //u32 *pf = (u32 *)0xffff0000; //*pf = 10; ext2_read_superblock(); register_filesystem(); __asm__ __volatile__("sti"); //graphics_install_bochs(1024,768); //heaptest(); //create_thread(test_task,1); while(1) { if(getch_polling() == 'i') { const char *filename = "test__2"; //execve__((char*)filename,0,0); load_elf((char*)filename,0,0); //show_state(); } } }