unsigned int mmu_inicializar_dir_tarea(taskType tipo, unsigned int fisica){ int *page_directory = mmu_proxima_pagina_fisica_libre(); // Limpiamos el directorio int i = 0; while (i < 1024) { page_directory[i] = 0; i++; } // Registramos la primer pagina en el directorio int *page_table = mmu_proxima_pagina_fisica_libre(); page_directory[0] = (int)page_table + ATTR_KERN; // En la tabla de paginas registramos las primeras 1024 con bloques // de 4kb int base_page_addr = 0; i = 0; while(i < 1024) { page_table[i] = base_page_addr + ATTR_KERN; base_page_addr += 4096; i++; } unsigned int cr3Tarea = (int) page_directory; mmu_mapear_pagina(fisica, rcr3(), fisica, ATTR_KERN); //tipo de tarea int* codigo_fuente = (int*) (IDLE_TASK + (inMemoryCodeOrder(tipo) * PAGE_SIZE)); mmu_copiar_pagina(codigo_fuente, (int*) fisica); mmu_unmapear_pagina(fisica, rcr3()); mmu_mapear_pagina(TASK_CODE, cr3Tarea, fisica, ATTR_USER); //En principio se mapea a si misma //No esta atacando a nadie mmu_mapear_pagina(TASK_CODE + PAGE_SIZE, cr3Tarea, fisica, ATTR_USER); return cr3Tarea; }
void tss_inicializar_perro(tss* tss_perro, perro_t* perro) { tss_perro->cs = SEG_CODE_USER; tss_perro->ds = SEG_DATA_USER; tss_perro->ss = SEG_DATA_USER; tss_perro->eip = CODIGO_BASE; tss_perro->ebp = TASK_PILA_BASE; tss_perro->esp = TASK_PILA_BASE; tss_perro->cr3 = mmu_inicializar_memoria_perro(perro, perro->jugador->index, perro->tipo); tss_perro->eflags = 0x202; tss_perro->esp0 = mmu_proxima_pagina_fisica_libre() + PAGE_SIZE - 1; tss_perro->ss0 = SEG_DATA_KERNEL; tss_perro->iomap = 0xFFFF; }
void mmu_mapear_pagina(unsigned int virtual, unsigned int cr3, unsigned int fisica, unsigned char attr) { unsigned int *pdirectorio = (unsigned int*) CR3_BASE_ADDR(cr3); unsigned int *ptabla; int i = 0; if(!PDE_PRESENT(pdirectorio[PDE_INDEX(virtual)])) { ptabla = (unsigned int*) mmu_proxima_pagina_fisica_libre(); pdirectorio[PDE_INDEX(virtual)] = (unsigned int) ptabla | (unsigned int) PG_USER | (unsigned int) PG_WRITE | (unsigned int) PG_PRESENT; for(; i < ENTRIES_TABLE; i++) ptabla[i] = 0x0; } else
void mmu_mapear_pagina( unsigned int virtual, unsigned int cr3, unsigned int fisica, short attr){ unsigned int pageDirIndex = PDE_INDEX(virtual); //ebp-12 unsigned int pageDirTableIndex = PTE_INDEX(virtual); //ebp-16 unsigned int page_table_entry = fisica | attr; //ebp-20 int* page_directory = (int*) (ALIGN(cr3)); int* page_table = 0; int presente = (page_directory[pageDirIndex] & 0x01); if(!presente){ // chequeo presente! page_table = mmu_proxima_pagina_fisica_libre(); page_directory[pageDirIndex] = ( (unsigned int) page_table ) | attr; int i = 0; while(i < 1024) {// Limpiamos la tabla nueva page_table[i] = 0; i++; } }else{ page_table = ((int*) (page_directory[pageDirIndex] & 0xFFFFF000)); } page_table[pageDirTableIndex] = page_table_entry; tlbflush(); }
unsigned int mmu_nueva_pila_kernel() { return mmu_proxima_pagina_fisica_libre() + PAGE_SIZE; }