Exemplo n.º 1
0
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
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
Arquivo: main.c Projeto: s1mme/OrbitOS
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();
		}
	}
}