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); //} } }
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; } }