예제 #1
0
void main(struct multiboot_info *mbinfo, uint32_t kernel_end_addr)
{
    int i;
    unsigned char buffer[512];
    //void * listaA[200]; 
    gdt_init();
    idt_init();
    irq_init();
    isrs_init();
    mm_init((mbinfo->low_mem + mbinfo->high_mem +1024)*1024,kernel_end_addr);
    int kernelSize = kernel_end_addr - KERNEL_BASE_ADDR;
    multiboot_memory_map_t *mmap_ptr = (multiboot_memory_map_t*) mbinfo->mmap_addr;
    multiboot_memory_map_t *mmap_end = (multiboot_memory_map_t*) (mbinfo->mmap_addr + mbinfo->mmap_length);

    while (mmap_ptr < mmap_end) {
        if (mmap_ptr->type == MULTIBOOT_MEMORY_AVAILABLE) {
            uint32_t region_base_addr = (uint32_t) (mmap_ptr->addr & 0xffffffff);
            uint32_t region_size = (uint32_t) (mmap_ptr->len & 0xffffffff);

            mm_mark_region_unused(region_base_addr, region_size);
        }
    mmap_ptr = (multiboot_memory_map_t*) ((uint32_t) mmap_ptr + mmap_ptr->size + sizeof (uint32_t));
    
    }
    mm_mark_region_used(KERNEL_BASE_ADDR, kernelSize + mm_get_bitmap_size());
   
  
            
   
   // malloc con cantidad pequeña
 /*   for ( int i = 0 ; i<10 ; i ++)
    {
         void * prueba1 = malloc(8);
         kprintf("\nesta en la direccion:%p ",prueba1);
    }
    //malloc se pasa de un frame
   for ( int i = 0 ; i<175 ; i ++)
    {
         listaA[i] = malloc(16);
         
         kprintf("\nesta en la direccion:%p ",listaA[i]);
    }
    
    free(listaA[15]);
    
     listaA[175] = malloc(16);
      kprintf("\nesta en la direccion:%p ",listaA[175]);
      */
    InicializarEstructuraFat();
     __asm__ __volatile__("sti");
     clear_screen();
       
    
             
      irq_install_handler(1,keyboard_handler);
   //
      typedef void (*call_module_t)(unsigned);
    /* ... */
     char buffer2[1024];
   
    if(mbinfo->mods_count>0){
           // for(int numberModule=0; numberModule<mbinfo->mods_count;numberModule){
                uint32_t  mod_start =((uint32_t) mbinfo->mods_addr[0].modStart);
                 call_module_t start_program = (call_module_t) mod_start;
                 start_program(mod_start);
            //}
           
        }
     
    
    
}
예제 #2
0
파일: kernel.c 프로젝트: zzh8829/OSPP
void kernel_main(uint32_t mb_addr, uint32_t mb_magic)
{
	if(mb_magic != MULTIBOOT_BOOTLOADER_MAGIC)
	{
		kprintf(PANIC,"Wrong Bootloader Magic\n");
		for(;;);
	}

	multiboot_info_t* mb_info = (multiboot_info_t*)mb_addr;
	vbe_info_t* vbe_info = (vbe_info_t *)(mb_info->vbe_mode_info);

	uint32_t top = mb_info->mem_upper;
	uint32_t bot = mb_info->mem_lower;
	uint32_t mem = top+bot;

	clear_console();

	char version[20];
	get_version(version);
	kp("Welcome to ZOS v%s",version);

	kp("System Information");
	kp("	Booting Flag: 0x%x",mb_info->flags);
	if(check_flag(mb_info->flags,0))
		kp("	Available Memory: %d KB / %d MB",mem,mem/1024);
	if(check_flag(mb_info->flags,1))
		kp("	Booting Device: 0x%x",mb_info->boot_device);
	if(check_flag(mb_info->flags,2))
	{
		if(strlen((char*)mb_info->cmdline)>1)
			kp("	Booting Command: %s",(char*)mb_info->cmdline);
	}
	if(check_flag(mb_info->flags,3))
		{}
	if(check_flag(mb_info->flags,4))
		{}
	if(check_flag(mb_info->flags,5))
		kernel_elf = elf_from_multiboot(mb_info);
	if(check_flag(mb_info->flags,6))
	{
		/*
		multiboot_memory_map_t *mmap;
		kp ("mmap_addr = 0x%x, mmap_length = 0x%x",
			(unsigned) mb_info->mmap_addr, (unsigned) mb_info->mmap_length);
		for (mmap = (multiboot_memory_map_t *) mb_info->mmap_addr;
			(unsigned long) mmap < mb_info->mmap_addr + mb_info->mmap_length;
			mmap = (multiboot_memory_map_t *) ((unsigned long) mmap
			+ mmap->size + sizeof (mmap->size)))
		{
			kp (" size = 0x%x, base_addr = 0x%x%x,"
			" length = 0x%x%x, type = 0x%x",
			(unsigned) mmap->size,
			mmap->addr >> 32,
			mmap->addr & 0xffffffff,
			mmap->len >> 32,
			mmap->len & 0xffffffff,
			(unsigned) mmap->type);
		}
		*/		
	}
	gdt_init();		/* Global Descriptor Table */
	idt_init();		/* Interrupt Descriptor Table */
	isrs_init();	/* Interrupt Service Requests */
	irq_init();		/* Hardware Interrupt Requests */ 

	open_serial_output();

	timer_init();
	paging_init(mem);
	heap_init();
	
	keyboard_init();

	//pci_init();
	kp("login: "******"Welcome to ZOS\n",
		"Hello!\n",
		"abcdefghijklmnopqrstuvwxyz1234567890\n",
		0
	};
	for(int i=0;i!=3;i++)
	{
		for(int j = 0;j!=strlen(str[i]);j++)
		{
			gfx_print(str[i][j]);
		}
	}
	

	void render(window_t* win)
	{
	}

	void update(window_t* win)
	{
		surface_fill(win->surface,0,rgb(255,255,255));

		key_event_t* head;
		int len;
		keyboard_event_get(&head,&len);
		for(int i=0;i!=len;i++)
		{
			key_event_t* eve = head+i;
			if(eve->type == KEY_DOWN)
			{
				gfx_print(eve->character);
			}
		}
		keyboard_event_clear();
		
		rect_t trect = {0,0,720,20};
		for(int i=0;i!=24;i++)
		{
			if(strlen(gfx_con_buf[i]))
			{
				surface_t* surf = font_render(gfx_con_buf[i],col);
				surface_blend(surf,0,win->surface,&trect);
				surface_free(surf);
			}
			trect.y += 20;
		}
	}