Como dois endereços virtuais idênticos podem apontar para endereços físicos diferentes?

2

Após uma chamada fork () no Linux, dois processos (um sendo filho do outro) compartilharão a memória heap alocada. Essas páginas alocadas são marcadas como COW (copy-on-write) e permanecerão compartilhadas até que o processo as modifique. Nesse ponto, eles são copiados, mas os ponteiros de endereço virtual que fazem referência a eles permanecem os mesmos. Como a MMU (unidade de gerenciamento de memória) pode distinguir entre os dois? Considere o seguinte:

  1. O processo A é iniciado
  2. O processo A recebe uma página de memória, apontada pelo endereço virtual 0x1234
  3. Processo A fork () s, processo de desova B
  4. O processo A e B agora compartilham o endereço virtual 0x1234, apontando para o mesmo local de memória física
  5. O processo B modifica sua página de memória 0x1234
  6. Esta página de memória é copiada e, em seguida, modificada
  7. O processo A e B têm o endereço virtual 0x1234, mas isso aponta para endereços de memória física diferentes

Como isso pode ser distinguido?

    
por notlesh 06.10.2015 / 05:31

1 resposta

2

Uma das coisas que o kernel faz durante uma alternância de contexto entre processos é modificar as tabelas MMU para remover entradas que descrevem o espaço de endereço do processo anterior e adicionar entradas que descrevem o espaço de endereço do próximo processo. Dependendo da arquitetura do processador, do kernel e possivelmente da configuração, isso pode ser feito alterando um registro do processador ou manipulando as tabelas de páginas na memória.

Imediatamente após a operação fork, devido a copy-on-write, as tabelas MMU para ambos os processos têm o mesmo endereço físico para o endereço virtual 0x1234. Mais uma vez, essas são duas tabelas separadas, que possuem entradas idênticas para esse endereço virtual específico.

O descritor para esta página tem o atributo somente leitura. Se um processo tentar gravar (não importa se é A ou B), isso acionará uma falha do processador devido à violação da permissão. O manipulador de falhas de página do kernel é executado, analisa a situação e decide alocar uma nova página física, copia o conteúdo da página somente leitura para essa nova página, altera a configuração de MMU do processo de chamada para que 0x1234 agora aponte para essa física recém-alocada página com atributos de leitura / gravação e reinicia o processo de chamada na instrução que causou a falha. Desta vez, a página é gravável para que a instrução não seja capturada.

Observe que o descritor de página no outro processo não é afetado por essa operação. De fato, pode ser, porque o kernel executa mais uma ação: se a página agora está apenas mapeada em um único processo, ela volta para read-write, para evitar ter que copiá-la depois.

Veja também O que acontece após uma falha de página?

    
por 07.10.2015 / 05:11