Mapeamentos de bibliotecas compartilhadas em / proc / pid / maps

8

Por que /proc/pid/mapsconté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 isto significa ?

Irbis
fonte

Respostas:

12

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

  • A r-xpentrada descreve um bloco de memória executável ( xsinalizador de permissão). Esse é o código.
  • A r--pentrada descreve um bloco de memória que é legível apenas ( rsinalizador de permissão). São dados estáticos (constantes).
  • A rw-pentrada descreve um bloco de memória que pode ser gravado ( wsinalizador de permissão). Isto é para variáveis ​​globais da biblioteca.
  • A ---pentrada descreve um pedaço do espaço de endereço que não tem nenhuma permissão (ou nenhuma memória mapeada para ele).

Todos são privados ( psinalizador), o que significa que, se um processo modificar uma página (o que é possível apenas para a parte gravável), essa página será copiada (copiar na gravação) e outros processos não verão nenhuma alteração.

Essa última entrada é uma lacuna entre o segmento de código e o segmento de dados que é inserido explicitamente 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 da diferença é de 2 MB, porque esse é o maior tamanho de página¹ que o Linux usa em sua arquitetura (amd64). Consulte Qual é o objetivo de mapeamentos de memória aparentemente inutilizáveis ​​no linux? para mais detalhes.

¹ A maioria das páginas tem 4kB, que é o tamanho da página "normal". Mas pode haver páginas que usem menos induções de MMU, o que é um pouco mais rápido, mas gasta 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 gnome-panel usa 290MB? por RJK. Consulte também a entrada /proc/PID/mapsna documentação do kernel do Linux , Entendendo o Linux / proc / id / maps e / proc / $ pid / maps mostra páginas sem permissões rwx no x86_64 linux no Stack Overflow.

Gilles 'SO- parar de ser mau'
fonte