Por que as regiões mapeadas na memória somente 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 obtive esta saída: insira a descrição da imagem aqui Por que algumas páginas somente leitura são marcadas como "sujas", ou seja, escritas que requerem uma gravação de volta? Se forem somente leitura, o processo não poderá gravá-las ... (No exemplo fornecido, as páginas sujas são sempre de 4 kB, mas encontrei outros casos com valores diferentes)

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

RicoRico
fonte

Respostas:

7

Uma página suja não requer necessariamente uma devolução. Uma página suja é aquela que foi gravada 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 novamente 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 em troca.

As páginas que são somente leitura, privadas e sujas, mas dentro do intervalo de um arquivo mapeado na 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 após serem inicializadas. Por exemplo, eles podem conter dados estáticos que incorporam ponteiros; os valores do 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 de leitura e gravação nesta fase. Depois que os ponteiros forem calculados, o conteúdo da página nunca será alterado nesta instância do programa, portanto, a página poderá ser alterada para somente leitura. Veja “Caçando Páginas de Memória Suja” do stosb para um exemplo com fragmentos de código.

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

Gilles 'SO- parar de ser mau'
fonte
Não verifiquei, mas suspeito que você também pode obter páginas sujas privadas de somente leitura, executáveis ​​e com objetos compartilhados que não são da PIC. Eu me lembro que é a razão pela PIC objetos compartilhados têm praticamente tornou de facto necessário.
Andrew Henle
2

Além dos casos, Gilles lista:

Quando um processo 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 grava na página, uma exceção ocorre e o kernel copia a página e a marca como gravável. Isso economiza o trabalho de copiar páginas que, por fim, 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 gravador como kernel.)

Eric Postpischil
fonte