Como a CPU sabe qual endereço físico está mapeado para qual endereço virtual?

6

Baseado em meu entendimento, cada processo acessa a memória através de endereços virtuais e não endereços físicos, e é responsabilidade da CPU traduzir esses endereços virtuais para endereços físicos através da unidade MMU, e dois ou mais processos podem ter o mesmo endereço virtual.

Digamos que o Processo A esteja tentando acessar o endereço virtual 12345 e também o Processo B esteja tentando acessar o endereço virtual 12345 .

Como a MMU irá traduzir o endereço virtual de cada processo em um endereço físico, ele tem uma tabela de mapeamento para cada processo que mapeia endereços virtuais em endereços físicos (porque eu pensei que a CPU nem sabe o que é um processo? "é, e sua única responsabilidade é executar as instruções cegamente sem se importar com qual instrução pertence a qual processo, e um" processo "é apenas um conceito de OS)?

    
por user230989 12.05.2017 / 10:34

3 respostas

1

No Linux, o kernel mantém uma tabela de páginas de três níveis (independentemente dos recursos da CPU). O nível superior é o diretório global da página e cada processo tem seu próprio diretório, pgd em mm_struct . Assim, cada processo pode ter seus próprios mapeamentos, portanto, o endereço 12345 em diferentes processos aponta para diferentes endereços físicos.

As CPUs

não estão realmente cientes dos processos, mas tendem a ter recursos para suportá-los. Em CPUs do tipo x86, há vários recursos relacionados a tarefas, mas na verdade tendem a ser ignorados. Como o agendamento de processos é gerenciado pelo kernel, ele pode acompanhar as alterações da própria tabela de páginas e atualizar o estado da CPU necessário para alternar para a tabela de páginas de um novo processo ao alternar as tarefas. Em PCs x86, isso envolve a atualização do registro de controle CR3 que aponta para o diretório da página.

O capítulo Gerenciamento da tabela de páginas no Entendendo o Linux Virtual do Mel Gorman Gerenciador de memória livro dá uma boa visão geral.

    
por 12.05.2017 / 11:14
1

Cada processo em um sistema operacional tem uma estrutura de dados chamada PCB: link

PCB contém - juntamente com várias outras coisas - as informações da tabela de páginas, limites de memória, tabela de segmentos dependendo da memória usada pelo sistema operacional. Por favor note, PCB é uma estrutura de dados por processo, cada processo tem um.

Um endereço de memória virtual 12345 é dividido em page + offset - digamos, 123 é o número da página e 45 é compensado. Para cada processo, a tabela de páginas será consultada para encontrar a página equivalente (chamada frame) na memória física.

Mantendo os pontos acima, mesmo que os endereços virtuais sejam iguais, os endereços físicos serão diferentes.

Como pesquisar a tabela de páginas pode ser bastante lento quando se trata de traduzir cada página, a MMU mantém um cache para páginas recentemente traduzidas. Tradução chamada Look Aide Buffer (TLB): link

    
por 12.05.2017 / 11:20
1

A MMU acessa uma tabela que descreve como converter endereços virtuais em endereços físicos. (Não é necessário converter endereços físicos em endereços virtuais, e isso seria impossível em geral, já que o mesmo endereço físico pode ser acessado por meio de vários endereços virtuais ou pode ser desmapeado.) O layout dessa tabela depende da arquitetura da CPU, mas o princípio geral é sempre o mesmo: há um registro de CPU que contém o endereço físico de uma tabela, que contém os endereços físicos de outras tabelas, e assim por diante (para um total de 2 a 4 níveis em arquiteturas existentes) até um nível de tabelas que contém os endereços físicos onde os dados estão localizados. Em cada nível, qual elemento da tabela usar é determinado por alguns dos bits no endereço virtual.

A MMU não sabe sobre os processos do sistema operacional como tal. Quando a CPU muda para a execução de um processo diferente, ou seja, quando ocorre uma mudança de contexto , é o trabalho do contexto do sistema operacional comutando o código para atualizar as tabelas MMU conforme necessário. Na prática, acho que todos os sistemas Unix mantêm uma cópia das tabelas na memória para cada processo, e apenas atualizam o registro MMU para apontar para a tabela de nível superior para o processo atual.

Na verdade, existe uma parte da MMU que se preocupa com os processos do sistema operacional: o TLB . Pesquisar entradas na tabela MMU é bastante caro, pois envolve vários acessos à memória. O TLB é um cache dessas pesquisas. Em uma alternância de contexto, o sistema operacional deve invalidar o TLB (ou seja, remover todas as entradas de cache), pois o mapeamento será diferente para o novo processo. Muitas arquiteturas permitem que o SO coloque um indicador em cada entrada da tabela MMU para dizer “esta entrada pertence ao processo N”. Uma entrada TLB é então ignorada se o número do processo que ela contém não for o número do processo atual. Um registrador de CPU contém o número do processo atual e o código do comutador de contexto o atualiza. Esse mecanismo significa que o TLB pode conter informações sobre vários processos de uma só vez, o que melhora o desempenho ao alternar entre esses processos. Como geralmente há menos bits disponíveis para armazenar N do que o necessário para armazenar todos os IDs de processo do sistema operacional, N não é o ID do processo, mas um número gerado pelo SO para esse propósito e que muda com o tempo, se for usado.

    
por 14.05.2017 / 02:02