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