Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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
Example #4
0
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();
}
Example #5
0
unsigned int mmu_nueva_pila_kernel() {
    return mmu_proxima_pagina_fisica_libre() + PAGE_SIZE;
}