void kmain(struct multiboot* b, uint32_t magic) { hide_cursor(); cls(); setup_gdt(); setup_idt(); if(b->mods_count == 1) { uint32_t mods_start_addr=*(uint32_t*)(b->mods_addr); uint32_t mods_end_addr=*(uint32_t*)(b->mods_addr + 4); if(((uint32_t)&__kernel_end - KERNEL_VMA) < mods_end_addr) kernel_end_addr=(mods_end_addr & 0xFFFFF000) + 0x1000; } setup_bitmap(); setup_vmm(); setup_pic(); setup_tasking(); setup_process_tree(); set_timer_freq(100); pci_init(); setup_network(); b=(struct multiboot*)((uint8_t*)b+KERNEL_VMA); uint32_t mods_addr=*(uint32_t*)(b->mods_addr + KERNEL_VMA) + KERNEL_VMA; root_fs=ext2_fs_init((uint8_t*)mods_addr); struct inode *devfs=devfs_init(); struct inode *devfs_root=vfs_search((struct inode*)root_fs, "/dev"); if(devfs_root) { vfs_mount(devfs, devfs_root); register_tty_driver(); register_kbd_driver(); register_rtl8139_driver(); } else kprintf("Could not mount /dev, no such directory\n"); kprintf("\n%@Welcome to tapiOS!%@\n\n", 0x05, 0x07, b->mods_count, 0x03); struct inode *node=vfs_search((struct inode*)root_fs, "/bin/init"); if(node) { struct file *init=vfs_open(node, NULL, O_RDONLY); uint8_t *init_mem=kmalloc(node->size); int read=vfs_read(init, init_mem, node->size); vaddr_t entrypoint=init_elf_get_entry_point(init_mem); setup_initial_process(entrypoint); } else kprintf("Init not found\n"); __asm__ volatile("hltloop: hlt; jmp hltloop"); PANIC(); }
/** * @brief Función principal del kernel. Esta rutina recibe el control del * codigo en ensamblador de start.S. * * @param magic Número mágico pasado por GRUB al código de start,S * @param multiboot_info Apuntador a la estructura de información multiboot */ void cmain(unsigned int magic, void * multiboot_info) { unsigned int i; unsigned int allocations; char * addr; /* Referencia a la estructura de datos multiboot_header en start.S */ extern multiboot_header_t multiboot_header; multiboot_info_location = (unsigned int) multiboot_info; cls(); /* Configurar y cargar la GDT definida en pm.c*/ setup_gdt(); /* Configurar y cargar la IDT definida en idt.c */ setup_idt(); /* Configurar las excepciones definidas en IA-32 */ setup_exceptions(); /* Configurar las IRQ */ setup_irq(); /* Configurar el mapa de bits de memoria del kernel */ setup_memory(); printf("Kernel started\n"); /* Probar la gestion de unidades de memoria */ /* Reservar una unidad */ addr = allocate_unit(); printf("Allocated address: %x = %d\n", addr, addr); addr = allocate_unit_region(0xFFFF); printf("Allocated region: %x\n", addr); addr = allocate_unit(); printf("Allocated address: %x\n", addr); printf("Last allocated address: %x, %u\n",addr, addr); inline_assembly("sti"); printf("Kernel finished\n"); }
void mt_setup_gdt_idt(void) { setup_gdt(); setup_idt(); }