コード例 #1
0
ファイル: perro.c プロジェクト: ndrisso/tp3-orga2-2015
// recibe una direccion y un perro, al cual debe mover en esa dirección
// *** viene del syscall mover ***
uint game_perro_mover(perro_t *perro, direccion dir)
{
	int x, y;
	game_dir2xy(dir, &x, &y);
	int nuevo_x = perro->x + x;
	int nuevo_y = perro->y + y;
    //int viejo_x = perro->x;
    //int viejo_y = perro->y;
    uint cr3 = perro->cr3;

    // ~~~ completar ~~~
    //verificar si se sale del tablero
    if (!game_es_posicion_valida(nuevo_x, nuevo_y)) {
    	return NULL;
    }

	perro_t *otro_perro;
    //verificar si hay otro perro del mismo jugador ahi
    otro_perro = game_perro_hay_perro_de_jugador(perro->jugador, nuevo_x, nuevo_y);
    if ( otro_perro != NULL) {
    	//game_perro_termino(otro_perro);
    	return NULL;
    }

    jugador_t* otro_jugador;

    if (&jugadorA == perro->jugador) {
    	otro_jugador = &jugadorB;
    }

    //verificar si hay otro perro del otro jugadr ahi
    otro_perro = game_perro_hay_perro_de_jugador(otro_jugador, nuevo_x, nuevo_y);
    if ( otro_perro != NULL) {
    	//debemos matar al perro
    	//sched_remover_tarea(sched_buscar_gdtindex_tarea_desde_perro(otro_perro));
    	game_perro_termino(otro_perro);
    }
    screen_borrar_perro(perro);

    //mapeamos como lo pide el enunciado la nueva posicion visitada en modo solo lectura
 	mmu_mapear_pagina(mmu_xy2virtual(nuevo_x, nuevo_y), cr3, mmu_xy2fisica(nuevo_x, nuevo_y), 0x5);
 	// luego copiamos código y pila a la nueva posición de memoria
    mmu_copiar_pagina(0x401000, mmu_xy2virtual(nuevo_x, nuevo_y));	
    // por último mapeamos la dirección 0x401000 a la nueva dirección fisica donde el codigo copiado 
    // y la pila se alojan, con nivel de usuario, y de lectura/escritura
    mmu_mapear_pagina(0x401000, cr3, mmu_xy2fisica(nuevo_x, nuevo_y), 0x7);	
    
    perro->x = nuevo_x;
    perro->y = nuevo_y;

    return 1;
}
コード例 #2
0
ファイル: mmu.c プロジェクト: nicoh22/orga2-tp3-2016
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;
}