Simulador de página virtual

1. Simulador de página virtual

Rafaela Bennett
rafaelabl

(usa Ubuntu)

Enviado em 27/06/2016 - 22:52h

Oi gente

Estou implementando um simulador de página virtual, é o meu trab final de sist operacionais.

Se alguém puder me ajudar, minha duvida é: como mapear o endereço virtual (em memoria virtual) no endereço real (em memoria principal)? Qual é o cálculo ? Quais são as variáveis?

Meu código está assim:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <string.h>
#include <pthread.h>

#include <time.h>

void movreg() {
printf("MOV REG, 32780\n"); // instrução de acesso
sleep(rand()%10); //tempo de geração do registro de acesso fictício
printf("Page is unmapped – page fault!\n"); // resposta fictícia
}
void mmu(){
int[] tabeladepaginas;
int[] mapeamentoentrepaginaseframes;

boolean gerouinstrucao;
String res;
int resultado;

if (gerouinstrucao = true) {
// MAPEAR ENDEREÇO VIRTUAL (EM MEMORIA VIRTUAL) NO ENDEREÇO REAL (EM MEMÓRIA PRINCIPAL).
resultado = memoriavirtual/memoriaprincipal;
res = ("Resultado do mapeamento de endereço virtual em memória virtual no endereço real em memória principal = %d", resultado);
return res;
}

// Mantém o mapeamento entre páginas e frames.
// Quando processador gera uma instrução:
// MMU mapeia o endereço virtual (em memória virtual) no endereço real (em memória principal).
// Uma nova instrução é gerada e deverá ser mostrada na saída padrão.
// A MMU pode realizar duas tarefas que, ao final, resultam na apresentação do conteúdo do processo (arquivo) contido no endereço gerado:
// 1 - Se o novo endereço (real) gerado pela MMU estiver em memória principal, é mostrado o conteúdo do processo (arquivo) contido neste endereço;
// 2 - Se o novo endereço (real) gerado pela MMU não estiver em memória principal, a MMU emite (na saída padrão) uma falta de página.
// Em caso de falta de página o processo de carregamento da página pode ocorrer de duas formas:
// Se existem frames disponíveis : o bloco de dados do arquivo correspondente ao frame é copiado para a memória principal no primeiro frame disponível e a tabela de páginas é atualizada
// Se não existem frames disponíveis, deve ser escolhido uma página a ser substituída. Este processo de escolha de qual página deve ser substituída deve-se dar através do algoritmo aging.
}

void main() {
int memoriaprincipal = 64;
int memoriavirtual = 1024;
int paginas = 8;
int frames = 8;

int processorepresentadoporumarquivodedados = 512;


sleep(rand()%10);
movreg();
mmu();

}



  


2. Re: Simulador de página virtual

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/06/2016 - 12:20h

Quando você receber uma resposta, não apague o post original (e todo o tópico, por tabela) como fez em outras oportunidades (aliás, não sei se é possível, mas se você tiver como restaurar o que apagou, seria bom para todos numa comunidade como esta, cujo objetivo é de compartilhamento de conhecimento).

Até o momento, seu programa não faz muita coisa para simular paginação. Que ele faça mesmo, só uma impressões (printf()) e pausas (sleep()), e nenhuma delas parece relacionada ao seu trabalho.

Aliás, a própria sintaxe do pouco que você escreveu nem mesmo parece ser C (por exemplo: declaração na forma “int[] variavel;” ou void como tipo de retorno de main()).

Você precisa implementar mais efetivamente a paginação. Toda a lógica, com as respectivas estruturas de dados, que faça o mapeamento de endereços virtuais em reais está faltando, bem como toda a lógica de interpretação de instruções que provoquem a paginação.

Sem essas coisas, não dá nem para começar a tentar ajudá-la. Há tantas coisas em aberto que qualquer coisa que pudéssemos sugerir pode ir numa direção diferente do enunciado original do seu exercício.


3. Re: Simulador de página virtual

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 28/06/2016 - 15:55h

Pelo que eu entendi ai, eu acho que uma maneira mais fácil de implementar essa MMU seria utilizando array e arquivo.
Se você tiver um conhecimento mais avançado pode fazer com alocação dinâmica ex. malloc*

Exemplo: Você gera um array de dez elementos, depois você percorrer esse array com ponteiro guardando a posição de cada célula dele com o seu respectivo conteúdo e salvando num arquivo.

Ex.:

0x191 = valor-1
0x192 = valor-2
0x193 = valor-3

Na hora de fazer leitura, você poderia usaria o endereço de memória do array como índices.

Quando um índice não foi encontrado vai ocorrer a falha de paginção "page faults" e quando ele for encontrado, por exemplo, o endereço 0x192 é exibido na tela o 'valor-2'.

Essa é forma mais simples que eu pensei para esse problema.
Espero que te ajude, boa sorte!