Por que as regiões mapeadas somente para leitura têm páginas sujas?

8

Executando (por exemplo) o seguinte comando para obter a lista de páginas mapeadas na memória:

pmap -x 'pidof bash'

Eu tenho esta saída: Porquealgumaspáginassomenteparaleiturasãomarcadascomo"sujas", ou seja, escritas que exigem um write-back? Se eles são somente leitura, o processo não deve ser capaz de escrever para eles ... (No exemplo fornecido, páginas sujas são sempre 4 kB, mas eu encontrei outros casos com valores diferentes)

Eu verifiquei também o / proc / pid / smaps e as páginas são descritas como "Private Dirty".

    
por RicoRico 02.11.2017 / 23:02

2 respostas

6

Uma página suja não requer necessariamente um write-back. Uma página suja é uma que foi escrita desde a última vez que o kernel a marcou como limpa. Os dados nem sempre precisam ser salvos no arquivo original.

As páginas são privadas, não compartilhadas, para que não sejam salvas no arquivo original. Seria impossível ter uma página suja apoiada por um arquivo somente leitura. Se a página precisar ser removida da RAM, ela será salva na troca.

As páginas que são somente leitura, privadas e sujas, mas dentro do intervalo de um arquivo mapeado por memória, geralmente são páginas de dados que contêm constantes que precisam ser inicializadas em tempo de execução, mas não são alteradas depois de terem sido inicializado. Por exemplo, eles podem conter dados estáticos que incorporam ponteiros; os valores de ponteiro dependem do endereço no qual o programa ou biblioteca é mapeado, portanto, ele deve ser calculado após o início do programa, com a página sendo lida / escrita nesse estágio. Depois que os ponteiros foram computados, o conteúdo da página nunca será alterado nessa instância do programa, portanto, a página pode ser alterada para somente leitura. Veja “Caçando páginas de memória suja” por stosb para um exemplo com fragmentos de código.

Você pode, mais raramente, ver páginas somente leitura, executáveis, privadas e sujas; isso acontece com alguns linkers que misturam código e dados mais livremente, ou com compilação just-in-time.

    
por 02.11.2017 / 23:54
2

Além dos casos Gilles lista:

Quando um processo se bifurca, o kernel pode marcar todas as suas páginas sujas como somente leitura, e elas serão compartilhadas entre o pai e o filho. Quando um dos processos gravar na página, ocorrerá uma exceção, e o kernel copiará a página e a marcará gravável. Isso economiza o trabalho de copiar páginas que, em última análise, não são modificadas novamente por nenhum dos processos. (Observe que, nessa situação, as páginas são marcadas como somente leitura no hardware, mas são conhecidas pelo kernel como graváveis.)

    
por 03.11.2017 / 13:46