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