Mapeamentos de bibliotecas compartilhadas em / proc / pid / maps

8

Por que /proc/pid/maps contém alguns registros para a mesma biblioteca? Aqui está um exemplo:

7fae7db9f000-7fae7dc8f000 r-xp 00000000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7dc8f000-7fae7de8f000 ---p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de8f000-7fae7de97000 r--p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de97000-7fae7de99000 rw-p 000f8000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20

O que isso significa?

    
por Irbis 29.08.2015 / 16:34

1 resposta

10

Os quatro registros têm permissões diferentes, portanto não podem ser mesclados.

  • A entrada r-xp descreve um bloco de memória executável ( x sinalizador de permissão). Esse é o código.
  • A entrada r--p descreve um bloco de memória que só é legível ( r sinalizador de permissão). São dados estáticos (constantes).
  • A entrada rw-p descreve um bloco de memória gravável ( w sinalizador de permissão). Isto é para variáveis globais da biblioteca.
  • A entrada ---p descreve uma parte do espaço de endereço que não possui permissões (ou qualquer memória mapeada para ele).

Todos são privados ( p flag), o que significa que, se um processo modifica uma página (que só é possível para a parte gravável), essa página será copiada (copy-on-write) e outros processos não serão copiados. veja qualquer mudança.

Essa última entrada é uma lacuna entre o segmento de código e o segmento de dados que é explicitamente inserido pelo vinculador GNU sob certas circunstâncias. O objetivo dessa lacuna é garantir que o código (compartilhável entre processos que usam a mesma biblioteca) e os dados graváveis (não compartilháveis) nunca estejam na mesma página. O tamanho do intervalo é de 2 MB, porque esse é o maior tamanho de página¹ que o Linux usa em sua arquitetura (amd64). Consulte Qual é a propósito de mapeamentos de memória aparentemente inutilizáveis no linux? para mais detalhes.

¹ A maioria das páginas é de 4kB, que é o tamanho de página "normal". Mas pode haver páginas que usem menos indireções de MMU, o que é um pouco mais rápido, mas desperdiça muito espaço, a menos que o aplicativo realmente use blocos de memória muito grandes. O Linux chama essas páginas enormes .

Fonte e mais informações para a lacuna não mapeada: Por que o painel do gnome usa 290MB? por RJK. Veja também a entrada para /proc/PID/maps na documentação do kernel do Linux , Noções básicas sobre Linux / proc / id / maps e / proc / $ pid / maps mostra páginas sem permissões de rwx no x86_64 linux Estouro de pilha.

    
por 29.08.2015 / 21:12