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!








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts