char* leerEnTLB(int PID, int pagina, int posicion, int tamanio) {
	accesosTLB++;
	int habilitada = tlbHabilitada();
	char* buffer = malloc(sizeof(char) * tamanio);
	int j = 0;
	while (j != tamanio) {
		buffer[j] = '\0';
		j++;
	}

	if (habilitada != 0) {
		t_tlb * entradaTLB = buscarEnTLB(PID, pagina);
		if (entradaTLB != NULL) {
			log_info(umclog, "Acierto de TLB en el frame %d y pagina %d",
					entradaTLB->frameTLB, entradaTLB->pagina);
			entradaTLB->momentoEntrada = accesosTLB;
			int inicioLectura = entradaTLB->frameTLB * marco_Size + posicion;
			int i;
			for (i = 0; i < tamanio; i++) {
				buffer[i] = memoriaReal[inicioLectura];
				inicioLectura++;
			}
			return buffer;
		}

	}
	return solicitarBytes(PID, pagina, posicion, tamanio);
}
Пример #2
0
void recibirSolicitarPaginas(int cpu_socket, int pidActivo){
	char* bytesAEnviar;
	int32_t nroPagina;
	int32_t offset;
	int32_t tamanio;

	message* nroPaginaMessage = receiveMessage(cpu_socket);
	nroPagina = convertToInt32(nroPaginaMessage->contenido);

	message* offsetMessage = receiveMessage(cpu_socket);
	offset = convertToInt32(offsetMessage->contenido);

	message* tamanioMessage = receiveMessage(cpu_socket);
	tamanio = convertToInt32(tamanioMessage->contenido);


	deleteMessage(nroPaginaMessage);
	deleteMessage(offsetMessage);
	deleteMessage(tamanioMessage);

	log_trace(logger, "Pedido recibir paginas [pid: %d, nroPagina %d, offset %d, tamanio %d]", pidActivo, nroPagina, offset, tamanio);

	//Esto es solo una validacion
	tabla_de_paginas* tablaDePaginas = buscarPorPID(pidActivo);
	if(tablaDePaginas==NULL){
		enviarFAIL(cpu_socket, PID_NO_EXISTE);
		return;
	}

	if(TLBEnable){
		//Buscar en TLB. Si esta, ir a buscar a memoria y enviar bytes
		int frame = buscarEnTLB(nroPagina, pidActivo);
		if(frame!=-1){
			bytesAEnviar = obtenerBytesDeMemoriaPrincipal(frame, offset, tamanio);
			enviarOKConContenido(cpu_socket, tamanio, bytesAEnviar);
			return;
		}
	}
	//TLB Miss

	demorarSolicitud();
	umcResult result = getPageEntry(tablaDePaginas, nroPagina);
	if(!result.ok){
		enviarFAIL(cpu_socket, result.codError);
		return;
	}

	//Actualizar TLB
	if(TLBEnable) actualizarTLB(nroPagina, pidActivo, result.frameEntry->nroFrame);

	demorarSolicitud();

	enviarOKConContenido(cpu_socket, tamanio, result.frameEntry->direccion_real + offset);
}
Пример #3
0
void recibirAlmacenarPaginas(int cpu_socket, int pidActivo){
	int32_t nroPagina;
	int32_t offset;
	int32_t tamanio;
	char* buffer;

	message* nroPaginaMessage = receiveMessage(cpu_socket);
	nroPagina = convertToInt32(nroPaginaMessage->contenido);

	message* offsetMessage = receiveMessage(cpu_socket);
	offset = convertToInt32(offsetMessage->contenido);

	message* tamanioMessage = receiveMessage(cpu_socket);
	tamanio = convertToInt32(tamanioMessage->contenido);

	message* bufferMessage = receiveMessage(cpu_socket);
	buffer = bufferMessage->contenido;

	deleteMessage(nroPaginaMessage);
	deleteMessage(offsetMessage);
	deleteMessage(tamanioMessage);

	log_trace(logger, "Pedido almacenar paginas [pid: %d, nroPagina %d, offset %d, tamanio %d]", pidActivo, nroPagina, offset, tamanio);
	log_trace(logger, "[Buffer: %s]", buffer);

	//Esto es solo una validacion
	tabla_de_paginas* tablaDePaginas = buscarPorPID(pidActivo);
	if(tablaDePaginas==NULL){
		log_error(logger, "Pid %d no existe", pidActivo);
		enviarFAIL(cpu_socket, PID_NO_EXISTE);
		log_trace(logger, "Enviada respuesta de fallo");

		deleteMessage(bufferMessage);
		return;
	}

	if(TLBEnable){
		int frame = buscarEnTLB(nroPagina, pidActivo);
		if(frame!=-1){
			escribirEnFrame(buffer, offset, tamanio, frame);
			tabla_de_paginas_entry* pageEntry = buscarPorNroPaginaYPID(nroPagina, pidActivo);
			pageEntry->modificado = 1;
			enviarOKSinContenido(cpu_socket);

			deleteMessage(bufferMessage);
			return;
		}
	}

	demorarSolicitud();
	umcResult result = getPageEntry(tablaDePaginas, nroPagina);
	if(!result.ok){
		enviarFAIL(cpu_socket, result.codError);
		log_trace(logger, "Enviada respuesta de fallo");
		return;
	}

	escribirEnFrame(buffer, offset, tamanio, result.frameEntry->nroFrame);
	tabla_de_paginas_entry* pageEntry = buscarPorNroPaginaYPID(nroPagina, pidActivo);
	if(pageEntry == 0){
		enviarFAIL(cpu_socket, result.codError);
		log_trace(logger, "Enviada respuesta de fallo");
		return;
	}

	pageEntry->modificado = 1;

	//Actualizar TLB
	if(TLBEnable) actualizarTLB(nroPagina, pidActivo, result.frameEntry->nroFrame);

	demorarSolicitud();
	enviarOKSinContenido(cpu_socket);

	deleteMessage(bufferMessage);

	log_trace(logger, "Enviada respuesta Ok! [Socket %d]", cpu_socket);
}